๋ญ์ฒด์ธ ํ๊ตญ์ด ํํ ๋ฆฌ์ผ์ ์ฌ์ฉ๋๋ ๋ค์ํ ์ ํธ ํ์ด์ฌ ํจํค์ง.
LangChain ์ ์ฌ์ฉํ๋ฉด์ ๋ถํธํ ๊ธฐ๋ฅ์ด๋, ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
pip install langchain-teddynote
์คํธ๋ฆฌ๋ฐ ์ถ๋ ฅ์ ์ํ stream_response
ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
from langchain_teddynote.messages import stream_response
from langchain_openai import ChatOpenAI
# ๊ฐ์ฒด ์์ฑ
llm = ChatOpenAI(
temperature=0.1, # ์ฐฝ์์ฑ (0.0 ~ 2.0)
model_name="gpt-4o", # ๋ชจ๋ธ๋ช
)
answer = llm.stream("๋ํ๋ฏผ๊ตญ์ ์๋ฆ๋ค์ด ๊ด์ฅ์ง 10๊ณณ๊ณผ ์ฃผ์๋ฅผ ์๋ ค์ฃผ์ธ์!")
# ์คํธ๋ฆฌ๋ฐ ์ถ๋ ฅ๋ง ํ๋ ๊ฒฝ์ฐ
stream_response(answer)
# ์ถ๋ ฅ๋ ๋ต๋ณ์ ๋ฐํ ๊ฐ์ผ๋ก ๋ฐ๋ ๊ฒฝ์ฐ
# final_answer = stream_response(answer, return_output=True)
# LangSmith ์ถ์ ์ ์ค์ ํฉ๋๋ค. https://smith.langchain.com
# ํ๊ฒฝ๋ณ์ ์ค์ ์ ๋์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
from langchain_teddynote import logging
# ํ๋ก์ ํธ ์ด๋ฆ์ ์
๋ ฅํฉ๋๋ค.
logging.langsmith("ํ๋ก์ ํธ๋ช
๊ธฐ์
")
์ถ๋ ฅ
LangSmith ์ถ์ ์ ์์ํฉ๋๋ค.
[ํ๋ก์ ํธ๋ช
]
(๊ธฐ์
ํ ํ๋ก์ ํธ๋ช
)
from langchain_teddynote.models import MultiModal
from langchain_teddynote.messages import stream_response
# ๊ฐ์ฒด ์์ฑ
llm = ChatOpenAI(
temperature=0.1, # ์ฐฝ์์ฑ (0.0 ~ 2.0)
model_name="gpt-4o", # ๋ชจ๋ธ๋ช
)
# ๋ฉํฐ๋ชจ๋ฌ ๊ฐ์ฒด ์์ฑ
system_prompt = """๋น์ ์ ํ(์ฌ๋ฌด์ ํ) ๋ฅผ ํด์ํ๋ ๊ธ์ต AI ์ด์์คํดํธ ์
๋๋ค.
๋น์ ์ ์๋ฌด๋ ์ฃผ์ด์ง ํ
์ด๋ธ ํ์์ ์ฌ๋ฌด์ ํ๋ฅผ ๋ฐํ์ผ๋ก ํฅ๋ฏธ๋ก์ด ์ฌ์ค์ ์ ๋ฆฌํ์ฌ ์น์ ํ๊ฒ ๋ต๋ณํ๋ ๊ฒ์
๋๋ค."""
user_prompt = """๋น์ ์๊ฒ ์ฃผ์ด์ง ํ๋ ํ์ฌ์ ์ฌ๋ฌด์ ํ ์
๋๋ค. ํฅ๋ฏธ๋ก์ด ์ฌ์ค์ ์ ๋ฆฌํ์ฌ ๋ต๋ณํ์ธ์."""
# ๋ฉํฐ๋ชจ๋ฌ ๊ฐ์ฒด ์์ฑ
multimodal_llm = MultiModal(
llm, system_prompt=system_prompt, user_prompt=user_prompt
)
# ์ํ ์ด๋ฏธ์ง ์ฃผ์(์น์ฌ์ดํธ๋ก ๋ถํฐ ๋ฐ๋ก ์ธ์)
IMAGE_URL = "https://storage.googleapis.com/static.fastcampus.co.kr/prod/uploads/202212/080345-661/kwon-01.png"
# ๋ก์ปฌ PC ์ ์ ์ฅ๋์ด ์๋ ์ด๋ฏธ์ง์ ๊ฒฝ๋ก ์
๋ ฅ
# IMAGE_URL = "./images/sample-image.png"
# ์ด๋ฏธ์ง ํ์ผ๋ก ๋ถํฐ ์ง์
answer = multimodal_llm.stream(IMAGE_URL)
# ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ผ๋ก ๊ฐ ํ ํฐ์ ์ถ๋ ฅํฉ๋๋ค. (์ค์๊ฐ ์ถ๋ ฅ)
stream_response(answer)
from langchain_teddynote.models import OpenAIAssistant
# RAG ์์คํ
ํ๋กฌํํธ ์
๋ ฅ
_DEFAULT_RAG_INSTRUCTIONS = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Answer in Korean."""
# ์ค์ (configs)
configs = {
"OPENAI_API_KEY": openai_api_key, # OpenAI API ํค
"instructions": _DEFAULT_RAG_INSTRUCTIONS, # RAG ์์คํ
ํ๋กฌํํธ
"PROJECT_NAME": "PDF-RAG-TEST", # ํ๋ก์ ํธ ์ด๋ฆ(์์ ๋กญ๊ฒ ์ค์ )
"model_name": "gpt-4o", # ์ฌ์ฉํ OpenAI ๋ชจ๋ธ ์ด๋ฆ(gpt-4o, gpt-4o-mini, ...)
"chunk_size": 1000, # ์ฒญํฌ ํฌ๊ธฐ
"chunk_overlap": 100, # ์ฒญํฌ ์ค๋ณต ํฌ๊ธฐ
}
# ์ธ์คํด์ค ์์ฑ
assistant = OpenAIAssistant(configs)
# ์
๋ก๋ํ ํ์ผ ๊ฒฝ๋ก
data = "ํ์ผ์ด๋ฆ.pdf"
# ํ์ผ ์
๋ก๋ ํ file_id ๋ ์ ๋ณด๊ดํด ๋์ธ์. (๋์๋ณด๋์์ ๋์ค์ ํ์ธ ๊ฐ๋ฅ)
file_id = assistant.upload_file(data)
# ์
๋ก๋ํ ํ์ผ์ ID ๋ฆฌ์คํธ ์์ฑ
file_ids = [file_id]
# ์๋ก์ด ์ด์์คํดํธ ์์ฑ ๋ฐ ID ๋ฐ๊ธฐ
assistant_id, vector_id = assistant.create_new_assistant(file_ids)
# ์ด์์คํดํธ ์ค์
assistant.setup_assistant(assistant_id)
# ๋ฒกํฐ ์คํ ์ด ์ค์
assistant.setup_vectorstore(vector_id)
์คํธ๋ฆฌ๋ฐ ์ถ๋ ฅ
for token in assistant.stream("์ผ์ฑ์ ์๊ฐ ๊ฐ๋ฐํ ์์ฑํ AI์ ์ด๋ฆ์?"):
print(token, end="", flush=True)
ํน์
from langchain_teddynote.messages import stream_response
stream_response(assistant.stream("์ด์ ๋ต๋ณ์ ์์ด๋ก"))
์ผ๋ฐ ์ถ๋ ฅ
# ์ง๋ฌธ
print(assistant.invoke("์ผ์ฑ์ ์๊ฐ ๊ฐ๋ฐํ ์์ฑํ AI์ ์ด๋ฆ์?"))
๋ํ ๋ชฉ๋ก์ ์กฐํ
# ๋ํ ๋ชฉ๋ก ์กฐํ
assistant.list_chat_history()
๋ํ ์ด๊ธฐํ
# ๋ํ ์ด๊ธฐํ
assistant.clear_chat_history()