Langchain
- 여러 LLM 들을 손쉽게 교체하거나 혼합하여 사용할 수 있도록 돕는 framework
- Langchain 이 제공하는 기능들의 일부를 살펴보자
- Model I/O: 프롬프트 준비, 언어 모델 호출, 결과 수신
- Retrieval: 외부 지식을 LLM에 주입. ChatPDF, CSV 파일 기반 답변
- Memory: 과거의 대화를 장/단기로 기억. 이전 문맥을 고려한 답변.
- Chains: 여러 모듈을 통합하는 기능. 단독 사용 용도 X
- Agents: ReAct나 Function Calling 기법을 사용해 외부와 상호 작용.
- Callbacks: 다양한 이벤트 발생을 처리 가능. 단독 사용 용도 X
Prompt
- LLM 이 수행할 task 와 그것을 수행할 방법 등을 명시한 명령어
- prompt 는 template 문자열을 기반으로 생성된다.
- OpenAI 의 대화형 모델 ChatOpenAI 에게 간단한 prompt 를 전달해보자
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
llm = ChatOpenAI(temperature=1.0, max_tokens=2048, model_name="gpt-4o-mini")
template = "배우 {actor}이(가) {year}년도에 출연한 {content}를 나열해줘"
prompt = PromptTemplate.from_template(template=template)
llm_chain = prompt | llm
response = llm_chain.invoke({"actor": "황정민", "year": "2020", "content": "영화"}).content
print(response)
>>> 배우 황정민은 2020년에 영화 "다만 악에서 구하소서"에 출연했습니다.
Prompt 에 함수 전달하기
- LLM 은 학습을 한 이후의 시점에 대한 정보는 알고 있지 않다.
- 그렇다면, "오늘의 날짜를 알려줘" 같은 질문에는 어떻게 대답하는걸까?
- 오늘의 날짜를 계산하는 함수값을 partial variable 로 전달해주면 된다.
from datetime import datetime
def get_date():
"""
returns: current date in str
"""
now = datetime.now()
return now.strftime("%B %d")
prompt = PromptTemplate(
template="오늘 날짜는 {date}입니다. 오늘이 생일인 유명인 {num_celebs}명을 나열해주세요.",
input_variables=["num_celebs"],
partial_variables={"date": get_date}
)
llm_chain = prompt | llm
response = llm_chain.invoke({"num_celebs": 3}).content
print(response)
>>> 오늘, 10월 17일에 생일인 유명인 세 명은 다음과 같습니다:
데이비드 브라운, 버지니아 울프, 미셸 오바마
Memory
- 대화의 구성 요소 중 이전 대화에 있는 정보를 참조하고 기억할 수 있는 능력
- 위 정보는 ChatMessageHistory 객체를 통해 저장하고 불러올 수 있다.
- 대화 기록의 실행 및 관리는 RunnableWithMessageHistory 클래스를 통해 가능하다
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
llm = ChatOpenAI(temperature=1.0, max_tokens=2048, model_name="gpt-4o-mini")
template = """당신은 친절한 챗봇입니다. 누가 당신에게 누구냐고 묻거든 친절한 챗봇이라고 대답하세요.
그 외의 답변은 최선을 다해서 친절하게 답변하세요.
Current Conversation: {history}
Human: {input}
AI:"""
prompt = PromptTemplate(template=template, input_variables=["history", "input"])
llm_chain = prompt | llm
store = {}
session_id = "test"
if session_id not in store:
store[session_id] = ChatMessageHistory()
session_history = store[session_id]
with_message_history = RunnableWithMessageHistory(
llm_chain,
lambda session_id: session_history,
input_messages_key="input",
history_messages_key="history",
)
with_message_history.invoke(
{"input": "당신은 누구입니까?"}, config={"configurable": {"session_id": "test"}}
)
result = with_message_history.invoke(
{"input": "손흥민은 누구입니까?"}, config={"configurable": {"session_id": "test"}}
)
print(result.content)
print(session_history)
>>> 손흥민은 대한민국의 프로 축구 선수로, 주로 공격수로 활동하고 있습니다.
>>> Human: 당신은 누구입니까?
AI: 저는 친절한 챗봇입니다! 어떻게 도와드릴까요?
Human: 손흥민은 누구입니까?
AI: 손흥민은 대한민국의 프로 축구 선수로, 주로 공격수로 활동하고 있습니다.