๐Ÿ”จ[๊ฐœ๋ฐœ] Langchain์ด๋ž€?

manduยท2025๋…„ 10์›” 15์ผ

[๊ฐœ๋ฐœ]

๋ชฉ๋ก ๋ณด๊ธฐ
8/9

1. LangChain์ด๋ž€?

LangChain์€ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM, Large Language Model) ์„ ํ™œ์šฉํ•œ
AI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ž„.

LLM(GPT, Claude, Gemini ๋“ฑ)์€ ์ด๋ฏธ ๋‹ค์–‘ํ•œ ์ง€์‹์— ๊ธฐ๋ฐ˜ํ•ด ํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
ํŠน์ • ๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋‚˜ ์‚ฌ๋‚ด ๋ฌธ์„œ์ฒ˜๋Ÿผ ํ›ˆ๋ จ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Œ.

LangChain์€ ์ด๋Ÿฐ LLM์˜ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด,
์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์—ฐ๊ฒฐ, ํ”„๋กฌํ”„ํŠธ ์ฒด์ธ ๊ตฌ์„ฑ, RAG ๊ฒ€์ƒ‰ ๊ตฌ์กฐ ํ†ตํ•ฉ ๋“ฑ์„ ์ง€์›
์ฆ‰, ๋‹จ์ˆœํžˆ ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•˜๋Š” ์ˆ˜์ค€์„ ๋„˜์–ด,
โ€œLLM์„ ํ™œ์šฉํ•œ ์‹ค์ œ ์„œ๋น„์Šค ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์—”์ง„โ€ ์—ญํ• ์„ ์ˆ˜ํ–‰


2. LangChain์ด ์ค‘์š”ํ•œ ์ด์œ 

LLM์€ ์ผ๋ฐ˜์ ์ธ ์งˆ๋ฌธ์—๋Š” ์ž˜ ๋‹ตํ•˜์ง€๋งŒ,
์กฐ์ง ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋‚˜ ์ตœ์‹  ์ •๋ณด์™€ ๊ด€๋ จ๋œ ์งˆ๋ฌธ์—๋Š” ์ทจ์•ฝํ•จ.
์˜ˆ๋ฅผ ๋“ค์–ด:

โ€œ์šฐ๋ฆฌ ํšŒ์‚ฌ์—์„œ ํŒ๋งค ์ค‘์ธ X1000 ๋ชจ๋ธ์˜ ๋‹จ๊ฐ€๊ฐ€ ์–ผ๋งˆ์ธ๊ฐ€์š”?โ€

โ†’ GPT๋Š” ์ด ์ •๋ณด๋ฅผ ๋ชจ๋ฆ„.
ํ•˜์ง€๋งŒ LangChain์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ๋‚ด DB๋‚˜ ๋ฌธ์„œ์—์„œ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ด
์ •ํ™•ํ•œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ

์ฆ‰, LangChain์€

  • LLM์ด ๊ธฐ์กด์— ํ•™์Šตํ•˜์ง€ ์•Š์€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ ,
  • ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ์ฒด์ธ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ๋ชจ๋ธ์˜ ์‘๋‹ต ํ’ˆ์งˆ์„ ๋†’์ด๋ฉฐ,
  • RAG(๊ฒ€์ƒ‰ ์ฆ๊ฐ• ์ƒ์„ฑ) ๊ฐ™์€ ์ตœ์‹  ์›Œํฌํ”Œ๋กœ๋ฅผ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ

๐Ÿ”จ[๊ฐœ๋ฐœ] RAG๋ž€?


3. LangChain์˜ ์žฅ์ 

ํ•ญ๋ชฉ์„ค๋ช…
LLM ์žฌํ›ˆ๋ จ ๋ถˆํ•„์š”๊ธฐ์กด ๋ชจ๋ธ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅ
๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘RAG, QA ์ฑ—๋ด‡, ์š”์•ฝ๊ธฐ ๋“ฑ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
์œ ์—ฐํ•œ ๊ตฌ์กฐ์ฒด์ธยท์—์ด์ „ํŠธยท๋ฉ”๋ชจ๋ฆฌ ๋“ฑ ๋ชจ๋“ˆ ์กฐํ•ฉ์œผ๋กœ ๋‹ค์–‘ํ•œ ์›Œํฌํ”Œ๋กœ ์„ค๊ณ„
๊ฐ•๋ ฅํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐํ™œ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค ์ƒํƒœ๊ณ„์™€ ๋ฌธ์„œ, ์˜ˆ์‹œ ์ฝ”๋“œ ํ’๋ถ€

4. LangChain์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

๊ตฌ์„ฑ ์š”์†Œ์„ค๋ช…
LLM ์ธํ„ฐํŽ˜์ด์ŠคGPT, Claude, PaLM ๋“ฑ ๋‹ค์–‘ํ•œ ์–ธ์–ด ๋ชจ๋ธ๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ํ™”๋œ API ์ œ๊ณต. ๋ชจ๋ธ ๊ต์ฒด ์‹œ ์ฝ”๋“œ ์ˆ˜์ • ์ตœ์†Œํ™” ๊ฐ€๋Šฅ
ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ (PromptTemplate)์ผ๊ด€๋œ ์งˆ์˜ ํ˜•์‹์„ ์ •์˜ํ•˜์—ฌ ๋ชจ๋ธ ์ž…๋ ฅ์„ ๊ตฌ์กฐํ™”ํ•˜๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ƒ์„ฑํ•จ
์ฒด์ธ (Chain)์—ฌ๋Ÿฌ ์ž‘์—… ๋‹จ๊ณ„๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•ด ํ•˜๋‚˜์˜ ์ž๋™ํ™”๋œ ์‘๋‹ต ํŒŒ์ดํ”„๋ผ์ธ(workflow)์„ ๊ตฌ์„ฑํ•จ
์—์ด์ „ํŠธ (Agent)๋ชจ๋ธ์ด ์Šค์Šค๋กœ ํ•„์š”ํ•œ ๋„๊ตฌ๋‚˜ ๋‹จ๊ณ„๋ฅผ ํŒ๋‹จํ•˜์—ฌ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๋„๋ก ํ•จ
๊ฒ€์ƒ‰ ๋ชจ๋“ˆ (Retriever)์™ธ๋ถ€ ๋ฐ์ดํ„ฐ(๋ฌธ์„œ, DB, ์›น ๋“ฑ)๋ฅผ ์ž„๋ฒ ๋”ฉ ํ›„, ์˜๋ฏธ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰(Semantic Search)์œผ๋กœ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•จ
๋ฉ”๋ชจ๋ฆฌ (Memory)๋Œ€ํ™” ์ด๋ ฅ์ด๋‚˜ ๊ณผ๊ฑฐ ์ •๋ณด๋ฅผ ์ €์žฅยทํ™œ์šฉํ•˜์—ฌ ๋ฌธ๋งฅ์„ ์œ ์ง€ํ•˜๊ณ  ์‘๋‹ต์˜ ์ผ๊ด€์„ฑ์„ ํ™•๋ณดํ•จ
์ฝœ๋ฐฑ (Callback)์ฒด์ธ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ, ์˜ค๋ฅ˜, ๋กœ๊ทธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•จ

4.1 LLM ์ธํ„ฐํŽ˜์ด์Šค

GPT, Claude, PaLM ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชจ๋ธ๊ณผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ API๋ฅผ ์ œ๊ณต
โ†’ ๋ชจ๋ธ ๊ต์ฒด ์‹œ ์ฝ”๋“œ ์ˆ˜์ • ์ตœ์†Œํ™”

from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o", temperature=0)

4.2 ์ฒด์ธ(Chain)

LangChain์˜ ์ค‘์‹ฌ์€ ์ฒด์ธ(Chain)
์ฒด์ธ์€ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๋ถ€ํ„ฐ ๋ชจ๋ธ์˜ ์ถœ๋ ฅ๊นŒ์ง€, ํ•˜๋‚˜์˜ ํŒŒ์ดํ”„๋ผ์ธ(workflow)์„ ์˜๋ฏธ

๊ทธ๋ฆฌ๊ณ  ์ฒด์ธ์„ ์ด๋ฃจ๋Š” ๋งํฌ(Link)
๋งํฌ๋Š” ์ฒด์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•˜๋‚˜์˜ ๋‹จ์œ„ ์ž‘์—…(step) ์œผ๋กœ,
์—ฌ๋Ÿฌ ๋งํฌ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ(์ฒด์ธ)์„ ํ˜•์„ฑ

์ฆ‰,

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…(๋งํฌ)์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•œ ์‹คํ–‰ ํ๋ฆ„(์ฒด์ธ)

  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ์ฒด์ธ์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ์Œ

    1. ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ •์ œ (Input Formatting)
    2. LLM์— ์งˆ์˜ (Query)
    3. ๊ฒฐ๊ณผ ์ •๋ฆฌ ๋ฐ ์ถœ๋ ฅ (Output Formatting)
    4. ๋ฒˆ์—ญ
  • LangChain์—์„œ๋Š” ์ด ์ผ๋ จ์˜ ๋‹จ๊ณ„๋ฅผ chain() ํ•จ์ˆ˜๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ

    chain([
      retrieve_data_from_database(),
      send_data_to_language_model(),
      format_output(),
      translate_output_in_target_language()
    ])
  • ์ด์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๋งํฌ(Link) ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ฒด์ธ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ

  • ๊ฐ ๋งํฌ๋Š” ์ž‘์€ ๋‹จ์œ„์˜ ์ž‘์—…์ด๋ฉฐ, ์ˆœ์„œ์™€ ๊ตฌ์„ฑ์„ ์ž์œ ๋กญ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ

4.3 ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ (PromptTemplate)

์งˆ๋ฌธ ๊ตฌ์กฐ๋ฅผ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ •์˜ํ•˜์—ฌ, ์ผ๊ด€๋˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์งˆ์˜ ํ˜•ํƒœ๋ฅผ ์ƒ์„ฑ

from langchain.prompts import PromptTemplate

template = PromptTemplate.from_template(
    "๋„ˆ๋Š” HR ๋„์šฐ๋ฏธ์•ผ. ์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {question}"
)
prompt = template.format(question="์—ฐ์ฐจ ๊ทœ์ • ์•Œ๋ ค์ค˜")

4.4 ์—์ด์ „ํŠธ (Agent)

์—์ด์ „ํŠธ๋Š” ๋‹จ์ˆœํžˆ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด,
์Šค์Šค๋กœ ์–ด๋–ค ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜๊ณ  ๊ทธ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ

์ฆ‰, ์ •ํ•ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ์ฒด์ธ(Chain) ๊ณผ ๋‹ฌ๋ฆฌ,
์—์ด์ „ํŠธ๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ์–ด๋–ค ๋‹จ๊ณ„์™€ ๋„๊ตฌ๋ฅผ ์“ธ์ง€ ์Šค์Šค๋กœ ํŒ๋‹จ

# pip install langchain langchain-openai

from langchain.agents import initialize_agent, load_tools
from langchain_openai import ChatOpenAI

# 1) ์‚ฌ์šฉํ•  LLM ์ •์˜
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# 2) ์‚ฌ์šฉํ•  ๋„๊ตฌ(tool) ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
# LangChain์€ 'tools'๋ผ๋Š” ํ‘œ์ค€ ๋ชจ๋“ˆ์— ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ๋“ฑ๋ก๋˜์–ด ์žˆ์Œ
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# - serpapi: ์›น ๊ฒ€์ƒ‰์šฉ API
# - llm-math: ์ˆ˜ํ•™ ๊ณ„์‚ฐ๊ธฐ ๊ธฐ๋Šฅ

# 3) ์—์ด์ „ํŠธ ์ดˆ๊ธฐํ™”
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent_type="zero-shot-react-description",  # ReAct ํŒจํ„ด ๊ธฐ๋ฐ˜
    verbose=True
)

# 4) ์‹คํ–‰ ์˜ˆ์‹œ
query = "๋Œ€ํ•œ๋ฏผ๊ตญ ์ˆ˜๋„์˜ ์œ„๋„์— 5๋ฅผ ๋”ํ•˜๋ฉด ์–ผ๋งˆ์•ผ?"
agent.run(query)

# LLM์ด ์ง์ ‘ โ€œ๊ฒ€์ƒ‰ โ†’ ๊ณ„์‚ฐ โ†’ ๋‹ต๋ณ€ ์ƒ์„ฑโ€ ๊ณผ์ • ์ „์ฒด๋ฅผ ์Šค์Šค๋กœ ํŒ๋‹จํ•˜๊ณ  ์‹คํ–‰

4.5 ๊ฒ€์ƒ‰ ๋ชจ๋“ˆ (Retrieval)

RAG(Retrieval-Augmented Generation) ๊ตฌํ˜„์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ
๋ฌธ์„œ, PDF, DB, ์›น ๋“ฑ ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ์ €์žฅํ•˜๊ณ ,
์‚ฌ์šฉ์ž ์งˆ์˜์™€ ์˜๋ฏธ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰

# โœ… 0. ํŒจํ‚ค์ง€ ์„ค์น˜
# pip install langchain langchain-openai faiss-cpu

# โœ… 1. ์˜ˆ์‹œ ๋ฌธ์„œ ์ •์˜
docs = [
    "์—ฐ์ฐจ๋Š” ์ž…์‚ฌ ์›” ๊ธฐ์ค€์œผ๋กœ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ตœ๋Œ€ 25์ผ๊นŒ์ง€ ๋ˆ„์  ๊ฐ€๋Šฅํ•จ.",
    "๊ฒฝ์กฐ์‚ฌ ํœด๊ฐ€ ๊ทœ์ •: ๊ฒฐํ˜ผ ์‹œ 5์ผ, ๋ถ€๋ชจ์ƒ 7์ผ, ์ž๋…€ ์ถœ์‚ฐ 3์ผ ๋ถ€์—ฌ๋จ.",
    "์ถœ์žฅ๋น„๋Š” ์‚ฌ์ „ ์Šน์ธ ํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์˜์ˆ˜์ฆ ์ œ์ถœ์ด ํ•„์ˆ˜์ž„."
]

# โœ… 2. ๋ฌธ์„œ๋ฅผ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ (Embedding)
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS

embedding = OpenAIEmbeddings()          # OpenAI์˜ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์‚ฌ์šฉ
vector_db = FAISS.from_texts(docs, embedding)  # ๋ฌธ์„œ ์ž„๋ฒ ๋”ฉ ํ›„ ๋ฒกํ„ฐDB(Faiss)์— ์ €์žฅ

# โœ… 3. ๊ฒ€์ƒ‰๊ธฐ (Retriever) ๊ตฌ์„ฑ
retriever = vector_db.as_retriever(search_kwargs={"k": 2})  # ์œ ์‚ฌ ๋ฌธ์„œ 2๊ฐœ ๋ฐ˜ํ™˜ ์„ค์ •

# โœ… 4. ์˜ˆ์‹œ ์งˆ์˜ ์ˆ˜ํ–‰
query = "๊ฒฐํ˜ผํ•˜๋ฉด ๋ฉฐ์น  ํœด๊ฐ€์ž„?"
similar_docs = retriever.get_relevant_documents(query)

# โœ… 5. ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print("๐Ÿงพ [์งˆ๋ฌธ]", query)
for i, doc in enumerate(similar_docs, 1):
    print(f"{i}. {doc.page_content}")

4.6 ๋ฉ”๋ชจ๋ฆฌ (Memory)

๋Œ€ํ™”ํ˜• ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ด์ „ ๋Œ€ํ™” ๋งฅ๋ฝ์ด ํ•„์š”ํ•จ
LangChain์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋“ˆ์€ ์ด๋Ÿฌํ•œ ๋Œ€ํ™” ์ด๋ ฅ ์œ ์ง€ ๋ฐ ์ฐธ์กฐ๋ฅผ ์ง€์›ํ•จ

  • ์ตœ๊ทผ ๋Œ€ํ™”๋งŒ ๊ธฐ์–ตํ•˜๋Š” ๋‹จ์ˆœ ๋ฉ”๋ชจ๋ฆฌ
  • ์ „์ฒด ๋Œ€ํ™” ์ค‘ ํ•ต์‹ฌ๋งŒ ์ถ”์ถœํ•ด ๊ธฐ์–ตํ•˜๋Š” ์š”์•ฝ ๋ฉ”๋ชจ๋ฆฌ
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()

4.7 ์ฝœ๋ฐฑ (Callback)

LangChain ๋‚ด๋ถ€ ์‹คํ–‰ ๊ณผ์ •(์˜ˆ: ์ฒด์ธ ํ˜ธ์ถœ, ์—๋Ÿฌ, ์‘๋‹ต ์‹œ๊ฐ„ ๋“ฑ)์„
๋กœ๊น…ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ด๋ฒคํŠธ ํ›… ์‹œ์Šคํ…œ.

from langchain.callbacks import StdOutCallbackHandler
handler = StdOutCallbackHandler()

5. ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ด๊ธด Langchain ์‚ฌ์šฉ ์˜ˆ์‹œ

# โœ… ํŒจํ‚ค์ง€ ์„ค์น˜
# pip install langchain langchain-openai faiss-cpu tiktoken

# 1๏ธโƒฃ LLM ์ธํ„ฐํŽ˜์ด์Šค
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# 2๏ธโƒฃ ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ
from langchain.prompts import PromptTemplate
template = PromptTemplate.from_template(
    "๋„ˆ๋Š” HR ๋„์šฐ๋ฏธ์•ผ. ์•„๋ž˜ ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•ด์ค˜.\n\n"
    "์งˆ๋ฌธ: {question}\n"
    "์ฐธ๊ณ  ์ •๋ณด: {context}\n\n"
    "๋‹ต๋ณ€:"
)

# 3๏ธโƒฃ ๋ฌธ์„œ โ†’ ๋ฒกํ„ฐDB ๊ตฌ์„ฑ (Retrieval)
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS

docs = [
    "์—ฐ์ฐจ๋Š” ์ž…์‚ฌ ์›” ๊ธฐ์ค€์œผ๋กœ ๋ฐœ์ƒํ•˜๋ฉฐ ์ตœ๋Œ€ 25์ผ๊นŒ์ง€ ๋ˆ„์  ๊ฐ€๋Šฅํ•จ.",
    "๊ฒฝ์กฐ์‚ฌ ํœด๊ฐ€ ๊ทœ์ •: ๊ฒฐํ˜ผ ์‹œ 5์ผ, ๋ถ€๋ชจ์ƒ 7์ผ, ์ž๋…€ ์ถœ์‚ฐ 3์ผ ๋ถ€์—ฌ๋จ.",
    "์ถœ์žฅ๋น„๋Š” ์‚ฌ์ „ ์Šน์ธ ํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์˜์ˆ˜์ฆ ์ œ์ถœ์ด ํ•„์ˆ˜์ž„."
]

embedding = OpenAIEmbeddings()
vdb = FAISS.from_texts(docs, embedding)
retriever = vdb.as_retriever(search_kwargs={"k": 2})

# 4๏ธโƒฃ ๋ฉ”๋ชจ๋ฆฌ (์ด์ „ ๋Œ€ํ™” ์œ ์ง€)
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

# 5๏ธโƒฃ ์ฝœ๋ฐฑ (์‹คํ–‰ ๋กœ๊ทธ ์ถœ๋ ฅ)
from langchain.callbacks import StdOutCallbackHandler
handler = StdOutCallbackHandler()

# 6๏ธโƒฃ ์ฒด์ธ ๊ตฌ์„ฑ (๊ฒ€์ƒ‰ + ํ”„๋กฌํ”„ํŠธ + LLM)
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=retriever,
    chain_type="stuff",
    return_source_documents=True,
    verbose=True
)

# 7๏ธโƒฃ ์—์ด์ „ํŠธ ๊ตฌ์„ฑ (๊ฒ€์ƒ‰๊ธฐ + ๊ณ„์‚ฐ๊ธฐ ๋“ฑ ๋„๊ตฌ ์กฐํ•ฉ)
from langchain.agents import initialize_agent, load_tools
tools = load_tools(["llm-math"], llm=llm)
agent = initialize_agent(
    tools=tools + [{"name": "retriever", "description": "ํšŒ์‚ฌ ๋ฌธ์„œ ๊ฒ€์ƒ‰", "func": qa_chain.run}],
    llm=llm,
    agent_type="zero-shot-react-description",
    verbose=True,
    memory=memory,
    handle_parsing_errors=True
)

# 8๏ธโƒฃ ์˜ˆ์‹œ ์‹คํ–‰
query1 = "๊ฒฐํ˜ผํ•˜๋ฉด ํœด๊ฐ€ ๋ฉฐ์น  ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด?"
response1 = agent.run(query1, callbacks=[handler])

query2 = "์ด์ „ ๋Œ€ํ™”์—์„œ ๋งํ•œ ๊ทœ์ • ๊ธฐ์ค€์œผ๋กœ ์ถœ์žฅ๋น„ ๊ทœ์ •๋„ ์•Œ๋ ค์ค˜."
response2 = agent.run(query2, callbacks=[handler])

print("\n๐Ÿ’ฌ [1์ฐจ ๋‹ต๋ณ€]", response1)
print("๐Ÿ’ฌ [2์ฐจ ๋‹ต๋ณ€]", response2)
profile
๋งŒ๋‘๋Š” ๋ชฉ๋ง๋ผ

0๊ฐœ์˜ ๋Œ“๊ธ€