@senspond
>
이번 글은 랭체인(LangChain)이 무엇인지 간단하게 정리해보고 OpenAI의 GPT 모델을 사용하여 LangChain을 시작하는 방법을 정리해보겠습니다.
이번 글은 랭체인(LangChain)이 무엇인지 간단하게 정리해보고 OpenAI의 GPT 모델을 사용하여 LangChain을 시작하는 방법을 정리해보겠습니다.
LLM을 원동력으로 하는 애플리케이션을 구축하기 위해서는 당연하게도 단순 언어 모델 개발 이상의 작업이 요구됩니다. 특히 언어 모델을 활용한 서비스 개발 시 가장 까다로운 부분은 언어 모델과 여러 기능 간의 연결이라고 할 수 있는데, 랭체인(LangChain)은 이러한 통합을 간소화하도록 설계된 일종의 SDK(Software Development Kit)이자 다양한 언어 모델을 기반으로 하는 애플리케이션 개발을 위한 파이썬기반의 프레임워크 입니다
한마디로 요약하자면 LLM을 효과적으로 다루기 위한 파이썬 언어로 만들어진 프레임워크
랭체인 공식사이트 도큐먼트 : https://python.langchain.com/docs/get_started/introduction
LangChain provides standard, extendable interfaces and external integrations for the following main modules:
Interface with language models
모델 I/O는 프롬프트를 관리하고 공통 인터페이스를 통해 언어 모델을 호출하고 모델 출력에서 정보를 추출할 수 있게 해줍니다.
Interface with application-specific data
데이터 연결(Retrieval)은 데이터를 로드, 변형, 저장 및 쿼리하기 위한 빌딩 블록을 제공합니다
Let chains choose which tools to use given high-level directives
상위 지시문이 주어지면 체인이 사용할 툴을 선택할 수 있도록 합니다. 현재는 조금 실험적인 기술.
Common, building block compositions
일반적인 빌딩 블록 구성합니다. 복잡한 애플리케이션은 LLM을 상호, 또는 다른 구성요소와 체인으로 연결해야 합니다. 랭체인은 이러한 “체인으로 연결된” 애플리케이션을 위한 체인 인터페이스를 제공합니다.
Persist application state between runs of a chain
체인 실행 간에 애플리케이션 상태 유지를 하기 위한 메모리를 지원합니다.
실행 결과를 메모리에 저장해놓고 재사용 가능.
Log and stream intermediate steps of any chain
체인의 어느단계에서 로그 및 스트림을 응답해주도록 해줌으로써, 어떤 과정으로 진행되고 있는지 알 수 있도록 지원됩니다.
랭체인은 OpenAI 에서 제공하는 GPT 모델 뿐만 아니라 다양한 LLM 모델을 사용할 수 있습니다. 여기서는 openai로 시작해봅니다.
https://openai.com/ 에서 신용카드를 등록하고 API keys를 발급받습니다.
사용량에 따라 사용료가 부과될 수 있습니다.
스터디를 위해서는 머니투자가 필요.
일일 한도 사용량을 지정할 수 있는데, 혹시나 API_KEY 해킹으로 인한 피해등을 막기 위해 반드시 한도량 설정을 해놓기를 권장합니다.
pip install python-dotenv
pip install langchain
pip install openai
.env 파일에 OPENAI_API_KEY=[openai API key] 를 작성합니다.
github에 올릴때는 이 파일이 절대로 올라가지 않도록 .gitignore에 잘 등록해줍니다.
# .env 파일에서 가져옴
from dotenv import load_dotenv
load_dotenv()
파이썬에서는 python-dotenv 를 통해 .env 파일에 작성한 환경변수를 읽어올 수 있습니다.
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
llm = OpenAI()
chat = ChatOpenAI()
기본적으로 OpenAI 클래스는 gpt3 text davinchi 모델을 사용하도록 정의되어 있고 ChatOpenAI 클래스는 gpt3.5 turbo 모델을 사용하도록 설정되어있습니다.
기본적으로 predict 메소드를 통해 LLM 모델에 프롬프트를 전달하여 응답을 받아올 수 있습니다.
그런데 동일한 질문에 대해 text-davinci-003 과 Gpt 3.5 turbo 는 조금 다른 답변을 내놓았네요.
정확하게는 서울에서 부산까지 고속도로 운행 정보는 431.5Km이며, 비행기로 가면 약 399Km, 지도상에서 직선 거리는 314Km 라고 합니다. 아무튼
predict_messages 를 통해 시스템 메시지를 넣어 좀더 세부적인 프롬프트를 작성 할 수 있는데, 시스템 메시지는 AI 대화 스크립트의 단계 지시와 같습니다. AI의 동작을 설정하기 위한 초기 지침을 제공합니다. 효과적으로 사용하면 모델 응답의 맥락과 어조에 큰 영향을 미쳐 더 나은 결과를 얻을 수 있습니다.
BaseMessage 를 상속받아 구현된 구현체들은 크게 3가지 형태로 구분할 수 있습니다.
- SystemMessage : AI에게 해야 할 일을 알려주는 배경 컨텍스트
- HumanMessage : 사용자 메세지
- AIMessage : AI가 응답한 내용을 보여주는 상세 메세지
그외 FunctionMessage 등 다른 형태의 Message 도 있기는 합니다.
반복되는 프롬프트 양식을 템플릿으로 만들어 변수값만 변경해줌으로써 프롬프트 재사용성을 용이하게 만들어 줄 수가 있습니다.
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
llms = OpenAI(temperature=0.1)
template = PromptTemplate.from_template("What is distance between {contry_a} and {contry_b} ? ")
prompt = template.format(contry_a = "Busan", contry_b = "Seoul")
print(prompt)
response = llms.predict(prompt)
print(response)
contry_a 와 contry_b 가 변수로 들어가는 프롬프트 템플릿을 정의했고 해당 템플릿을 사용해 만들어진 프롬프트로 predict 하는 간단한 예제입니다.
PromptTemplate은 기본적으로 문장 완성 모델(Completion model: llms)을 위한 템플릿입니다. 챗모델(Chat completion model: chat_models)을 위한 템플릿은 ChatPromptTemplate입니다.
그런데 실제로 사용할때는 구분없이 chat 모델에 PromptTemplate 을 사용해도 오류는 나지 않습니다. 공식문서에 따르면 모델형태에 따라 보다 적합한 형태로 표현해준다고 되어있습니다.
chat = ChatOpenAI(
temperature=0.1
)
template = ChatPromptTemplate.from_messages([
("system", "You are grahpiy expert. And You reply in {language}. If ask for a name, tell me rgbitcode bot"),
("human", "What is distance between {contry_a} and {contry_b}. Also What your name ?")
])
prompt = template.format_messages(
language = "korean",
contry_a="Seoul",
contry_b="Busan"
)
print(prompt)
response = chat.predict_messages(prompt)
print(response)
안녕하세요. Red, Green, Blue 가 만나 새로운 세상을 만들어 나가겠다는 이상을 가진 개발자의 개인공간입니다.
현재글에서 작성자가 발행한 같은 카테고리내 이전, 다음 글들을 보여줍니다
@senspond
>