๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ ์ผ์ง€ ๐Ÿ‘ฉ‍๐Ÿ’ป

[์‰ฌ์›€] LangChain์œผ๋กœ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” AI ์—์ด์ „ํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹ค์Šต

by chuyj15 2025. 8. 20.
728x90
๋ฐ˜์‘ํ˜•
SMALL
import os
os.environ["OPENAI_API_KEY"] = "api key ์ž…๋ ค๋ ฅํ•˜๊ธฐ"  # OpenAI API ํ‚ค๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ • (๋ณด์•ˆ์ƒ ์‹ค์ œ ํ‚ค๋Š” 'sk-...' ํ˜•ํƒœ๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•จ)

from langchain_core.tools import tool  # ๋žญ์ฒด์ธ์ธ์—์„œ ํˆด(๋„๊ตฌ)์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ž„ํฌํŠธ
from langchain_openai import ChatOpenAI  # OpenAI LLM์„ ๋žญ์ฒด์ธ์ธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค
from langchain.agents import initialize_agent, AgentType, Tool  # ์—์ด์ „ํŠธ ์ดˆ๊ธฐํ™” ๋ฐ ๋„๊ตฌ ๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ํด๋ž˜์Šค๋“ค

# @tool: ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ๋žญ์ฒด์ธ ๋„๊ตฌ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ
# ๊ฐ„๋‹จํ•œ ๋ง์…ˆ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ๋žญ์ฒด์ธ ํˆด๋กœ ๋“ฑ๋ก
@tool
def add(a: int, b: int) -> int:
    """๋‘ ์ˆซ์ž๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค."""
    return a + b

# ๊ฐ„๋‹จํ•œ ๋บ„์…ˆ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ๋žญ์ฒด์ธ ํˆด๋กœ ๋“ฑ๋ก
@tool
def subtract(a: int, b: int) -> int:
    """๋‘ ์ˆซ์ž๋ฅผ ๋บ๋‹ˆ๋‹ค."""
    return a - b

# ์œ„์—์„œ ์ •์˜ํ•œ ํˆด๋“ค์„ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ์„ฑ
tools = [add, subtract]

# GPT-4o ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” OpenAI LLM์„ ์ƒ์„ฑ (์˜จ๋„=0์€ ์ผ๊ด€๋œ ์‘๋‹ต์„ ์œ ๋„)
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# ๋žญ์ฒด์ธ์˜ Function Calling ๊ธฐ๋ฐ˜ ์—์ด์ „ํŠธ๋ฅผ ์ดˆ๊ธฐํ™”
# LLM์ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ถ„์„ํ•ด ์ ์ ˆํ•œ ํˆด(add/subtract)์„ ์ž๋™์œผ๋กœ ์„ ํƒํ•ด ํ˜ธ์ถœ
agent = initialize_agent(
    tools=tools,                      # ์‚ฌ์šฉํ•  ํˆด ๋ชฉ๋ก
    llm=llm,                          # ์‚ฌ์šฉํ•  LLM (GPT-4o)
    agent=AgentType.OPENAI_FUNCTIONS,  # Function Calling ๊ธฐ๋ฐ˜ ์—์ด์ „ํŠธ ์‚ฌ์šฉ
    verbose=True                      # ์‹คํ–‰ ๊ณผ์ •์„ ์ถœ๋ ฅ
)

# ์‚ฌ์šฉ์ž ์งˆ์˜ ์ž…๋ ฅ์— ๋Œ€ํ•ดํ•ด ์—์ด์ „ํŠธ๊ฐ€ ์ ์ ˆํ•œ ํˆด(subtract)์„ ์„ ํƒํ•˜์—ฌ ์‹คํ–‰
response = agent.invoke("17์—์„œ 3์„ ๋นผ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๊ฒŒ ์—๋ฒ ๋ฒ ๋ฒ ใ…”ใ…‚")

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print("์‘๋‹ต:", response)

 

 

๊ฒฐ๊ณผ 

17์—์„œ 3์„ ๋นผ๋ฉด 14๊ฐ€ ๋ฉ๋‹ˆ๋‹ค!

17์—์„œ 3์„ ๋นผ๋ฉด 14์ž…๋‹ˆ๋‹ค.

 

 

 


๐Ÿ“‹ ์ฝ”๋“œ ๋‹จ๊ณ„๋ณ„ ๋ถ„์„

1. ํ™˜๊ฒฝ ์„ค์ •

 
 
python
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-..."
  • OpenAI API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ฆ ํ‚ค ์„ค์ •
  • ๋ณด์•ˆ ์ฃผ์˜: ์‹ค์ œ๋กœ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋‚˜ .env ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ

2. ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž„ํฌํŠธ

 
 
python
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType, Tool
  • @tool: ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ๋žญ์ฒด์ธ ๋„๊ตฌ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ
  • ChatOpenAI: OpenAI์˜ GPT ๋ชจ๋ธ์„ ๋žญ์ฒด์ธ์—์„œ ์‚ฌ์šฉ
  • initialize_agent: AI ์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜

3. ๋„๊ตฌ(Tools) ์ •์˜

 
 
python
@tool
def add(a: int, b: int) -> int:
    """๋‘ ์ˆซ์ž๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค."""
    return a + b

@tool
def subtract(a: int, b: int) -> int:
    """๋‘ ์ˆซ์ž๋ฅผ ๋บ๋‹ˆ๋‹ค."""
    return a - b

๐Ÿ”‘ ํ•ต์‹ฌ: @tool ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ AI๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋กœ ๋ณ€ํ™˜

4. ์—์ด์ „ํŠธ ๊ตฌ์„ฑ

 
 
python
tools = [add, subtract]
llm = ChatOpenAI(model="gpt-4o", temperature=0)
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True
)
  • Agent: AI๊ฐ€ ์ƒํ™ฉ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉ
  • OPENAI_FUNCTIONS: OpenAI์˜ Function Calling ๊ธฐ๋Šฅ ํ™œ์šฉ
  • verbose=True: ์‹คํ–‰ ๊ณผ์ •์„ ์ž์„ธํžˆ ๋ณด์—ฌ์คŒ

5. ์‹คํ–‰

 
 
python
response = agent.invoke("17์—์„œ 3์„ ๋นผ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๊ฒŒ ์—๋ฒ ๋ฒ ๋ฒ ใ…”ใ…‚")

๐Ÿค” ๋žญ์ฒด์ธ ํˆด ๋“ฑ๋ก์˜ ์˜๋ฏธ

์ผ๋ฐ˜ AI ์‘๋‹ต vs ๋žญ์ฒด์ธ ์—์ด์ „ํŠธ

๊ตฌ๋ถ„์ผ๋ฐ˜ AI๋žญ์ฒด์ธ ์—์ด์ „ํŠธ

์ฒ˜๋ฆฌ ๋ฐฉ์‹ ํ…์ŠคํŠธ๋กœ๋งŒ ๋‹ต๋ณ€ ์‹ค์ œ ํ•จ์ˆ˜ ์‹คํ–‰
์ •ํ™•์„ฑ ๊ณ„์‚ฐ ์‹ค์ˆ˜ ๊ฐ€๋Šฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ์ •ํ™•
ํ™•์žฅ์„ฑ ์ œํ•œ์  ๋ฌดํ•œ ํ™•์žฅ ๊ฐ€๋Šฅ

๐ŸŽฏ ์‹ค์ œ ์ฐจ์ด์  ์˜ˆ์‹œ

์ผ๋ฐ˜ AI ์งˆ๋ฌธ:

 
 
"17์—์„œ 3์„ ๋นผ๋ฉด?"
→ AI: "14์ž…๋‹ˆ๋‹ค" (ํ…์ŠคํŠธ ์ƒ์„ฑ)

๋žญ์ฒด์ธ ์—์ด์ „ํŠธ:

 
 
"17์—์„œ 3์„ ๋นผ๋ฉด?"
→ AI ์‚ฌ๊ณ : "๋บ„์…ˆ์ด ํ•„์š”ํ•˜๋„ค, subtract ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ž"
→ ์‹ค์ œ ์‹คํ–‰: subtract(17, 3)
→ ๊ฒฐ๊ณผ: 14 (์‹ค์ œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ)

๐Ÿš€ ๋žญ์ฒด์ธ ์—์ด์ „ํŠธ์˜ ์ง„์งœ ์žฅ์ 

1. ๋ณต์žกํ•œ ๋„๊ตฌ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ

 
 
python
@tool
def get_weather(city: str) -> str:
    """๋‚ ์”จ ์ •๋ณด ์กฐํšŒ"""
    return weather_api.get(city)

@tool
def send_email(to: str, content: str) -> str:
    """์ด๋ฉ”์ผ ๋ฐœ์†ก"""
    return email_service.send(to, content)

์‚ฌ์šฉ์ž: "์„œ์šธ ๋‚ ์”จ ํ™•์ธํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ john@email.com์— ๋ณด๋‚ด์ค˜" ์—์ด์ „ํŠธ:

  1. get_weather("์„œ์šธ") ์‹คํ–‰
  2. send_email("john@email.com", ๋‚ ์”จ๊ฒฐ๊ณผ) ์‹คํ–‰

2. ์ •ํ™•ํ•œ ๊ณ„์‚ฐ

 
 
python
# ์ผ๋ฐ˜ AI: "๋Œ€๋žต 123.45์ •๋„์ž…๋‹ˆ๋‹ค" (๋ถ€์ •ํ™•ํ•  ์ˆ˜ ์žˆ์Œ)
# ์—์ด์ „ํŠธ: calculate(๋ณต์žกํ•œ_์ˆ˜์‹) → ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ

3. ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ํ™œ์šฉ

 
 
python
@tool
def stock_price(symbol: str) -> float:
    """์‹ค์‹œ๊ฐ„ ์ฃผ์‹ ๊ฐ€๊ฒฉ"""
    return api.get_stock_price(symbol)

# "์‚ผ์„ฑ์ „์ž ์ฃผ๊ฐ€๊ฐ€ ์–ผ๋งˆ์•ผ?" → ์‹ค์‹œ๊ฐ„ API ํ˜ธ์ถœ

๐Ÿ’ก ์‹ค์ œ ์‹คํ–‰ ๊ณผ์ • (verbose=True)

 
 
> Entering new AgentExecutor chain...
๋‚˜๋Š” 17์—์„œ 3์„ ๋นผ๋Š” ๊ณ„์‚ฐ์„ ํ•ด์•ผ๊ฒ ๋‹ค.

Action: subtract
Action Input: {"a": 17, "b": 3}
Observation: 14
Thought: ๊ณ„์‚ฐ ์™„๋ฃŒ! 17์—์„œ 3์„ ๋นผ๋ฉด 14์ด๋‹ค.

Final Answer: 17์—์„œ 3์„ ๋นผ๋ฉด 14์ž…๋‹ˆ๋‹ค.

๐ŸŽฏ ๊ฒฐ๋ก 

๋žญ์ฒด์ธ ๋„๊ตฌ ๋“ฑ๋ก์˜ ํ•ต์‹ฌ ๊ฐ€์น˜:

  1. ์ •ํ™•์„ฑ: ์‹ค์ œ ํ•จ์ˆ˜ ์‹คํ–‰์œผ๋กœ ์˜ค๋ฅ˜ ๋ฐฉ์ง€
  2. ํ™•์žฅ์„ฑ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, API, ํŒŒ์ผ ์‹œ์Šคํ…œ ๋“ฑ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ
  3. ์ž๋™ํ™”: AI๊ฐ€ ์ƒํ™ฉ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์ž๋™ ์„ ํƒ
  4. ์‹ค์‹œ๊ฐ„์„ฑ: ์ตœ์‹  ๋ฐ์ดํ„ฐ์™€ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅ

๋‹จ์ˆœ ํ…์ŠคํŠธ ์ƒ์„ฑ์„ ๋„˜์–ด์„œ "AI๊ฐ€ ์‹ค์ œ๋กœ ํ–‰๋™ํ•  ์ˆ˜ ์žˆ๋Š”" ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋žญ์ฒด์ธ์˜ ์ง„์งœ ๋งค๋ ฅ์ž…๋‹ˆ๋‹ค! โœจ

 

 

 

#LangChain #OpenAI #AI์—์ด์ „ํŠธ #FunctionCalling #Python #AI๊ฐœ๋ฐœ #GPT4 #๋จธ์‹ ๋Ÿฌ๋‹ #์ž์—ฐ์–ด์ฒ˜๋ฆฌ #AI๋„๊ตฌ #ํ”„๋กœ๊ทธ๋ž˜๋ฐ #๊ฐœ๋ฐœ์ž #AI์ž…๋ฌธ #๊ฐœ๋ฐœํŒ #ํ…ŒํฌํŠธ๋ Œ๋“œ #์ธ๊ณต์ง€๋Šฅ #์ฝ”๋”ฉ #๊ฐœ๋ฐœ์ผ์ง€ #ํ…Œํฌ๋ธ”๋กœ๊ทธ #๊ฐœ๋ฐœ๊ณต๋ถ€ #AIํŠธ๋ Œ๋“œ #ํ”„๋ก ํŠธ์—”๋“œ #๋ฐฑ์—”๋“œ #๋ฐ์ดํ„ฐ์‚ฌ์ด์–ธ์Šค

728x90
๋ฐ˜์‘ํ˜•
LIST