๐ค AI๊ฐ ์ฌ๋์ฒ๋ผ ๋ํ๋ฅผ ๊ธฐ์ตํ๋ ๋ฐฉ๋ฒ์ด์์!
์ฐ๋ฆฌ๊ฐ ์น๊ตฌ์ ์ด์ผ๊ธฐํ ๋, ์์ ์ ํ ๋ํ๋ฅผ ๊ธฐ์ตํ๋ฉด ๋ ์์ฐ์ค๋ฝ๊ฒ ์ด์ด๊ฐ ์ ์์ฃ ?
AI๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ํ ๋ด์ฉ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ด ํ์ํด์.
AI๊ฐ ๋ํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ธฐ๋ณธ ๊ตฌ์กฐ์์!
AI๋ ์ฌ์ฉ์๊ฐ ๋ณด๋ธ ๋ฉ์์ง๋ฅผ ์ฝ๊ณ , ๊ทธ์ ๋ง๋ ๋ต๋ณ์ ์์ฑํด์.
๐ ์์
๐ ์ฌ๋์ด ๋งํจ: "์๋
! ์ค๋ ๋ ์จ ์ด๋?"
๐ค AI๊ฐ ๋๋ตํจ: "์๋
ํ์ธ์! ์ค๋ ๋ ์จ๋ ๋ง์์ โ๏ธ"
โ๏ธ ํ์ง๋ง AI๋ ์ด์ ๋ํ๋ฅผ ๊ธฐ์ตํ์ง ๋ชปํ๋ฉด ํ๋ฆ์ ์ดํดํ ์ ์์ด์.
โ๏ธ ๊ทธ๋์! ๋ํ ์ด๋ ฅ์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ด ํ์ํด์.
๐น RunnableWithMessageHistory
AI๊ฐ ๋ํ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ฌ ์ ์๋๋ก ๋์์ฃผ๋ ๋ฐฉ๋ฒ์ด์์.
๋ํ ๋ด์ฉ์ ์ด๋์ ์ ์ฅํ ๊น์? ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ด์!
AI๊ฐ ๋ํ๋ฅผ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊น ์ ์ฅํด์. (์ฝ๊ณ ๋น ๋ฆ!)
๋จ์ : ์ปดํจํฐ๋ฅผ ๊ป๋ค ์ผ๋ฉด ๋ํ ๋ด์ฉ์ด ์ฌ๋ผ์ ธ์! ๐ข
AI๊ฐ ๋ํ๋ฅผ DB(๋ฐ์ดํฐ๋ฒ ์ด์ค)์ ์ ์ฅํด์ ๋ค์ ๋ถ๋ฌ์ฌ ์ ์์ด์!
์ฅ์ : ์ปดํจํฐ๋ฅผ ๊บผ๋ ๋ํ ๊ธฐ๋ก์ด ๋จ์์! ๐
โ๏ธ ์ด๋ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ง๋ ํ์์ ๋ฐ๋ผ ์ ํํ๋ฉด ๋ผ์!
๋ํ๊ฐ ๋๋ฌด ๊ธธ์ด์ง๋ฉด, AI๊ฐ ํ์ํ ๋ถ๋ถ๋ง ๋จ๊ธฐ๊ณ ์ ๋ฆฌํ๋ ๊ธฐ๋ฅ!
โ๏ธ AI๊ฐ ๋ชจ๋ ๋ํ๋ฅผ ๋ค ๊ธฐ์ตํ๋ฉด ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ๊ฐ ํ์ํด์.
โ๏ธ ๊ทธ๋์ ์ค์ํ ๋ถ๋ถ๋ง ๋จ๊ธฐ๊ณ ์ค๋๋ ๋ด์ฉ์ ์ญ์ ํด์.
๐ ์์
๐ฌ (์ฒ์ ๋ํ ์์)
๐ฉ "์๋
! ๋ด ์ด๋ฆ์ ์์ด์ผ."
๐ค "๋ฐ๊ฐ์์, ์์ด๋!"
๐ฉ "๋ด์ผ ๋ ์จ ์ด๋?"
๐ค "๋ด์ผ์ ๋น๊ฐ ์ฌ ์์ ์ด์์."
๐ฌ (๋ํ๊ฐ ๊ธธ์ด์ ธ์ AI๊ฐ ์ค๋๋ ๋ด์ฉ์ ์ญ์ ํจ)
๐ฉ "๋ด ์ด๋ฆ์ด ๋ญ์๋๋ผ?"
๐ค "์... ์ ๋ชจ๋ฅด๊ฒ ์ด์! ๐ข"
โ๏ธ ๊ทธ๋์ ์ค์ํ ๋ด์ฉ์ ์ ์ฅํ๊ณ , ๋ ์ค์ํ ๋ด์ฉ์ ์ญ์ ํด์ผ ํด์!
๋จผ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ค๋ ์ฝ๋
โ๏ธ.env ํ์ผ์์ API ํค(๋น๋ฐ๋ฒํธ ๊ฐ์ ์ ๋ณด)๋ฅผ ๋ถ๋ฌ์ค๋ ์ฝ๋์์.
โ๏ธOpenAI ๊ฐ์ ์๋น์ค์ ์ ์ํ ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฝ๋์ ์ง์ ์ฐ๋ฉด ์ํํ๊ธฐ ๋๋ฌธ์, .env ํ์ผ์ ์ฌ์ฉํด ๋ณด์์ ์ ์งํด์.
from dotenv import load_dotenv
load_dotenv()
AI๊ฐ ๋ํ๋ฅผ ๊ธฐ์ตํ๋ ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ํ์ํด์.
์ด๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฉํ ์ ์์ด์.
โ๏ธ ์ด ์ฝ๋๋ค์ ํ์ผ์ ๋ค๋ฃจ๋ ๋ฐ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด์์.
โ๏ธ ํนํ json์ ๋ํ ๊ธฐ๋ก์ JSON ํ์ผ ํ์์ผ๋ก ์ ์ฅํ ๋ ์ฌ์ฉ๋ผ์!
import os
from glob import glob
from pprint import pprint
import json
GPT-4o-mini ๋ชจ๋ธ์ ๋ถ๋ฌ์์.
temperature=0.3 โ ๋ต๋ณ์ ๋ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋ค์ด์.
top_p=0.9 โ ๊ฐ๋ฅํ ๋ต๋ณ์ ๋ค์ํ๊ฒ ๊ณ ๋ คํด์.
โ๏ธ ์ด ๋ชจ๋ธ์ด ์ฌ๋๊ณผ ๋ํํ๋ฉด์ ๋ํ ๋ด์ฉ์ ์ ์ฅํ๊ณ ํ์ฉํ ๊ฑฐ์์!
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model='gpt-4o-mini',
temperature=0.3,
top_p=0.9,
)
โ
1. LangChain์์ ๊ธฐ๋ณธ ์ ๊ณตํ๋ ๋ํ ๊ธฐ๋ก ๊ธฐ๋ฅ
LangChain์์๋ ๋ํ ์ด๋ ฅ์ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๐ ๊ฐ๋จํ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ ๋ฐฉ์
๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด AI๊ฐ ์ด์ ๋ํ๋ฅผ ๊ธฐ์ตํ ์ ์์ด์!
๋จผ์ , ConversationBufferMemory๋ฅผ ํ์ฉํด๋ด
์๋ค.
๐ ์ด ์ฝ๋๊ฐ ํ๋ ์ผ
โ
AI๊ฐ ์ด์ ๋ํ๋ฅผ ์ ์ฅํด์ ๊ธฐ์ตํ ์ ์๋๋ก ์ค์
โ
ConversationBufferMemory()๋ฅผ ํ์ฉํด์ ๊ฐ๋จํ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ ๊ธฐ๋ฅ ์ถ๊ฐ
โ
๊ธฐ๋ณธ์ ์ธ ๋ํ ํ๋ฆ์ ์ ์งํ๋๋ก ํจ
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain_openai import ChatOpenAI
# ๐๏ธ LLM ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.3)
# ๐ง ๋ฉ๋ชจ๋ฆฌ ์ค์ (๋ํ ๊ธฐ๋ก ์ ์ฅ)
memory = ConversationBufferMemory()
# ๐ ๋ํ ์ฒด์ธ ์์ฑ
conversation = ConversationChain(
llm=llm,
memory=memory
)
# ๐ ๋ํ ํ
์คํธ
response1 = conversation.predict(input="์๋
! ๋ด ์ด๋ฆ์ ์์ด์ผ.")
print(response1) # AI๊ฐ "์๋
ํ์ธ์, ์์ด๋!" ์ด๋ผ๊ณ ์ธ์ฌ
response2 = conversation.predict(input="๋ด ์ด๋ฆ์ด ๋ญ๋ผ๊ณ ํ์ง?")
print(response2) # AI๊ฐ "์์ด๋์ด๋ผ๊ณ ํ์
จ์ฃ !" ๋ผ๊ณ ๊ธฐ์ต
โ
2. SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ด๋ ฅ ์ ์ฅํ๊ธฐ (์๊ตฌ ์ ์ฅ)
์ ๋ฐฉ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉํ๋ฏ๋ก ์ปดํจํฐ๋ฅผ ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ ๋จ์ ์ด ์์ด์!
๊ทธ๋์ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฉํ๋ฉด AI๊ฐ ๋ํ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ ์ ์์ด์. ๐
๐ ์ด ์ฝ๋๊ฐ ํ๋ ์ผ
โ
๋ํ ๊ธฐ๋ก์ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค(chat_history.db)์ ์ ์ฅ
โ
AI๊ฐ ์ด์ ๋ํ๋ฅผ ๊บผ๋ด์ ํ์ธํ ์ ์๋๋ก ์ค์
โ
ConversationSummaryMemory()๋ฅผ ํ์ฉํด ๋ํ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด์ง๋ฉด ์๋ ์์ฝ
โ
์ฌ์ฉ์๋ณ ์ธ์
๊ด๋ฆฌ ๊ฐ๋ฅ! (e.g. session_id="user_123")
๐ SQLite ๊ธฐ๋ฐ ๋ํ ์ ์ฅ ์ฝ๋
from langchain.memory import ConversationSummaryMemory
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory.chat_message_histories import SQLiteChatMessageHistory
# ๐๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ ์์ฑ
db_path = "chat_history.db"
# ๐ ๏ธ SQLite ๊ธฐ๋ฐ ๋ํ ๊ธฐ๋ก ์ ์ฅ์ ์ค์
history = SQLiteChatMessageHistory(database_path=db_path, session_id="user_123")
# ๐ง ๋ํ ๊ธฐ๋ก ์ ์ฅ์ฉ ๋ฉ๋ชจ๋ฆฌ ์ค์ (์๋ ์์ฝ ํฌํจ)
memory = ConversationSummaryMemory(
llm=ChatOpenAI(model="gpt-4o-mini"),
chat_memory=history
)
# ๐ ๋ํ ์ฒด์ธ ์์ฑ
conversation = ConversationChain(
llm=ChatOpenAI(model="gpt-4o-mini"),
memory=memory
)
# ๐ ๋ํ ํ
์คํธ
response1 = conversation.predict(input="์๋
! ๋ด ์ด๋ฆ์ ์์ด์ผ.")
print(response1)
response2 = conversation.predict(input="๋ด ์ด๋ฆ์ด ๋ญ๋ผ๊ณ ํ์ง?")
print(response2) # AI๊ฐ "์์ด๋"์ด๋ผ๊ณ ๊ธฐ์ตํด์ผ ํจ
๐ฅ 3. ๋ํ ์ด๋ ฅ ๊ด๋ฆฌ ๊ธฐ๋ฒ ์ถ๊ฐ (ํธ๋ฆฌ๋ฐ & ์์ฝ)
โ๏ธ ๋ํ๊ฐ ๋๋ฌด ๊ธธ์ด์ง๋ฉด AI๊ฐ ์ค์ํ ๋ด์ฉ๋ง ๋จ๊ธฐ๊ณ ์์ฝํ ์ ์์ด์!
โ๏ธ ์ด๋ ๊ฒ ํ๋ฉด ๋ํ ๋ด์ฉ์ด ๋๋ฌด ๋ง์์ ธ๋ AI๊ฐ ํต์ฌ ๋ด์ฉ์ ๊ธฐ์ตํ ์ ์์ด์.
๐ ์ด ์ฝ๋๊ฐ ํ๋ ์ผ
โ
๋ํ๊ฐ ๋๋ฌด ๊ธธ์ด์ง๋ฉด ์๋์ผ๋ก ์์ฝ (๋ฉ์์ง ํธ๋ฆฌ๋ฐ)
โ
๋ํ ๋ด์ฉ์ด ๋ง์๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ
โ
max_token_limit=100 ์ค์ ์ ์กฐ์ ํด ์์ฝ์ ๊ธธ์ด๋ฅผ ์กฐ์ ๊ฐ๋ฅ
from langchain.memory import ConversationSummaryBufferMemory
# ๐ง ์์ฝ ๊ธฐ๋ฐ ๋ฉ๋ชจ๋ฆฌ (ํธ๋ฆฌ๋ฐ ๊ธฐ๋ฅ ํฌํจ)
memory = ConversationSummaryBufferMemory(
llm=ChatOpenAI(model="gpt-4o-mini"),
max_token_limit=100 # ๋๋ฌด ๊ธธ์ด์ง๋ฉด ์์ฝ
)
# ๐ ๋ํ ์ฒด์ธ ์์ฑ
conversation = ConversationChain(
llm=ChatOpenAI(model="gpt-4o-mini"),
memory=memory
)
# ๐ ๋ํ ํ
์คํธ
response1 = conversation.predict(input="์๋
! ๋๋ AI๋ฅผ ๊ณต๋ถํ๋ ์์ด์ผ.")
print(response1)
response2 = conversation.predict(input="๋ด๊ฐ ๋ญ๋ผ๊ณ ํ์ง?")
print(response2) # AI๊ฐ ์ค์ํ ๋ด์ฉ์ ์์ฝํด์ ๋ต๋ณ
๐ ์ต์ข
์ ๋ฆฌ
โ๏ธ ๊ฐ๋จํ ๋ํ ์ ์ฅ โ ConversationBufferMemory() ์ฌ์ฉ
โ๏ธ ์๊ตฌ ์ ์ฅ ํ์ โ SQLiteChatMessageHistory() ์ฌ์ฉ
โ๏ธ ๋ํ๊ฐ ๊ธธ์ด์ง๋ฉด ์๋ ์์ฝ โ ConversationSummaryBufferMemory() ์ฌ์ฉ