
๐ค Message History๊ฐ ํ์ํ ์ด์
model์ loadํ์ฌ ์ด๋ฆ์ ์๋ ค์ฃผ๊ณ ๋ด ์ด๋ฆ์ด ๋ฌด์์ธ์ง ๋ค์ ์ง๋ฌธํด๋ณด์.
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage
model = ChatGoogleGenerativeAI(model="gemini-pro",
convert_system_message_to_human=True,
)
model.invoke([HumanMessage(content="Hi! I'm Bob")])
model.invoke([HumanMessage(content="What's my name?")])
์ด๋ฆ์ ์๋ ค์ค ์ฒซ๋ฒ์งธ ๋ํ์ ๋์ ์ด๋ฆ์ ๋ฌผ์ด๋ณด๋ ๋๋ฒ์งธ ๋ํ๊ฐ ๊ฐ์ ๋งฅ๋ฝ์ผ๋ก ์ด์ด์ง์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ํ 1)

๋ํ 2)

์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ ์ฒด ๋ํ ๊ธฐ๋ก์ ๋ชจ๋ธ์ ์ ๋ฌํด์ผํ๋ค.
ํ๋์ invoke() ๋ฉ์๋์ ๋ฆฌ์คํธ ํํ๋ก HumanMessage๋ฅผ ์ ๋ฌํด๋ณด์.
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage
from langchain_core.messages import AIMessage
model.invoke(
[
HumanMessage(content="Hi, I'm Bob"),
AIMessage(content="Hello Bob! How can i assist you today?"),
HumanMessage(content="What's my name?")
]
)
์ด์ ๊ณผ ๋ฌ๋ฆฌ ์ด์ ๋ํ ๊ธฐ๋ก์ ๊ธฐ์ตํ๊ณ ๋ต๋ณํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

๐ Message History ๊ตฌํ
Message History ์ฌ์ฉ๋ฒ
Message History ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๋ํํ์ฌ ๋ํ ์ํ๋ฅผ ์ ์งํ๋๋ก ๊ตฌํํ ์ ์๋ค.
์ด ๋ฐฉ๋ฒ์ ์ด์ฉํ๋ฉด ๋ชจ๋ธ์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ์ถ์ ํด ๋ฐ์ดํฐ ์ ์ฅ์์ ์ ์ฅํ๊ณ ์ดํ์ ์ํธ์์ฉ์์ ๋ฐ์ดํฐ ์ ์ฅ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ์ฒด์ธ์ ์ผ๋ถ๋ก ์ ๋ฌํ๋ค.
from dotenv import load_dotenv
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import (
HumanMessage,
AIMessage
)
from langchain_core.chat_history import (
BaseChatMessageHistory,
InMemoryChatMessageHistory,
)
from langchain_core.runnables.history import RunnableWithMessageHistory
# load settings
load_dotenv()
# define model
model = ChatGoogleGenerativeAI(model="gemini-pro",
convert_system_message_to_human=True,
)
# session_id๋ฅผ ์ ์ฅํ ์ ์ฅ์
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(model, get_session_history)
config = {"configurable":
{"session_id": "ABC"}
}
response = with_message_history.invoke(
[HumanMessage(content="Hi, I'm Bob")],
config=config,
)
print(response.content)
response = with_message_history.invoke(
[HumanMessage(content="What's my name?")],
config=config,
)
print(response.content)
get_session_history() ํจ์๋ ๊ธฐ๋ก๋ session_id๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ํด๋น session_id๋ฅผ ๋ฐํํ์ฌ RunnableWithMessageHistory๋ฅผ ํตํด ์ฑ๋ด๊ณผ ๋ํ๋ฅผ ์ด์ด๋๊ฐ ์ ์๊ฒ ํด์ค๋ค.
๋ง์ฝ ๋ค๋ฅธ session_id๊ฐ ์ ๋ฌ๋๋ ๊ฒฝ์ฐ ์๋ก์ด ๋ํ๋ก ์ธ์ํ๋ค.

PromptTemplate ์ ์ฉ
...
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"๋๋ ํ๋ฅญํ ์ธ๊ตญ์ด ๊ณต๋ถ ๋ณด์กฐ AI์ผ. ํ๊ตญ์ด๋ก ๋จผ์ ๋ต๋ณํด์ฃผ๊ณ ์ด์ด์ {language}๋ก ๋ต๋ณํด์ค."
),
MessagesPlaceholder(variable_name="messages"),
]
)
chain = prompt | model
with_message_history = RunnableWithMessageHistory(chain, get_session_history, input_messages_key="messages",)
response = with_message_history.invoke(
{"messages": [HumanMessage(content="๋ ํ๊ตญ์์ ํ์ด๋ ๋จ์์ผ! ์์ด๋ฅผ ๊ณต๋ถํ๊ณ ์ถ์ด!")], "language": "english",},
config=config,
)
response = with_message_history.invoke(
{"messages": [HumanMessage(content="์ผ๋ณธ์ด๋ ๊ณต๋ถํ๊ณ ์ถ์๋ฐ ๋ด ์ฑ๋ณ์ ๋งํฌ๋ก ์ธ์ฌํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค!")], "language": "japanese"},
config=config,
)
๋ํ 1)

๋ํ 2)

๐ Conversation History ๊ด๋ฆฌ
์ฑ๋ด์ ๊ตฌ์ถํ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋
์ค ํ๋๋ ๋ํ ๊ธฐ๋ก์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ํ ๊ธฐ๋ก์ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ์ง๋ฌธ๋ง๋ค ๋ฉ์ธ์ง ๋ชฉ๋ก์ด ์ฆ๊ฐํ์ฌ LLM์ Context Window๋ฅผ ์ค๋ฒํ๋ก์ฐํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
LangChain์์ ์ ๊ณตํ๋ Trimmer๋ฅผ ์ด์ฉํด ๊ธฐ์กด์ ๋ํ๋ด์ญ์ ๋ชจ๋ธ์ ์ ์ฝ์กฐ๊ฑด์ ๋ง์ถ์ด ์ ๋ฌํ ์ ์๋ค.
๋จผ์ ํ ์คํธ์ฉ ๋ํ๋ด์ญ์ ๋ง๋ค๊ณ Trimmer์ ์ ์ฉํ๋ค. ์ด ๋ Trimmer์ max_tokens ํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉํด ์ต๋๋ก ์ ์งํ๋ ๋ํ๋ด์ญ์ ์กฐ์ ํ ์ ์๋ค.
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage, trim_messages
trimmer = trim_messages(
max_tokens=1000,
strategy="last",
token_counter=model,
include_system=True,
allow_partial=False,
start_on="human",
)
messages = [
HumanMessage(content="์๋
๋ ๊ณ ๊ธธ๋์ด์ผ! ๊ณง ์ ํ์ ๋ ๋ ์์ ์ธ๋ฐ ํํ์ข ๋์์ค๋?"),
AIMessage(content="๊ด์ฐฎ์ต๋๋ค! ์ ๊ฐ ๋์๋๋ฆด๊ฒ์!"),
HumanMessage(content="์ธ๊ตญ์ธ ์น๊ตฌ ์ญํ ๋ก ๋๋ตํด์ค!"),
AIMessage(content="๋ค ์ข์์! ์ต์ ์ ๋คํด ๋์๋๋ฆด๊ฒ์."),
]
trimmer.invoke(messages)
from operator import itemgetter
chain = (
RunnablePassthrough.assign(messages=itemgetter("messages") | trimmer)
| prompt
| model
)
with_message_history = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="messages",
)
with_message_history.invoke(
{
"messages": messages + [HumanMessage(content="๋ด ์ด๋ฆ์ด ๋ญ๋ผ๊ณ ~?")],
"language": "English",
},
config=config,
)

๐ค Streaming
Streaming ๋ฐฉ์์ ๋ต๋ณ์ ์ํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
# Streaming
for r in with_message_history.stream(
{
"messages": [HumanMessage(content="๋ด ์ฒซ ์ธ๊ตญ์ธ ์น๊ตฌ์ผ! ์์ผ๋ก ์นํ๊ฒ ์ง๋ด์!")],
"language": "English",
},
config=config,
):
print(r.content, end="|")
>>> ์ ๋ ์ฌ๋ฌ๋ถ์ ์ฒซ ์ธ๊ตญ์ธ ์น๊ตฌ๊ฐ ๋ ์ ์์ด์ ๊ธฐ|์ฉ๋๋ค! ์์ผ๋ก ์นํ๊ฒ ์ง๋ด๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!|
Ref : https://python.langchain.com/v0.2/docs/tutorials/chatbot/
'LangChain' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LangChain] Reranker (0) | 2024.08.29 |
---|---|
[LangChain] RAG VectorStore & Retrievers (4) | 2024.08.29 |
[LangChain] LangServe๋ฅผ ์ด์ฉํ LLM์ฑ ๋ฐฐํฌ (0) | 2024.08.29 |
[LangChain] LangChain ์์ํ๊ธฐ (1) | 2024.08.29 |