LangChain进阶指南:打造支持多工具调用的智能对话系统

张开发
2026/5/5 7:11:32 15 分钟阅读
LangChain进阶指南:打造支持多工具调用的智能对话系统
1. LangChain与Function Calling基础概念如果你正在寻找一种方法让AI助手不仅能聊天还能帮你查天气、算数学题、甚至控制智能家居那么LangChain的Function Calling功能就是你要找的解决方案。简单来说Function Calling让大语言模型LLM具备了调用外部工具的能力就像一个智能中控系统可以根据你的需求自动选择并执行合适的工具。Function Calling的核心原理其实很好理解当模型识别到用户的问题需要外部工具来解决时比如北京天气怎么样它会生成一个结构化的调用指令通常是JSON格式包含工具名称和参数。你的程序接收到这个指令后执行对应的函数再把结果返回给模型由模型生成最终的自然语言回复。举个例子当你问3加5等于多少模型会识别到这是一个数学计算问题自动调用加法工具得到结果8后再回复你3加5等于8。整个过程对用户来说是无缝的就像模型自己会做数学题一样。LangChain在这个领域提供了非常完善的工具链支持工具注册用tool装饰器就能把普通Python函数变成模型可调用的工具模型绑定通过bind_tools()方法将工具与模型关联上下文管理自动维护多轮对话历史包括工具调用和返回结果路由机制模型能根据上下文自动选择最合适的工具2. 从零构建多工具对话系统2.1 环境准备与工具定义首先确保你已经安装了最新版的LangChainpip install langchain langchain-openai我们从一个简单的天气查询和加法计算场景开始定义两个基础工具from langchain_core.tools import tool tool def get_weather(city: str) - str: 返回指定城市的天气信息city参数是城市名称 # 实际项目中这里可以接入天气API return f{city}今天晴28°C湿度30% tool def add(a: int, b: int) - int: 加法计算返回两个整数的和 return a b关键点说明每个工具必须有清晰的docstring模型会据此理解工具功能参数类型提示如str、int帮助模型生成正确的参数格式tool装饰器会自动将函数转换为LangChain可识别的Tool对象2.2 模型初始化与工具绑定这里我们使用兼容OpenAI API的Qwen模型作为示例from langchain_openai import ChatOpenAI llm ChatOpenAI( base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1, api_key你的API_KEY, # 替换为实际key modelqwen-turbo, temperature0 # 降低随机性 ) # 将工具绑定到模型 llm_with_tools llm.bind_tools([get_weather, add])**温度参数(temperature)**的设置很关键设为0时模型会严格选择最合适的工具较高值会增加随机性可能产生不稳定的工具调用2.3 构建对话循环完整的对话系统需要处理多种消息类型from langchain_core.messages import HumanMessage, AIMessage, ToolMessage import json # 初始化对话历史 messages [ AIMessage(content你好我是你的AI助手可以查天气、做加法有什么需要帮忙的吗) ] available_tools {get_weather: get_weather, add: add} # 工具映射 while True: user_input input(你).strip() if user_input.lower() in {exit, quit, }: break # 添加用户消息到历史 messages.append(HumanMessage(contentuser_input)) # 获取模型响应 response llm_with_tools.invoke(messages) # 处理工具调用 if response.tool_calls: print(检测到工具调用:) print(json.dumps(response.tool_calls, indent2, ensure_asciiFalse)) # 将工具调用消息加入历史 messages.append(response) # 执行所有被调用的工具 for tool_call in response.tool_calls: tool_name tool_call[name] tool_func available_tools.get(tool_name) if tool_func: # 执行工具并获取结果 tool_result tool_func.invoke(tool_call[args]) # 将结果封装为ToolMessage messages.append(ToolMessage( contentstr(tool_result), tool_call_idtool_call[id] )) print(f执行 {tool_name} → {tool_result}) else: # 直接回复的情况 messages.append(response) print(AI:, response.content)消息类型说明HumanMessage: 用户输入AIMessage: AI的回复或工具调用请求ToolMessage: 工具执行结果3. 高级功能与优化技巧3.1 多工具动态路由当系统中有多个相似工具时模型需要准确选择最合适的。例如同时有get_weather和get_weather_detail时可以通过工具描述来区分tool def get_weather_detail(city: str, date: str) - str: 获取城市指定日期的详细天气信息包括温度、湿度、风速等 return f{city}在{date}的详细天气晴28°C湿度30%东北风3级路由优化技巧工具描述要突出差异化特征参数设计要明确区分必选/可选可以通过bind_tools的tool_choice参数设置默认行为3.2 上下文感知的对话管理LangChain的对话历史管理非常智能。比如以下对话流用户北京天气怎么样 AI: 北京今天晴28°C 用户那上海呢模型能自动理解上海指代的是天气查询无需重复说明。上下文优化建议保持合理的对话历史长度太长会影响性能重要信息可以要求用户确认对于复杂任务可以让模型分步骤确认3.3 错误处理与边界情况实际使用中需要考虑各种异常情况try: tool_result tool_func.invoke(tool_call[args]) except Exception as e: tool_result f工具执行出错: {str(e)} # 可以设置重试机制或fallback方案常见边界情况处理参数缺失或格式错误工具执行超时网络或API异常模型误解用户意图4. 实战扩展更多工具类型4.1 数据库查询工具让AI能查询业务数据tool def query_database(query: str) - str: 执行SQL查询并返回结果query参数是合法的SQL语句 # 连接数据库执行查询... return 查询结果: 共10条记录安全注意事项限制SQL操作类型如只读设置查询超时对敏感字段进行脱敏4.2 智能家居控制工具实现简单的家居控制tool def control_light(device: str, action: str) - str: 控制智能家居设备device是设备名称action是操作类型(on/off) # 调用IoT平台API... return f{device}已{action}4.3 文件操作工具让AI能读写文件tool def read_file(filepath: str) - str: 读取文件内容filepath是文件路径 with open(filepath, r) as f: return f.read() tool def write_file(filepath: str, content: str) - str: 写入内容到文件 with open(filepath, w) as f: f.write(content) return 写入成功安全建议限制文件路径范围设置文件大小限制对操作进行日志记录5. 性能优化与部署建议5.1 响应速度优化缓存机制对频繁查询的结果进行缓存from functools import lru_cache lru_cache(maxsize100) tool def get_weather(city: str) - str: ...并行调用当多个工具可并行执行时from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor() as executor: results list(executor.map( lambda tc: available_tools[tc[name]].invoke(tc[args]), response.tool_calls ))5.2 部署架构生产环境推荐架构客户端 → API网关 → 对话服务 → 模型服务 ↓ 工具执行器关键组件限流熔断防止工具被过度调用监控告警跟踪工具调用成功率日志审计记录所有工具调用详情5.3 成本控制工具调用频率限制大模型token使用监控选择性价比高的模型规格6. 常见问题排查问题1模型不调用工具检查工具描述是否清晰确认模型是否支持function calling测试简单案例是否工作问题2参数格式错误检查参数类型提示验证模型生成的参数格式添加参数校验逻辑问题3上下文丢失检查消息历史是否完整确认ToolMessage是否正确添加验证模型是否接收到完整历史问题4工具执行超时设置合理的超时时间实现异步调用添加重试机制在实际项目中我遇到过模型偶尔会幻觉出不存在工具的情况。这时候最好的做法是在工具调用前检查工具是否存在并让模型重新生成响应。

更多文章