[LLM] Langchain
Langchain์ ์์ด์ ํธ ๊ฐ๋ฐ์ ์ํ ์ฃผ์ ์คํ์์ค ํ๋ ์์ํฌ ์ค ํ๋๋ค.
LLM ๊ธฐ๋ฐ์ ์์ด์ ํธ ์์คํ
์ ์ข ๋ ํธ๋ฆฌํ๊ฒ ๋ง๋ค ์ ์๊ฒ ๋์์ค๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ ์์ ์์ ์ ์์ผ๋ก ์ง์๋๋ ์ธ์ด๋ Python, Typescript ๋ฟ์ด๋ค.
LLM ๋ชจ๋ธ์ ์ด์ง๊ฐํ๊ฑด ๋ค ๋ถ์ผ ์ ์๋ค. Gemini, OpenAI, Anthropic ๋ฑ ์ฃผ์ ๋ชจ๋ธ๋ค์ ๋ค ํตํฉ ๋๋ผ์ด๋ฒ๋ฅผ ์ ๊ณตํ๋ค.
Langchain vs Langgraph
Langchain์ ์ธ๊ธํ๋ฉด ํญ์ ์์ผ๋ก ๋์ค๋ ๊ฒ์ด Langgraph๋ค.
๋น๊ตํ์๋ฉด Langchain์ ๋น๊ต์ ๋จ์ํ ์ฌ์ฉ์ฌ๋ก๋ฅผ ์ํด ์ ๊ณต๋๋ ๊ฐ๋จํ ๊ตฌ์กฐ์ ํ๋ ์์ํฌ๊ณ , Langgraph๋ ๊ทธ๋ํ ํํ๋ก ์์ด์ ํธ๋ฅผ ์ฎ์ด์ ๋์ ์์ค์ ์ํธ์์ฉ์ ๊ตฌํํ ์ ์๊ฒ ํด์ฃผ๋ ๋ณต์กํ ํ๋ ์์ํฌ๋ค.
๋ณธ์ธ์ด ๋๋ผ๊ธฐ์ ๊ทธ๋ ๊ฒ ๋ณต์กํ ์์คํ ์ด ์๋๋ผ๋ฉด Langchain์ผ๋ก ๋จผ์ ์์ํด๋ณด๊ณ , ๋ถ์กฑํจ์ ๋๋ผ๋ฉด ์ฎ๊ฒจ๋ ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑฐ ๋ ๋ค ๊ฐ์ ์คํ์์ค ๊ทธ๋ฃน์์ ๋ง๋ ๊ฒ์ด๋ค.
์ค์น (with Gemini)
gemini๋ฅผ ์ด๋ค๊ณ ๊ฐ์ ํ๊ณ ํ๋ฒ ๋๋ ค๋ณด๊ฒ ๋ค.
๋ค์๊ณผ ๊ฐ์ด langchain๊ณผ, ์ฌ์ฉํ LLM์ ๋ํ ์ ์ฉ ๋๋ผ์ด๋ฒ๋ฅผ ๋์์ ์ค์นํ๋ฉด ๋๋ค.
uv add langchain langchain-google-genai
์ข
์์ฑ ๊ตฌ์กฐ๊ฐ ๋ณต์กํ์ง ์๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
์์ด์ ํธ ํ๋ ์์ํฌ๋ ๋ญ๋ ํ์ง๋ง, ๊ธฐ์ ์ ๊น๋ ค์๋ ๊ธฐ๋ฐ๊ตฌ์กฐ ์์ฒด๋ ๋งค์ฐ ๋จ์ํ๋ค.
๊ฒฐ๊ตญ์ ํ
ํ๋ฆฟ ๋ฌธ์์ด ์์ฑ๊ธฐ์ ๋ถ๊ณผํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ค์ ์ฝ๋๋ LLM ํธ์ถ ์์ด ํ ํ๋ฆฟ ๊ธฐ๋ฐ์ผ๋ก ํ๋กฌํํธ๋ฅผ ์์ฑํ๋ ๊ฐ๋จํ ์์ ๋ค.
from dotenv import load_dotenv
from langchain_core.prompts import PromptTemplate
# ํ๊ฒฝ๋ณ์ ๋ก๋
load_dotenv()
def basic_prompt_example():
"""๊ธฐ๋ณธ์ ์ธ ํ๋กฌํํธ ํ
ํ๋ฆฟ ์์ """
print("=== ๊ธฐ๋ณธ ํ๋กฌํํธ ํ
ํ๋ฆฟ ์์ ===")
# ๊ฐ๋จํ ํ๋กฌํํธ ํ
ํ๋ฆฟ ์์ฑ
template = """๋น์ ์ ๋์์ด ๋๋ AI ์ด์์คํดํธ์
๋๋ค.
๋ค์ ์ง๋ฌธ์ ์น์ ํ๊ณ ์ ํํ๊ฒ ๋ต๋ณํด์ฃผ์ธ์.
์ง๋ฌธ: {question}
๋ต๋ณ:"""
prompt = PromptTemplate.from_template(template)
# ํ๋กฌํํธ ํฌ๋งทํ
formatted_prompt = prompt.format(
question="ํ์ด์ฌ์์ ๋ฆฌ์คํธ์ ํํ์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?"
)
print(formatted_prompt)
print()
<br>
def main():
"""๋ฉ์ธ ํจ์"""
basic_prompt_example()
<br>
if __name__ == "__main__":
main()

๊ทธ๋ฅ ์ด๋ฐ ์์ผ๋ก ๊ตฌ๋ฉ ๋ซ์ด๋์ ํ๋กฌํํธ ํ
ํ๋ฆฟ์ ๋ง๋ค์ด๋๋ค๊ฐ, ์ฌ์ฉํ ๋ ์ฃผ์
ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์กฐ๊ธ ๋ ๊ฐ๋ณด์.
์ฑํ
์ ๊ณ ๋ คํด์ ํ๋กฌํํธ๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด, ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ง์๋ฌธ๊ณผ ์ฌ์ฉ์์ ํ
์คํธ๋ฅผ ๋์ดํด์ ์ ๋ฌํด์ผ ํ ๊ฒฝ์ฐ๊ฐ ์ ๋ฒ ๋ง๋ค.
๊ทธ๋ด๋๋ ChatPromptTemplate๋ฅผ ์ฌ์ฉํด์ ํํ์ ๋ฐฐ์ด ํํ๋ก ๋ฉ์ธ์ง๋ฅผ ๋๊ฒจ์ค ์ ์๋ค.
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
# ํ๊ฒฝ๋ณ์ ๋ก๋
load_dotenv()
<br>
def basic_prompt_example():
"""๊ธฐ๋ณธ์ ์ธ ํ๋กฌํํธ ํ
ํ๋ฆฟ ์์ """
print("=== ๊ธฐ๋ณธ ํ๋กฌํํธ ํ
ํ๋ฆฟ ์์ ===")
# ์ฑํ
ํ๋กฌํํธ ํ
ํ๋ฆฟ ์์ฑ
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"๋น์ ์ {expertise} ์ ๋ฌธ๊ฐ์
๋๋ค. ์ง๋ฌธ์ ์ ๋ฌธ์ ์ด๊ณ ๋์์ด ๋๋ ๋ต๋ณ์ ์ ๊ณตํด์ฃผ์ธ์.",
),
("human", "{question}"),
]
)
# ํ๋กฌํํธ ํฌ๋งทํ
formatted_prompt = prompt.format(
expertise="ํ๋ก๊ทธ๋๋ฐ", question="LangChain์ด ๋ฌด์์ธ์ง ๊ฐ๋จํ ์ค๋ช
ํด์ฃผ์ธ์."
)
print(formatted_prompt)
print()
<br>
def main():
"""๋ฉ์ธ ํจ์"""
basic_prompt_example()
<br>
if __name__ == "__main__":
main()

๊ทธ๋ผ ์ด๋ฐ ์์ผ๋ก ์ ๋นํ, ํ ๋จ์๋ก ๊ตฌ๋ถํ๊ณ ์ฝ๋ก ์ผ๋ก ํค๋:๊ฐ ์์ ์ง์ด๋ฃ์ด์ ์์ฑํด์ค๋ค.
์ด๋ฒ์๋ ์ง์ง๋ก LLM๊น์ง ๋ถ์ฌ์ ํ๋กฌํํธ๋ฅผ ๋ ๋ ค๋ณด์.
ํ๊ฒฝ๋ณ์์ Gemini Key๋ฅผ ๋ฃ์ด๋ฌ์ผ ํ๋ค.
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_google_genai import ChatGoogleGenerativeAI
import os
# ํ๊ฒฝ๋ณ์ ๋ก๋
load_dotenv()
<br>
def basic_prompt_example():
print("=== Gemini LLM ์ฒด์ธ ์์ ===")
# API ํค ํ์ธ
if (
not os.getenv("GOOGLE_API_KEY")
or os.getenv("GOOGLE_API_KEY") == "your_gemini_api_key_here"
):
print("โ ๏ธ GOOGLE_API_KEY๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค.")
print("์ค์ Gemini๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด .env ํ์ผ์ GOOGLE_API_KEY๋ฅผ ์ค์ ํด์ฃผ์ธ์.")
print("Google AI Studio์์ ํค ๋ฐ๊ธ: https://aistudio.google.com/app/apikey")
print()
return
try:
# Gemini LLM ์ด๊ธฐํ
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash", temperature=0.7)
# ํ๋กฌํํธ ํ
ํ๋ฆฟ
prompt = ChatPromptTemplate.from_messages(
[("system", "๋น์ ์ ์น๊ทผํ AI ์ด์์คํดํธ์
๋๋ค."), ("human", "{question}")]
)
# ์ถ๋ ฅ ํ์
output_parser = StrOutputParser()
# ์ฒด์ธ ๊ตฌ์ฑ
chain = prompt | llm | output_parser
# ์ฒด์ธ ์คํ
response = chain.invoke(
{"question": "LangChain 1.0๊ณผ Gemini์ ์ฃผ์ ํน์ง์ ๊ฐ๋จํ ์๋ ค์ฃผ์ธ์."}
)
print("โ
Gemini ์๋ต:")
print(response)
print()
except Exception as e:
print(f"โ Gemini ํธ์ถ ์ค ์ค๋ฅ ๋ฐ์: {e}")
print()
<br>
def main():
"""๋ฉ์ธ ํจ์"""
basic_prompt_example()
<br>
if __name__ == "__main__":
main()

์ฌ๊ธฐ์ ์ข ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์, ์ฒด์ธ ๊ตฌ๋ฌธ์ผ๋ก ํธ์ถ ๊ณผ์ ์ ์ ์ํ๋ค๋ ๊ฒ์ด๋ค.
ํ๋กฌํํธ๋ฅผ llm์ ๋ณด๋ด๊ณ , ๊ทธ ์๋ต์ ํ์ฑํ๋ ๊ณผ์ ์ ๋ ์๊ธฐ๋ค๋ง์ ์ปค์คํ
๊ตฌ๋ฌธ์ ์ ์ํด์ ๋ง๋ค์ด๋จ๋ค.
๊ทธ๋ฆฌ๊ณ invoke๋ง ํ๋ฉด ์ ํ์ดํ๋ผ์ธ ์์๋๋ก ์คํํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ฑ์ด์ฃผ๋ ๊ฒ์ด๋ค.
์ ๋์ํ๋ค.
๋ฉํฐ ์์ด์ ํธ ๊ตฌํ
langchain ์์ฒด๋ ๋ฉํฐ์์ด์ ํธ ๊ตฌ์กฐ๋ฅผ ์์ ํ๊ณ ๋ง๋ค์ด์ง์ง๋ ์์๋ค.
์ง์ ๊ทธ ๋ฉํฐ์์ด์ ํธ ์ํฌํ๋ก๋ฅผ ๊ตฌํํด์ ๋ถ์ด๋ฉด ๋น์ฐํ ๋ง๋ค ์๋ ์๋๋ฐ, ๊ทธ๊ฑธ ์ง์ ์ง์ํด์ฃผ์ง ์๋๋ค.
langchain๋ง ์ฌ์ฉํด์ ๋ฉํฐ์์ด์ ํธ ๊ตฌ์กฐ๋ฅผ ์ก์ผ๋ ค๋ฉด, ์ด๋ฐ ์์ผ๋ก ์ง์ ๋ค ๊ตฌ์กฐ๋ฅผ ์ก์์ผ ํ๋ค.
์์ด์ ํธ๋ค ์ด๊ธฐํํ๊ณ
์์ด์ ํธ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ๋ถ๊ธฐ ๋ฐ ํ์์กฐ์น๋ค์ ๋ค ํ๋ํ๋ ์ง์ผ ํ๋ค.
์ด๋ฐ๊ฑธ ๊ตฌ์กฐํํด์ ์ ๊ณตํ๋ ๊ฒ์ด langgraph๋ค.

์ ๋์ํ๊ธด ํ๋ค.
์์ ์ฝ๋ ์ ์ฒด
"""
LangChain ๊ธฐ๋ณธ ๊ธฐ๋ฅ๋ง์ผ๋ก ๊ตฌํํ ์๋ ๋ถ๋ฅ ๊ธฐ๋ฐ ๋ฉํฐ ์์ด์ ํธ ์์
์ด ์์ ๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด ์์ต๋๋ค:
1. Intro ์์ด์ ํธ: ์ฌ์ฉ์ ์
๋ ฅ์ ์๋๋ฅผ ๋ถ๋ฅ (HELP vs SMALLTALK)
2. Help ์์ด์ ํธ: ๋์/์ง๋ฌธ/๋ฌธ์ ํด๊ฒฐ์ด ํ์ํ ๊ฒฝ์ฐ ์ ๋ฌธ์ ์ธ ๋ต๋ณ ์ ๊ณต
3. Smalltalk ์์ด์ ํธ: ์ผ์๋ํ/์ธ์ฌ/์ก๋ด์ ์น๊ทผํ๊ฒ ์๋ต
๊ฐ ์์ด์ ํธ๋ ๊ณ ์ ํ ์ญํ ๊ณผ ํ๋กฌํํธ๋ฅผ ๊ฐ์ง๊ณ ,
Intro ์์ด์ ํธ์ ๋ถ๋ฅ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ ์ ํ ์ ๋ฌธ ์์ด์ ํธ๊ฐ ์ ํ๋ฉ๋๋ค.
"""
import os
from dotenv import load_dotenv
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# ํ๊ฒฝ๋ณ์ ๋ก๋
load_dotenv()
class Agent:
"""๊ฐ๋จํ ์์ด์ ํธ ํด๋์ค"""
def __init__(self, name, role, prompt_template, llm):
self.name = name
self.role = role
self.prompt = ChatPromptTemplate.from_template(prompt_template)
self.llm = llm
self.output_parser = StrOutputParser()
self.chain = self.prompt | self.llm | self.output_parser
def run(self, input_data):
"""์์ด์ ํธ ์คํ"""
print(f"\n๐ค {self.name} ์์ด์ ํธ๊ฐ ์์
์ค...")
print(f"์ญํ : {self.role}")
print("-" * 50)
try:
result = self.chain.invoke(input_data)
print(f"โ
{self.name} ์๋ฃ!")
return result
except Exception as e:
print(f"โ {self.name} ์ค๋ฅ: {str(e)}")
return None
class MultiAgentSystem:
"""์๋ ๋ถ๋ฅ ๊ธฐ๋ฐ ๋ฉํฐ ์์ด์ ํธ ์์คํ
"""
def __init__(self, llm):
self.llm = llm
self.agents = {}
self.setup_agents()
def setup_agents(self):
"""์์ด์ ํธ๋ค์ ์ค์ """
# 1. Intro ์์ด์ ํธ - ์๋ ๋ถ๋ฅ
intro_prompt = """
๋น์ ์ ์ฌ์ฉ์์ ์๋๋ฅผ ๋ถ์ํ๋ ์ ๋ฌธ๊ฐ์
๋๋ค.
์ฌ์ฉ์์ ์
๋ ฅ์ ๋ถ์ํ๊ณ ๋ค์ ์ค ํ๋๋ก ๋ถ๋ฅํด์ฃผ์ธ์:
๋ถ๋ฅ ์ต์
:
- HELP: ๋์์ด๋ ๋ฌธ์ ํด๊ฒฐ์ด ํ์ํ ๊ฒฝ์ฐ (์ง๋ฌธ, ๊ฐ์ด๋ ์์ฒญ, ํํ ๋ฆฌ์ผ, ๋ฌธ์ ํด๊ฒฐ ๋ฑ)
- SMALLTALK: ์ผ์ ๋ํ๋ ์ก๋ด (์ธ์ฌ, ๋ ์จ, ๊ฐ์ ํํ, ๊ฐ์ธ์ ์ด์ผ๊ธฐ ๋ฑ)
์ฌ์ฉ์ ์
๋ ฅ: {user_input}
์๋ต ํ์:
๋ถ๋ฅ: [HELP ๋๋ SMALLTALK]
์ด์ : [๋ถ๋ฅํ ์ด์ ๋ฅผ ํ ์ค๋ก ์ค๋ช
]
๋ถ๋ฅ๋ง ๋ช
ํํ๊ฒ ํด์ฃผ์ธ์.
"""
# 2. Help ์์ด์ ํธ - ๋์ ๋ฐ ๋ฌธ์ ํด๊ฒฐ
help_prompt = """
๋น์ ์ ์น์ ํ๊ณ ์ง์์ด ํ๋ถํ ๋์ฐ๋ฏธ์
๋๋ค.
์ฌ์ฉ์์ ์ง๋ฌธ์ด๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ฃผ์ธ์.
์ฌ์ฉ์ ์ง๋ฌธ: {user_input}
๋ค์๊ณผ ๊ฐ์ด ๋์์ ์ ๊ณตํด์ฃผ์ธ์:
- ๋ช
ํํ๊ณ ๊ตฌ์ฒด์ ์ธ ๋ต๋ณ ์ ๊ณต
- ํ์์ ๋จ๊ณ๋ณ ๊ฐ์ด๋ ์ ๊ณต
- ์ถ๊ฐ ์ฐธ๊ณ ์ฌํญ์ด๋ ํ ํฌํจ
- ์ดํดํ๊ธฐ ์ฌ์ด ์ค๋ช
์ฌ์ฉ
์ ๋ฌธ์ ์ด๋ฉด์๋ ์น๊ทผํ๊ฒ ๋ต๋ณํด์ฃผ์ธ์.
"""
# 3. Smalltalk ์์ด์ ํธ - ์ผ์ ๋ํ
smalltalk_prompt = """
๋น์ ์ ์น๊ทผํ๊ณ ๊ณต๊ฐ๋ฅ๋ ฅ์ด ๋ฐ์ด๋ ๋ํ ์๋์
๋๋ค.
์ฌ์ฉ์์ ์์ฐ์ค๋ฌ์ด ์ผ์ ๋ํ๋ฅผ ๋๋์ธ์.
์ฌ์ฉ์ ๋ง: {user_input}
๋ค์๊ณผ ๊ฐ์ด ๋ํํด์ฃผ์ธ์:
- ๋ฐ๋ปํ๊ณ ์น๊ทผํ ํค ์ฌ์ฉ
- ์ ์ ํ ๊ฐ์ ํํ๊ณผ ๊ณต๊ฐ
- ์์ฐ์ค๋ฌ์ด ๋ํ ํ๋ฆ ์ ์ง
- ํ์์ ๊ด๋ จ๋ ์ง๋ฌธ์ด๋ ์ฃผ์ ํ์ฅ
ํธ์ํ๊ณ ์ฆ๊ฑฐ์ด ๋ํ๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์.
"""
# ์์ด์ ํธ ์์ฑ
self.agents['intro'] = Agent(
"Intro",
"์ฌ์ฉ์ ์๋ ๋ถ๋ฅ",
intro_prompt,
self.llm
)
self.agents['help'] = Agent(
"Help",
"๋์ ๋ฐ ๋ฌธ์ ํด๊ฒฐ",
help_prompt,
self.llm
)
self.agents['smalltalk'] = Agent(
"Smalltalk",
"์ผ์ ๋ํ ๋ฐ ์ก๋ด",
smalltalk_prompt,
self.llm
)
def classify_intent(self, user_input):
"""์ฌ์ฉ์ ์๋ ๋ถ๋ฅ"""
print("๏ฟฝ ์ฌ์ฉ์ ์๋๋ฅผ ๋ถ์ ์ค...")
result = self.agents['intro'].run({"user_input": user_input})
if not result:
return "HELP" # ๊ธฐ๋ณธ๊ฐ
# ๋ถ๋ฅ ๊ฒฐ๊ณผ ํ์ฑ
if "HELP" in result.upper():
return "HELP"
elif "SMALLTALK" in result.upper():
return "SMALLTALK"
else:
return "HELP" # ๊ธฐ๋ณธ๊ฐ
def run_conversation(self, user_input):
"""๋ํ ์์คํ
์คํ"""
print("๐ ๋ฉํฐ ์์ด์ ํธ ๋ํ ์์คํ
์์!")
print(f"์ฌ์ฉ์: {user_input}")
print("=" * 60)
# 1๋จ๊ณ: ์๋ ๋ถ๋ฅ
intent = self.classify_intent(user_input)
print(f"\n๐ฏ ๋ถ๋ฅ ๊ฒฐ๊ณผ: {intent}")
print("=" * 60)
# 2๋จ๊ณ: ํด๋น ์์ด์ ํธ ์คํ
if intent == "HELP":
response = self.agents['help'].run({"user_input": user_input})
else: # SMALLTALK
response = self.agents['smalltalk'].run({"user_input": user_input})
if response:
print(f"\n๏ฟฝ ์ต์ข
์๋ต:")
print(response)
print("\n" + "=" * 60)
return response
def main():
print("๐ LangChain ์๋ ๋ถ๋ฅ ๊ธฐ๋ฐ ๋ฉํฐ ์์ด์ ํธ ์์คํ
")
print("=" * 50)
# API ํค ํ์ธ
api_key = os.getenv("GOOGLE_API_KEY")
if not api_key:
print("โ GOOGLE_API_KEY๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค.")
print("๐ก .env ํ์ผ์ API ํค๋ฅผ ์ค์ ํด์ฃผ์ธ์.")
return
try:
# Gemini ๋ชจ๋ธ ์ด๊ธฐํ
llm = ChatGoogleGenerativeAI(
model="gemini-2.0-flash",
temperature=0.7,
google_api_key=api_key
)
# ๋ฉํฐ ์์ด์ ํธ ์์คํ
์์ฑ
multi_agent = MultiAgentSystem(llm)
print("์์คํ
์ด ์ค๋น๋์์ต๋๋ค!")
print("\n๐ก ์ฌ์ฉ๋ฒ:")
print("- ์ง๋ฌธ์ด๋ ๋์์ด ํ์ํ๋ฉด โ Help ์์ด์ ํธ๊ฐ ์๋ต")
print("- ์ธ์ฌ๋ ์ผ์ ๋ํ๋ฅผ ํ๋ฉด โ Smalltalk ์์ด์ ํธ๊ฐ ์๋ต")
print("- 'quit' ๋๋ '์ข
๋ฃ'๋ฅผ ์
๋ ฅํ๋ฉด ์ข
๋ฃ")
print("\n" + "=" * 50)
# ๋ํํ ๋ฃจํ
while True:
try:
user_input = input("\n๐ค ๋น์ : ").strip()
if user_input.lower() in ['quit', 'exit', '์ข
๋ฃ', '๋']์ฐธ์กฐ
https://docs.langchain.com/oss/python/langchain/overview
https://www.samsungsds.com/kr/insights/what-is-langchain.html