ํจ์์ ๋ฉ์๋ ์ฐจ์ด
- ํจ์๋ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ฉฐ ํน์ ์์ ์ ์ํํ๋ ์ฝ๋ ๋ธ๋ก์ด๋ค.
- ๋ฉ์๋๋ ๊ฐ์ฒด์ ์ํ ํจ์๋ก, ํน์ ๊ฐ์ฒด์ ์ํ๋ ๋์๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ์ํํ๋ค.
- ์ฆ, ๋ฉ์๋๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ํด๋์ค๋ ๊ฐ์ฒด์ ์ฐ๊ด๋ ํจ์๋ผ๋ ์ ์์ ๊ตฌ๋ถ๋๋ค.
๋ญ์ฒด์ธ
LangChain์์ ์ฒด์ธ ๊ตฌ์ฑ ์๋ฏธ
- ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ์ด์ด์ฃผ์ด ํ๋์ ์ฒด์ธ์ผ๋ก ๋ง๋๋ ๊ตฌ์กฐ
- chain = prompt_template | llm | parser ๋ LangChain ๊ตฌ์ฑ ์์๋ฅผ ํ์ดํ๋ผ์ธ์ผ๋ก ์ฐ๊ฒฐํ ๊ฒ
- ์ ๋ ฅ์ด prompt_template์์ ์์ฑ๋์ด llm์ผ๋ก ์ ๋ฌ๋๊ณ , ์ถ๋ ฅ์ด parser์ ์ํด ๊ฐ๊ณต๋์ด ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์ฒ๋ฆฌ ๊ณผ์
- ํ์ดํ ์ฐ์ฐ์ `|`๋ ํ๋์ ์ปดํฌ๋ํธ ์ถ๋ ฅ์ ๋ค์ ์ปดํฌ๋ํธ ์ ๋ ฅ์ผ๋ก ๋๊ธฐ๋ ์ญํ
๋ญ์ฒด์ธ์์ parser ์๋ฏธ
- LLM์ด ์์ฑํ raw ์ถ๋ ฅ์ ์ฌ์ฉ์๊ฐ ์ฒ๋ฆฌํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐํ๋ ํ์์ผ๋ก ๋ณํํ๋ ์ปดํฌ๋ํธ
- ex) JSON ๋๋ ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ํํ๋ก ํ์ฑํด ํ์ ์ฒ๋ฆฌ์ ํ์ฉ
LangChain์์ invoke ์๋ฏธ
- LLM์ ๋๊ธฐ์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐํํ๋ ๋ฉ์๋
- llm.invoke(messages) ํธ์ถ ์ ๋ฉ์์ง๋ฅผ LLM์ผ๋ก ๋ณด๋ด๊ณ , ๊ฒฐ๊ณผ๊ฐ ์ฌ ๋๊น์ง ์ฝ๋๊ฐ ๊ธฐ๋ค๋ฆผ
- ๋จ์ผ ์ ๋ ฅ์ ๋๊ธฐ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ณธ ๋ฉ์๋
1) langchain_openai
- ๋ฉ์์ง๋ฅผ ๋จ์ (role, content) ํํ ๋ฆฌ์คํธ๋ก ์ ์
- ๋น ๋ฅด๊ฒ OpenAI API ํธ์ถ์ ์ ํฉ
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
messages = [
("system", "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฌธ์ฅ์ ์์ด๋ก ๋ฒ์ญํด."),
("human", "๋ด์ผ์ ํผ์๋ฅผ ๋จน์ด์ผ์ง!")
]
result = llm.invoke(messages)
print(result)
2) langchain_core
- ๊ตฌ์กฐํ ๋ฉ์์ง ๊ฐ์ฒด ์ฌ์ฉ
- ๋ฉ์์ง ๊ฐ์ฒด๋ก ์ญํ ๊ณผ ๋ด์ฉ์ด ๋ถ๋ฆฌ๋์ด ๊ด๋ฆฌ๋จ
- LangChain ํ๋ ์์ํฌ ๋ด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ํตํฉ·ํ์ฅ์ ์ ๋ฆฌ
from langchain_core.messages import HumanMessage, SystemMessage
llm = ChatOpenAI(model="gpt-4o-mini")
messages = [
SystemMessage(content="์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฌธ์ฅ์ ์์ด๋ก ๋ฒ์ญํด."),
HumanMessage(content="์ค๋์ ํผ์๋ฅผ ๋จน์ด์ผ์ง!")
]
result = llm.invoke(messages)
print(result.content)
ํ๋กฌํฌํธ
1. PromptTemplate ์ฌ์ฉ (๋ฌธ์์ด ํ ํ๋ฆฟ ์์ฑ)
- PromptTemplate์ ๋จ์ ๋ฌธ์์ด ๊ธฐ๋ฐ ํ ํ๋ฆฟ์ ๋ง๋ค์ด ์ค๋ค.
- {language}, {text} ๋ณ์๋ฅผ ์ ์ํด ์ค์ ๊ฐ์ ๋ฃ์ด ์์ฑ๋ ํ๋กฌํํธ๋ฅผ ๋ง๋ ๋ค.
- ์ต์ข ์ถ๋ ฅ์ ๋ณ์๊ฐ ์ฑ์์ง ๋ฌธ์์ด ํ๋กฌํํธ
from langchain_core.prompts import PromptTemplate
template = """
๋ค์ ๋ฌธ์ฅ์ {language}๋ก ๋ฒ์ญํด.
---
{text}
"""
prompt_template = PromptTemplate(
input_variables=["language", "text"],
template=template
)
prompt = prompt_template.format(language="์์ด", text="์ค๋์ ํผ์๋ฅผ ๋จน์ด์ผ์ง!")
prompt
2. ChatPromptTemplate ์ฌ์ฉ (๋ฉ์์ง ํ ํ๋ฆฟ ์์ฑ)
- ChatPromptTemplate์ ์ฑํ ๋ฉ์์ง ํ์์ผ๋ก ํ๋กฌํํธ๋ฅผ ๋ง๋๋ ํ ํ๋ฆฟ
- ๊ฐ ๋ฉ์์ง๋ฅผ ์ญํ ๊ณผ ๋ด์ฉ์ผ๋ก ์ ์
- ์์คํ ๋ฉ์์ง์ ์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ๋ถ๋ฆฌํด ์ญํ ๊ธฐ๋ฐ ๋ํ ๊ตฌ์กฐ๋ฅผ ์์ฑ
- ๋ณ์๋ {language}, {text}๋ฅผ ํฌํจํ๋ฉฐ format์ผ๋ก ์ฑ์ ํ๋กฌํํธ ์์ฑ
from langchain_core.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages(
[
("system", "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฌธ์ฅ์ {language}๋ก ๋ฒ์ญํด."),
("human", "{text}")
]
)
prompt = prompt_template.format(language="์ผ๋ณธ์ด", text="๋ด์ผ์ ์คํ๊ฒํฐ๋ฅผ ๋จน์ด์ผ์ง!")
prompt
์์์ ๋ง๋ 2๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๊ฐ์ง๋ก ์ฒด์ธ์ ๊ตฌ์ฑํ๋ฉด ๋๋ค.
3. LangChain ์ฒด์ธ ๊ตฌ์ฑ ๋ฐ ์คํ
- prompt_template๊ฐ ์ ๋ ฅ์ ๋ฐ์ ํ๋กฌํํธ ์์ฑ → llm์ ์ ๋ฌํด ์ธ์ด ๋ชจ๋ธ ์คํ → parser๊ฐ ๋ชจ๋ธ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ์ฒ๋ฆฌ
- invoke ๋ฉ์๋๋ก ์ฒด์ธ ์ ์ฒด ์คํ, ๊ฐ ๋จ๊ณ๊ฐ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด ์ต์ข ์๋ต ๋ฐํ
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="gpt-4o-mini")
parser = StrOutputParser()
chain = prompt_template | llm | parser
response = chain.invoke(
{
"language": "์์ด",
"text": "์ค๋์ ํผ์๋ฅผ ๋จน์ด์ผ์ง!"
}
)
response
์ด๋, ์ฝ๋์์ chain = llm | parser ๋ LLM ๋ชจ๋ธ ์คํ ํ ์ถ๋ ฅ ํ์๋ฅผ ์ฐ๊ฒฐํ๋ ๋จ์ ์ฒด์ธ์ด๋ค. ์ด ์ฒด์ธ์ ๋งค๋ฒ invoke ํ ๋ ์ฃผ์ด์ง ์ ๋ ฅ ๋ฉ์์ง๋ฅผ ๋ณ๋๋ก ์ํ๋ก ์ ์ฅํ๊ฑฐ๋ ๊ธฐ์ตํ์ง ์๋๋ค.
์ฝ๋๋ฅผ ์คํํด๋ ์ฒซ ๋ฒ์งธ ํธ์ถ์ ์ ๋ ฅ์ด๋ ๋ต๋ณ ๋ด์ฉ์ด ๋ ๋ฒ์งธ ํธ์ถ์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๋ณด์กด๋๊ฑฐ๋ ๋ฐ์๋์ง ์๋๋ค. ์ฆ, ์ ๋ ฅํ ๋ด์ฉ(๋ํ ๋ฌธ๋งฅ)์ ์์ด๋ฒ๋ ค์ ๋งค ํธ์ถ์ด ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
๋ง์ฝ, ๋ํ์ ํ๋ฆ์ ์ ์งํ๊ณ ์ด์ ๋ฉ์์ง๋ฅผ ๊ธฐ์ตํ๋ ๊ธฐ๋ฅ์ ์ํ๋ค๋ฉด ๋ณ๋๋ก ๋ํ ์ํ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ฑฐ๋ LangChain์ ๋ฉ๋ชจ๋ฆฌ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ชผ๊ฐ๊ธฐ
messages = [
SystemMessage(content="System"),
HumanMessage(content="Human1"),
AIMessage(content="AI1"),
HumanMessage(content="Human2"),
AIMessage(content="AI2"),
HumanMessage(content="Human3"),
AIMessage(content="AI3")
]
trimmer = trim_messages(
max_tokens=30,
token_counter=llm,
strategy="last",
include_system=True,
start_on="human"
)
trimmed_messages = trimmer.invoke(messages)
LLM์ ํ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ ์ต๋ ํ ํฐ ์์ ํ๊ณ๊ฐ ์๋ค. ์ด๋, ๋ํ๊ฐ ๊ธธ์ด์ง์๋ก ์ด์ ๋ฉ์์ง๋ค์ด ๋์ ๋์ด ์ ๋ ฅ ํ ํฐ ์๊ฐ ๋์ด๋๊ณ , ํ ํฐ ์ด๊ณผ ์ ๋ชจ๋ธ ํธ์ถ์ด ์คํจํ๊ฑฐ๋ ๋น์ฉ์ด ๊ณผ๋ํ๊ฒ ์ฆ๊ฐํ ์ ์๊ธฐ์ ์ด๋ฅผ ์ ์ ํ ์๋ผ๋ด์ผํ๋ค. (trim)
์ธ์ ?
- ๋ํ ํ์คํ ๋ฆฌ๊ฐ ์์ฌ ์ฐ์ ๋ํ ๋ฌธ๋งฅ์ ๋ชจ๋ ๋ณด๋ด๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ
- ์ต๊ทผ ๋ํ ๋ด์ฉ ์์ฃผ๋ก ๋ชจ๋ธ์ ์ ๋ ฅํ๊ณ , ์ด์ ๋ํ๋ ์ผ๋ถ ์๋ตํ๊ฑฐ๋ ์์ฝํ ๋
- ํน์ ๋น์ฉ ์ต์ ํ๋ฅผ ์ํด ๊ผญ ํ์ํ ๋ถ๋ถ๋ง ์ด๋ ค์ ์ ๋ ฅํ ๋
์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
- trim_messages ํจ์๋ ์ฃผ์ด์ง ๋ฉ์์ง(๋ํ ๊ธฐ๋ก)๋ฅผ ํ ํฐ ์ ํ ๋ด๋ก ์ค์
- strategy๋ฅผ ์กฐ์ ํด์ ์ค๋๋ ๋ฉ์์ง๋ฅผ ์ง์ฐ๊ณ ์ต๊ทผ ๋ฉ์์ง๋ถํฐ ์ ์ง
- ์์คํ ๋ฉ์์ง๋ ํญ์ ํฌํจํด ๋ํ ํ๋ฆ์ ์ ์ง
LangChain์์ ๋ํ ์ํ(ํ์คํ ๋ฆฌ) ๊ด๋ฆฌ ๊ตฌํ
from langchain_core.chat_history import BaseChatMessageHistory, InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
store = {}
def get_session_history(session_id: str) -> BaseChatMessageHistory:
if session_id not in store:
store[session_id] = InMemoryChatMessageHistory()
return store[session_id]
with_message_history = RunnableWithMessageHistory(chain, get_session_history)
config = {
"configurable": {
"session_id": "chat"
}
}
store ๋์ ๋๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ์ธ์ ๋ณ(์: ์ฌ์ฉ์๋ณ) ๋ํ ๊ธฐ๋ก์ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ ์ญํ
get_session_history(session_id) ํจ์๋ ํน์ ์ธ์ ์์ด๋์ ํด๋นํ๋ ๋ฉ์์ง ํ์คํ ๋ฆฌ(InMemoryChatMessageHistory)๋ฅผ ๋ฆฌํดํ๋ฉฐ, ์์ผ๋ฉด ์๋ก ์์ฑํด ์ ์ฅ
RunnableWithMessageHistory๋ ๊ธฐ์กด์ chain์ ๋ํ ๊ธฐ๋ก ์ ์ฅ ๊ธฐ๋ฅ์ ์ฐ๊ฒฐํด, ๊ฐ ํธ์ถ ์ ๋ํ ๊ธฐ๋ก์ ์๋์ผ๋ก ๋ถ๋ฌ์ค๊ณ ๊ธฐ๋กํ ์ ์๊ฒ ํ์ฅํด์ค๋ค.
config ๊ฐ์ฒด์์ session_id๋ฅผ ๋ฐ์ ๋ํ๋ณ๋ก ๊ธฐ์ต์ ๋ถ๋ฆฌํ๋ ์ค์ ๋ ํฌํจ๋๋ค. session_id๋ ๋ํ ์ธ์ ์๋ณ์ ์ญํ . ์ด ์๋ณ์๊ฐ ๋ค๋ฅด๋ฉด LangChain ๋ด๋ถ์์๋ ์์ ํ ๋ค๋ฅธ ๋ํ ์ธ์ ์ผ๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์, ๊ฐ ์ธ์ ๋ณ๋ก ๋ ๋ฆฝ์ ์ธ ๋ํ ๊ธฐ๋ก(ChatMessageHistory)์ ๊ด๋ฆฌ ํ๋ค.
๋ํ ํ์คํ ๋ฆฌ๋ฅผ ์ธ์ ๋ณ๋ก ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ LangChain ์ฒด์ธ์ ๋ถ์ฌ์, ๋ํ์ ํ๋ฆ๊ณผ ์ํ๋ฅผ ๊ธฐ์ตํ ์ ์๊ฒ ๊ตฌํํ๋ค. ๋ฐ๋ผ์ ํ ์ฌ์ฉ์์ ๋ํ๋ฅผ ์ด์ด๊ฐ๊ฑฐ๋, ์ฌ๋ฌ ์ฌ์ฉ์์ ๋ํ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ์ฐ์ด๋ ํจํด์ด๊ธฐ์, ๋ํ ์ํ๋ฅผ ์ ์ง ๋ฐ ๊ด๋ฆฌํ ์ ์๋ค.
์ฐธ๊ณ
'๐ฆญ AI&Big Data' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| LLM (0) | 2025.09.11 |
|---|---|
| RAG (1) | 2025.09.10 |