langchain实现Function Calling功能
是一个用于构建大语言模型(LLM)应用的开发框架,支持 Python 和 JavaScript。
·
一、 LangChain 简介
LangChain 是一个用于构建大语言模型(LLM)应用的开发框架,支持 Python 和 JavaScript。它通过模块化设计简化了以下任务:
-
数据感知:集成外部数据源(如文档、数据库)
-
交互能力:调用 API、执行代码等动态操作
-
记忆管理:维护对话历史等上下文信息
核心组件:
-
Models:对接主流LLM(OpenAI、HuggingFace等)
-
Prompts:模板化提示词管理
-
Chains:多步骤任务流水线
-
Agents:自主决策调用工具
-
Memory:状态保持
-
Indexes:文档检索增强
二、 Function Calling 概念
Function Calling 是让LLM根据自然语言指令动态调用预定义函数的能力,典型场景:
-
天气查询 → 调用天气API
-
数学计算 → 执行代码
-
数据查询 → 搜索数据库
优势:
-
突破LLM的静态知识限制
-
实现实时数据交互
-
执行复杂逻辑运算
三、使用LangChain实现Function Calling
1、第一种方法
直接通过langchain的基本功能去调用
import json
import os
from dotenv import load_dotenv
from langchain_core.tools import tool
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
load_dotenv(override=True)
@tool
def add(a: int, b: int) -> int:
"""Adds two numbers together."""
return a + b
@tool
def subtract(a: int, b: int) -> int:
"""Subtracts two numbers."""
return a - b
llm = init_chat_model(
"gpt-4o-mini",
api_key = os.getenv("DMX_OPENAI_API_KEY"),
base_url = os.getenv("DMX_BASE_URL"),
model_provider="openai"
)
llm_tools = llm.bind_tools([add, subtract])
query = "12和15相差多少?"
messages = [
HumanMessage(query)
]
output = llm_tools.invoke(messages)
# 打印工具调用明细
print(output)
tool_load = json.dumps(output.tool_calls, indent=4)
print(tool_load)
# template.append(output)
# 创建新的消息列表
messages.append(output)
available_tools = {"add": add, "subtract": subtract}
for tool_call in output.tool_calls:
select_tool = available_tools[tool_call["name"]]
tool_message = select_tool.invoke(tool_call)
messages.append(tool_message)
second_output = llm_tools.invoke(messages)
for message in second_output:
print(message)
# print(json.dumps(message.model_dump(), indent=4, ensure_ascii=False))
print(second_output.content)
结果:
2、第二种方法
通过langchain的Agent去调用
import os
from dotenv import load_dotenv
from langchain.agents import AgentType, initialize_agent
from langchain_openai import ChatOpenAI
from langchain.tools import Tool, StructuredTool
from typing import Optional
from langchain.chat_models import init_chat_model
load_dotenv(override=True)
# 定义工具函数
def search_api(query: str) -> str:
"""模拟API调用"""
return f"结果: {query}"
def add_two_numbers(a: int, b: int) -> int:
"""模拟两个数字相加"""
return a + b
# 创建工具实例
tools = [
Tool(
name="SearchAPI",
func=search_api,
description = "用于查询实时信息"
),
# StructuredTool 来处理多参数工具:
StructuredTool.from_function(
func=add_two_numbers,
name="add_two_numbers",
description="用于计算两个数的和",
)
]
# 初始化Agent
# llm = ChatOpenAI(
# api_key = os.getenv("DMX_OPENAI_API_KEY"),
# base_url = os.getenv("DMX_BASE_URL"),
# model="gpt-3.5-turbo",
# temperature=0
# )
llm = init_chat_model(
"gpt-4o-mini",
api_key = os.getenv("DMX_OPENAI_API_KEY"),
base_url = os.getenv("DMX_BASE_URL"),
model_provider="openai"
)
agent = initialize_agent(
tools,
llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 执行查询
response = agent.run("123和456相加是多少?")
print(response)
如果:
更多推荐
所有评论(0)