Langchain

이승준·2024년 10월 17일

Language Models

목록 보기
2/3

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

# model 선언
llm = ChatOpenAI(temperature=1.0, max_tokens=2048, model_name="gpt-4o-mini")

# template 을 기반으로 prompt 생성
template = "배우 {actor}이(가) {year}년도에 출연한 {content}를 나열해줘"
prompt = PromptTemplate.from_template(template=template)

# prompt 와 model 을 연결한 chain 객체 생성
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)

>>> 오늘, 1017일에 생일인 유명인 세 명은 다음과 같습니다:
데이비드 브라운, 버지니아 울프, 미셸 오바마

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: 손흥민은 대한민국의 프로 축구 선수로, 주로 공격수로 활동하고 있습니다.
profile
인하대학교 컴퓨터공학과

0개의 댓글