출처:https://wikidocs.net/231156
1-2-1. 기본 LLM 체인 (Prompt + LLM)
기본 LLM 체인(Prompt + LLM)은 LLM 기반 애플리케이션 개발에서 핵심적인 개념 중 하나입니다. 이러한 체인은 사용자의 입력(프롬프트)을 받아 LLM을 통해 적절한 …
wikidocs.net
1. 기본 LLM 체인
기본 LLM 체인이란 사용자의 프롬프트를 받아 LLM을 통해 응답을 생성하는 구조.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# prompt + model + output parser
prompt = ChatPromptTemplate.from_template("You are an expert in astronomy. Answer the question. <Question>: {input}")
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
output_parser = StrOutputParser()
# LCEL chaining
chain = prompt | llm | output_parser
# chain 호출
chain.invoke({"input": "지구의 자전 주기는?"})
<출력>
지구의 자전 주기는 약 24시간입니다. 이것은 하루 동안 지구가 자전하는 시간을 의미합니다. 지구는 자전하면서 자전축 주위를 돌며 하루가 지나가는 것처럼 보이게 됩니다.
StrOutputParser()는 모델의 출력을 문자열 형태로 파싱하는 것
2. 멀티 LLM 체인
여러 개의 체인을 복합적으로 작용하는 것.
prompt1 = ChatPromptTemplate.from_template("translates {korean_word} to English.")
prompt2 = ChatPromptTemplate.from_template(
"explain {english_word} using oxford dictionary to me in Korean."
)
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
chain1 = prompt1 | llm | StrOutputParser()
# chain1.invoke({"korean_word":"미래"})
chain2 = (
{"english_word": chain1}
| prompt2
| llm
| StrOutputParser()
)
chain2.invoke({"korean_word":"미래"})
미래란 무엇입니까?
미래란 앞으로 오는 시간이나 날이다. 미래는 아직 일어나지 않은 일들이나 상황을 나타낸다. 예를 들어, 내일이나 다음 주에 일어날 일들은 미래에 속한다. 미래는 예측하거나 예상할 수 있는 것이 아니기 때문에 불확실하고 불투명한 측면이 있다.하지만 우리는 미래를 준비하고 계획하기 위해 노력하고 예측하려고 노력한다.미래는 우리의 선택과 행동에 따라 변화할 수 있으며, 우리의 노력과 노력에 따라 좋은 결과를 가져올 수도 있다.미래는 우리가 살아가는 현재와 연결되어 있으며, 우리의 행동과 선택이 미래를 결정하는 요소가 될 수 있다.
랭체인 : |를 사용하여 연결하는 것
3. 프롬프트 템플릿
- 챗 프롬프트 템플릿 (ChatPromptTemplate)
대화형 상황에서 여러 메시지 입력을 기반으로 단일 메시지 응답을 생성하는데 사용.
챗봇 개발에 주로 사용
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
chat_prompt = ChatPromptTemplate.from_messages([
("system", "이 시스템은 천문학 질문에 답변할 수 있습니다."),
("user", "{user_input}").
])
messages = chat_prompt.format_messages(user_input="태양계에서 가장 큰 행성은 무엇인가요?")
#message
#출력
# [SystemMessage(content='이 시스템은 천문학 질문에 답변할 수 있습니다.'),
# HumanMessage(content='태양계에서 가장 큰 행성은 무엇인가요?')]
chain = chat_prompt | llm | StrOutputParwer()
chain.invoke({"user_input": "태양계에서 가장 큰 행성은 무엇인가요?"})
태양계에서 가장 큰 행성은 목성입니다. 목성은 태양계에서 가장 많은 질량을 가지고 있으며, 지름도 가장 큽니다.
4. Langchain의 언어 모델
LLM vs Chat model
- LLM (Large Language Model)
랭체인에서 LLM은 핵심 구성요소로, 다양한 LLM 제공 업체와의 상호작용을 위한 표전 인터페이스 제공.
OpenAI, Cohere, Hugging Face 등과 같은 다양한 LLM 제공 업체로부터 모델을 사용할 수 있게 하는 플랫폼 역할을 한다는 것을 의미.
- Chat Model
랭체인의 중요한 구성요소로, 대화형 메시지를 입력으로 사용하고 대화형 메세지를 출력으로 반환하는 특수화된 LLM모델임.
이는 일반 텍스트를 사용하는 대신 대화의 맥락을 포함한 메시지를 처리하며, 이를 통해 보다 더 자연스러운 대화를 가능하게 함.
5. Langchain의 LLM 모델 파라미터 설정
- Temperature: 생성된 텍스트의 다양성을 조정합니다. 값이 작으면 예측 가능하고 일관된 출력을 생성하는 반면, 값이 크면 다양하고 예측하기 어려운 출력을 생성합니다.
- Max Tokens (최대 토큰 수): 생성할 최대 토큰 수를 지정합니다. 생성할 텍스트의 길이를 제한합니다.
- Top P (Top Probability): 생성 과정에서 특정 확률 분포 내에서 상위 P% 토큰만을 고려하는 방식입니다. 이는 출력의 다양성을 조정하는 데 도움이 됩니다.
- Frequency Penalty (빈도 패널티): 값이 클수록 이미 등장한 단어나 구절이 다시 등장할 확률을 감소시킵니다. 이를 통해 반복을 줄이고 텍스트의 다양성을 증가시킬 수 있습니다. (0~1)
- Presence Penalty (존재 패널티): 텍스트 내에서 단어의 존재 유무에 따라 그 단어의 선택 확률을 조정합니다. 값이 클수록 아직 텍스트에 등장하지 않은 새로운 단어의 사용이 장려됩니다. (0~1)
- Stop Sequences (정지 시퀀스): 특정 단어나 구절이 등장할 경우 생성을 멈추도록 설정합니다. 이는 출력을 특정 포인트에서 종료하고자 할 때 사용됩니다.