langchain / / 2024. 6. 5. 15:03

[langchain] 모델 (model)

ChatOpenAI

ChatOpenAI는 OpenAI 사의 Large Language Model 입니다.

기본적인 사용방법은 아래와 같다.

from dotenv import load_dotenv
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

load_dotenv()

llm = ChatOpenAI()
template = "{country}에서 야구선수 중 역사상 가장 뛰어난 사람 1명만 말한다면?"

prompt = PromptTemplate.from_template(template=template)
chain = LLMChain(prompt=prompt, llm=llm)

result = chain.invoke({"country", "한국"})
print(result)

결과출력

{'country': {'country', '한국'}, 'text': '이천수 선수입니다.'}

결과가 엉뚱하게 나오긴 하지만 기본적인 ChatGPT를 호출하고 응답을 받는다.

여기서 ChatOpenAI에 파라미터를 추가할 수 있는데 아래와 같다.

  • temperature
    • 사용할 샘플링 온도이며 0부터 2사이의 값을 선택할 수 있다. 숫자가 높을수록 답변에 창의성이 부여되어 사실과 맞지 않은 답변이 나올 가능성이 높다.
  • max_tokens
    • 채팅 completion(응답결과)에서 생성할 토큰의 최대 개수이다. 이 길이만큼만 짤려서 온다.
  • model_name

파라미터를 추가하여 호출하려면 아래와 같이 llm을 생성하여 사용할 수 있다.

llm = ChatOpenAI(
    temperature=0,  # 창의성 (0.0 ~ 2.0)
    max_tokens=1024,  # 최대 토큰수
    model_name="gpt-4o",  # 모델명
)

Google AI

Google AI의 gemini와 gemini-vision 모델뿐만 아니라 다른 생성 모델에 접근하려면 langchain-google-genai 통합 패키지의 ChatGoogleGenerativeAI 클래스를 사용하면 됩니다.

사용하려면 우선 API를 발급받자. (링크: https://aistudio.google.com/app/apikey?hl=ko)

발급받은 api를 .env 에 추가하자.

GOOGLE_API_KEY=[발급받은 api 키]

그리고 langchain-google-genai pillow 패키지를 설치하자.

pipenv install langchain-google-genai pillow

사용방법은 간단하다.

from dotenv import load_dotenv
from langchain_google_genai import ChatGoogleGenerativeAI

load_dotenv()

llm = ChatGoogleGenerativeAI(model="gemini-pro")

result = llm.invoke("한국 야구 선수 중 역사상 가장 뛰어난 사람 1명만 뽑는다면?")
print(result.content)

실행결과

류현진

Stream 처리, 멀티모달 내용 추가 필요

Caching

LLM 애플리케이션을 개발하는 과정에서는 개발 및 테스트 단계에서 동일한 프롬프트를 반복적으로 호출해야 하는 상황이 종종 발생한다. 개발 도중 에러가 발생하거나 테스트 결과를 확인할 때, 동일한 모델을 사용하여 동일한 프롬프트를 계속 호출하게 된다. 이러한 경우 결과값이 거의 유사하기 때문에 반복적으로 같은 질문을 호출하는 것은 비용 면에서 비효율적이다. 동일한 프롬프트라면 결과 값을 캐싱하여 개발에 활용해도 큰 문제가 없다. Langchain은 동일하거나 유사한 프롬프트에 대해 결과를 캐싱하여 API 호출 횟수를 줄일 수 있는 기능을 제공한다.

동일한 llm을 2번 연속 호출하여 사용되는 토큰을 확인해보자.

llm = ChatOpenAI()

with get_openai_callback() as callback:
    question = "서초역 맛집을 100글자 내로 추천해줘"
    print("첫 번째 호출")
    result = llm.invoke(question)
    print("Total Tokens:", callback.total_tokens)

with get_openai_callback() as callback:
    question = "서초역 맛집을 100글자 내로 추천해줘"
    print("두 번째 호출")
    result = llm.invoke(question)
    print("Total Tokens:", callback.total_tokens)

사용되는 토큰은 아래와 같다.

첫 번째 호출
Total Tokens: 250
두 번째 호출
Total Tokens: 229

전체 253 token이 사용되었다. 동일한 prompt로 요청했고 응답을 받았지만, 동일한 토큰이 2번 연속 사용된 것을 확인할 수 있다.

동일한 프롬프트를 사용했지만 두 번 모두 token이 사용된 것을 확인할 수 있다.

메모리 캐싱

우선 메모리에 캐싱하는 방법이다. 사용하는 방법은 간단하다. set_llm_cache(InMemoryCache()) 를 추가하면 된다.

llm = ChatOpenAI()
set_llm_cache(InMemoryCache()) # 추가

with get_openai_callback() as callback:
    question = "서초역 맛집을 100글자 내로 추천해줘"
    print("첫 번째 호출")
    result = llm.invoke(question)
    print("Total Tokens:", callback.total_tokens)

with get_openai_callback() as callback:
    question = "서초역 맛집을 100글자 내로 추천해줘"
    print("두 번째 호출")
    result = llm.invoke(question)
    print("Total Tokens:", callback.total_tokens)

실행결과

첫 번째 호출
Total Tokens: 214
두 번째 호출
Total Tokens: 0

첫 번째 호출에는 214 토큰이 사용되었지만 두 번째 호출에는 0 토큰이 사용된 것을 확인할 수 있다.

with get_openai_callback() as callback: 

이 구문은 OpenAI 콜백을 사용하기 위한 것이며 이 콜백은 OpenAI의 API 호출에 대한 정보를 추적한다.

SQLite cache

SQLite를 이용해 캐싱하는 방법이다.

llm = ChatOpenAI()
set_llm_cache(SQLiteCache(database_path="llm_cache.db"))

with get_openai_callback() as callback:
    question = "서초역 맛집을 100글자 내로 추천해줘"
    print("첫 번째 호출")
    result = llm.invoke(question)
    # print(result)
    print("Total Tokens:", callback.total_tokens)

with get_openai_callback() as callback:
    question = "서초역 맛집을 100글자 내로 추천해줘"
    print("두 번째 호출")
    result = llm.invoke(question)
    # print(result)
    print("Total Tokens:", callback.total_tokens)

실행결과

첫 번째 호출
Total Tokens: 214
두 번째 호출
Total Tokens: 0

첫 번째 호출한 정보가 sqlite에 저장이 되고 두 번째 호출 시에는 sqlite에 있는 정보를 사용하므로 실제 사용된 토큰이 0이다.

여기서 한번 더 호출해보면 두번 다 0으로 나오는 것을 확인할 수 있다.

한번 더 호출한 실행결과

첫 번째 호출
Total Tokens: 0
두 번째 호출
Total Tokens: 0

그 외 Cache

Redis Cache

from langchain.cache import RedisCache
from redis import Redis

set_llm_cache(RedisCache(redis_=Redis()))

SQLAlchemy Cache

# from langchain.cache import SQLAlchemyCache
# from sqlalchemy import create_engine

engine = create_engine("postgresql://postgres:postgres@localhost:5432/postgres")
set_llm_cache(SQLAlchemyCache(engine))

Elasticsearch Cache

from elasticsearch import Elasticsearch
from langchain.globals import set_llm_cache
from langchain_elasticsearch import ElasticsearchCache

es_client = Elasticsearch(hosts="http://localhost:9200")
set_llm_cache(
    ElasticsearchCache(
        es_connection=es_client,
        index_name="llm-chat-cache",
        metadata={"project": "my_chatgpt_project"},
    )
)

참고

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유