QQ牛牛机器人 Langchain简单快速上手教程(三)——聊天模型之工具
本教程聚焦聊天模型与工具调用的核心落地方法,从基础概念到可运行代码,带你快速掌握LangChain
中让大模型主动调用外部能力的完整流程。
🎯 核心概念:什么是聊天模型工具调用
工具调用(Tool Calling)是LangChain聊天模型的核心能力:大模型不再局限于自身知识库输出,而是可
以根据用户的问题,主动判断是否需要调用外部工具(计算器、数据库查询、API接口等),获取实时/外部
数据后再整理出最终回答。
该能力仅支持原生具备函数调用能力的大模型,比如OpenAI GPT系列、Anthropic Claude系列、Google
Gemini系列等。
🔧 第一步:环境准备与基础依赖安装
先完成基础环境配置,确保后续代码可直接运行:
安装核心依赖包:
bash
pip install langchain langchain-openai langchain-anthropic python-dotenv
配置大模型API密钥,在项目根目录创建.env文件:
env
OPENAI_API_KEY=你的OpenAI密钥
# 若使用Claude模型则补充配置
ANTHROPIC_API_KEY=你的Anthropic密钥
🛠️ 第二步:自定义工具定义
LangChain提供@tool装饰器,无需复杂配置即可快速将普通Python函数转化为大模型可识别的工具:
python
from langchain_core.tools import tool
# 定义一个乘法计算工具
@tool
def multiply(first_int: int, second_int: int) -> str:
"""两个整数相乘,返回计算结果的字符串形式"""
return str(first_int * second_int)
# 直接测试工具调用
print(multiply.invoke({"first_int": 4, "second_int": 5}))
# 输出结果:20
工具函数的参数类型必须明确标注,大模型会自动识别参数类型完成入参生成。
函数的文档字符串必须清晰描述工具的作用,大模型会基于这段描述判断是否要调用该工具。
🚀 第三步:聊天模型绑定工具
将自定义工具绑定到聊天模型,让大模型自动适配工具调用格式:
python
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os
load_dotenv()
# 初始化聊天模型
model = ChatOpenAI(model="gpt-3.5-turbo-1106", api_key=os.getenv("OPENAI_API_KEY"))
# 将工具绑定到模型
model_with_tools = model.bind_tools([multiply])
绑定完成后,大模型收到用户提问时,会自动判断是否需要调用工具:如果需要,会返回结构化的工具调用指
令,而非直接返回自然语言回答。
⚡ 第四步:构建工具调用执行链
基于LangChain的链式调用能力,实现“用户提问→模型生成工具调用指令→执行工具→返回结果给模型→生
成最终回答”的完整闭环:
python
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
# 构建基础提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个擅长使用工具的助手,遇到计算类问题优先调用提供的工具完成计算"),
("user", "{input}")
])
# 构建完整执行链
chain = RunnablePassthrough.assign(
# 模型生成工具调用指令
tool_calls = prompt | model_with_tools
).assign(
# 执行所有生成的工具调用
tool_results = lambda x: [tc.invoke(tc.args) for tc in x["tool_calls"].tool_calls]
) | StrOutputParser()
# 测试完整流程
result = chain.invoke({"input": "4乘以5等于多少?"})
print(result)
📌 进阶:基于LangGraph构建计算器Agent
对于需要多轮工具调用的复杂场景,可以用LangGraph构建更稳定的Agent,官方提供的标准实现如下:
python
from langgraph.graph import StateGraph, MessagesState
from langgraph.prebuilt import ToolNode
# 把工具放入工具执行节点
tools = [multiply]
tool_node = ToolNode(tools)
# 构建状态图
workflow = StateGraph(MessagesState)
# 添加节点
workflow.add_node("agent", model_with_tools)
workflow.add_node("tools", tool_node)
# 添加流转边
workflow.add_edge("agent", "tools")
workflow.add_edge("tools", "agent")
# 设置入口点
workflow.set_entry_point("agent")
# 编译运行Agent
app = workflow.compile()
final_result = app.invoke({"messages": [("user", "4乘以5等于多少?")]})
该实现会自动处理多轮工具调用,直到大模型拿到足够的信息生成最终回答,无需手动编写循环逻辑。
⚠️ 常见避坑要点
不要给不支持原生函数调用的大模型绑定工具,会出现大量幻觉生成无效的工具调用指令。
工具的参数描述和函数文档字符串必须尽可能清晰,否则大模型很容易生成错误的入参。
生产环境中必须给工具执行增加权限校验,避免大模型被Prompt注入诱导执行高危操作。
需要我为你补充这篇教程对应的可直接运行的完整项目代码包吗?你复制到本地配置好API密钥就能直接跑通全流程。
牛牛机器人 / 牛牛算账机器人版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!