랭체인 프로그래밍: 개념과 응용 – 005
0 Comment
스트림 지원하는 챗봇 구현(기본 대화 기능만 포함)
- 대화 기능이 가능한 기본 챗봇을 chatbot 함수 작성합니다. chatbot 함수는 궁극은 랭체인 체인이 되어야 합니다.
-
@chain
def chatbot:
- 대화 참여자 역할을 지정하는 프롬프트 템플릿이 필요합니다. 대화를 담는 프롬프트 템플릿이 필요 합니다.
- ChatPromptTemplate
- from langchain.prompts import ChatPromptTemplate
- system 메시지는 “You are a helpful assistant.”로 하고, human 메시지는 question 변수로 사용자 입력을 받도록 합니다.
- template = ChatPromptTemplate.from_messages([(“system”, “You are a helpful assistant.”), (“human”, “{question}”),])
- ChatPromptTemplate
- 변수 값으로 하나만 question 값 하나만 받으면 되지만, 여러 변수 값을 받을 수 매개변수를 작성합니다.
- 인자로 받은 값들은 ChatPromptTemplate 객체의 invoke 함수의 인자로 사용되어야 하기 때문에 Dictionary 여야 합니다.
- def chatbot(values):
- 모델 클라이언트는 프롬프트 템플릿으로 부터 구체화된 template을 입력으로 받아 stream 방식으로 응답합니다. stream 방식으로 리턴되는 토큰을 리턴합니다.
-
12for token in model.stream(prompt):yield token
-
-
@chain
@chain 은 LangChain에서 사용되는 데코레이터(decorator)로, 함수를 LangChain의 체인(chain)으로 변환하는 역할을 합니다. 체인이란 여러 구성 요소(LLM, 프롬프트, 출력 파서 등)들을 순차적으로 연결하여 복잡한 작업을 수행하는 LangChain의 핵심 개념입니다.
예를 들어, 다음과 같이
이 예제에서 |
question을 “생성형 인공지능?” 하고 스트리밍 방식으로 응답을 출력하도록 하는 전체 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from langchain_openai.chat_models import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain_core.runnables import chain template = ChatPromptTemplate.from_messages([("system", "You are a helpful assistant."), ("human", "{question}"),]) OpenAIAPIKey = "[OpenAI API Key]" model = ChatOpenAI(model="gpt-4o-mini", openai_api_key=OpenAIAPIKey, streaming=True) template = ChatPromptTemplate.from_messages( [ ("system", "You are a helpful assistant."), ("human", "{question}"), ] ) @chain def chatbot(values): prompt = template.invoke(values) for token in model.stream(prompt): yield token for part in chatbot.stream({"question": "생성형 인공지능?"}): print(part.content) |
LCEL을 사용해 챗봇 구현
- 프롬프트 템플릿과 모델 클라이언트 구성요소가 있고 이 둘을 순차적으로 실행하는 체인을 만듭니다. 구성요소의 순차적 실행을 표현하기 위해 “|“를 사용합니다.
- chatbot = template | model
1 2 3 4 5 6 7 8 9 10 11 12 |
from langchain_openai.chat_models import ChatOpenAI from langchain.prompts import ChatPromptTemplate OpenAIAPIKey = "[OpenAI API Key]" model = ChatOpenAI(model="gpt-4o-mini", openai_api_key=OpenAIAPIKey, streaming=True) template = ChatPromptTemplate.from_messages( [ ("system", "You are a helpful assistant."), ("human", "{question}"), ] ) chatbot = template | model for part in chatbot.stream({"question": "생성형 인공지능?" }): print(part.content) |