当前位置: 首页 > news >正文

LangChain函数调用全解析:如何让ChatGPT自动查询天气和商品信息?

LangChain函数调用实战:构建智能天气与商品查询系统的完整指南

在当今AI应用开发领域,让大语言模型(LLM)与外部系统无缝对接已成为提升产品智能化的关键。LangChain作为这一领域的标杆框架,其函数调用能力为开发者提供了将自然语言转化为实际操作的强大工具。本文将深入探讨如何利用LangChain构建能够自动查询天气和商品信息的智能系统,从基础原理到高级应用场景,为您呈现一套完整的解决方案。

1. LangChain函数调用核心原理

函数调用(Function Calling)是LangChain最令人兴奋的特性之一,它使LLM能够理解何时需要调用外部工具,并自动生成符合要求的参数。这一机制本质上是在LLM与真实世界之间架起了一座桥梁。

工作原理三要素

  1. 函数描述:用JSON格式明确定义函数名称、描述、参数类型和必需字段
  2. 意图识别:LLM分析用户输入,判断是否需要调用外部函数
  3. 参数提取:从自然语言中结构化提取函数所需参数

以下是一个典型的天气查询函数定义示例:

weather_function = { "name": "get_current_weather", "description": "获取指定城市的当前天气情况", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,如:北京、上海" }, "unit": { "type": "string", "enum": ["celsius", "fahrenheit"] } }, "required": ["location"] } }

提示:函数描述中的description字段至关重要,它决定了LLM是否能准确理解何时调用该函数

2. 构建基础函数调用链

让我们从创建一个最简单的天气查询链开始。这个链将完成从用户自然语言到函数调用的完整转换过程。

实现步骤

  1. 初始化Chat模型并绑定函数描述
  2. 创建提示模板处理用户输入
  3. 组合成可执行链
from langchain.prompts import ChatPromptTemplate from langchain.chat_models import ChatOpenAI # 创建提示模板 prompt = ChatPromptTemplate.from_messages([ ("human", "{input}") ]) # 初始化模型并绑定天气函数 model = ChatOpenAI(temperature=0).bind( functions=[weather_function], function_call={"name": "get_current_weather"} ) # 组合成链 chain = prompt | model

测试这个基础链:

response = chain.invoke({"input": "上海现在天气怎么样?"}) print(response.additional_kwargs)

您将看到类似这样的输出,其中包含了LLM建议调用的函数及其参数:

{ "function_call": { "name": "get_current_weather", "arguments": '{"location":"上海","unit":"celsius"}' } }

3. 多函数调度与电商查询实现

实际应用中,系统往往需要处理多种类型的查询。让我们扩展系统能力,加入商品查询功能。

商品查询函数定义

product_function = { "name": "product_search", "description": "查询电商平台商品信息", "parameters": { "type": "object", "properties": { "product_name": { "type": "string", "description": "商品名称,如:iPhone 15" }, "max_price": { "type": "number", "description": "最高价格限制" } }, "required": ["product_name"] } }

创建支持多函数调用的链:

multi_function_model = ChatOpenAI(temperature=0).bind( functions=[weather_function, product_function] ) multi_chain = prompt | multi_function_model

测试多函数调度能力:

# 测试天气查询 weather_response = multi_chain.invoke({"input": "北京今天气温多少?"}) print(weather_response.additional_kwargs) # 测试商品查询 product_response = multi_chain.invoke({"input": "最新款MacBook Pro多少钱?"}) print(product_response.additional_kwargs)

注意:LLM会根据函数描述自动选择最合适的函数,当用户查询模糊时可能会要求澄清

4. 实战:构建端到端查询系统

现在我们将把理论转化为完整可用的系统,包含函数调用和实际API对接。

系统架构

  1. 接收用户自然语言输入
  2. LLM解析并生成函数调用建议
  3. 执行实际API调用
  4. 将API结果转化为自然语言回复

天气API对接示例

import requests def get_weather(location: str, unit: str = "celsius"): """实际调用天气API的函数""" # 这里使用模拟数据,实际项目应替换为真实API调用 mock_data = { "location": location, "temperature": 25 if unit == "celsius" else 77, "unit": unit, "forecast": ["sunny", "cloudy"] } return mock_data # 完整执行链 def execute_weather_query(user_input: str): # 获取函数调用建议 chain_response = multi_chain.invoke({"input": user_input}) if not chain_response.additional_kwargs.get("function_call"): return "抱歉,我无法处理这个请求" func_call = chain_response.additional_kwargs["function_call"] # 根据函数名路由到不同处理逻辑 if func_call["name"] == "get_current_weather": import json args = json.loads(func_call["arguments"]) weather_data = get_weather(args["location"], args.get("unit")) return f"{args['location']}当前天气:{weather_data['temperature']}°{args.get('unit', 'celsius').upper()}, 预计{', '.join(weather_data['forecast'])}" elif func_call["name"] == "product_search": return "商品查询功能正在建设中..." return "未知请求类型"

测试端到端流程:

print(execute_weather_query("杭州明天天气如何?")) print(execute_weather_query("查询三亚当前温度,用华氏度"))

5. 高级技巧与性能优化

当系统投入生产环境时,以下几个高级技巧可以显著提升性能和可靠性:

1. 函数调用缓存: 对频繁查询的内容实现缓存机制,减少API调用次数

from functools import lru_cache @lru_cache(maxsize=100) def cached_weather_query(location: str, unit: str): return get_weather(location, unit)

2. 异步处理: 利用LangChain的异步接口提升并发性能

async def async_weather_query(location: str): model = ChatOpenAI(temperature=0) prompt = ChatPromptTemplate.from_template("获取{city}天气") chain = prompt | model return await chain.ainvoke({"city": location})

3. 流式输出: 对长时间操作提供渐进式反馈

async def stream_weather_response(location: str): model = ChatOpenAI(temperature=0) prompt = ChatPromptTemplate.from_template("正在获取{city}天气...") chain = prompt | model async for chunk in chain.astream({"city": location}): print(chunk.content, end="", flush=True)

4. 后备策略: 当主模型不可用时自动降级

from langchain.schema.runnable import RunnableLambda primary_model = ChatOpenAI(temperature=0) fallback_model = ChatOpenAI(model_name="gpt-3.5-turbo-16k", temperature=0) chain = prompt | primary_model.with_fallbacks([fallback_model])

6. 生产环境最佳实践

在将函数调用系统部署到生产环境时,以下经验值得注意:

错误处理矩阵

错误类型处理策略用户反馈示例
API超时重试2次"正在获取最新数据,请稍候..."
无效位置请求澄清"您能确认一下城市名称吗?"
无权限记录日志"当前服务不可用,已通知管理员"

监控指标

  • 函数调用准确率
  • API响应时间P99
  • 用户查询意图分布
  • 错误类型统计

安全考虑

  1. 对所有API调用实施速率限制
  2. 敏感参数过滤(如SQL注入防护)
  3. 用户查询日志脱敏存储
def sanitize_input(user_input: str): """基础输入清洗""" import re return re.sub(r"[^\w\s\u4e00-\u9fa5]", "", user_input)[:200]

通过本文的深度技术解析和实战演示,您已经掌握了使用LangChain构建智能函数调用系统的核心方法。从基础的单函数对接到复杂的多函数调度,再到生产级的优化策略,这套方案能够灵活适应各种业务场景需求。

http://www.jsqmd.com/news/534248/

相关文章:

  • 亚洲美女-造相Z-Turbo镜像免配置:内置模型自动下载、校验、缓存与版本管理
  • SiameseAOE模型C盘清理日志分析:自动识别大文件类型与可清理建议
  • 基于STM32F407ZGT6与INMP441的I2S音频采集系统:从配置到数据流处理
  • 为什么Python适合Web开发?对比PHP/Node.js的5个优势
  • WuliArt Qwen-Image Turbo惊艳效果:低光照场景中暗部层次保留与高光不过曝控制
  • 医疗敏感数据脱敏迫在眉睫:用Python实现符合GDPR与《个人信息保护法》的差分隐私(附FDA认证级噪声注入模板)
  • Python实战:5步搞定脑电信号预处理(附OpenBCI数据清洗代码)
  • 从零到一:用Simulink+CubeMX玩转STM32 GPIO,图形化编程告别手写代码
  • AI写专著的秘密武器!实用软件推荐,开启专著创作新篇章
  • Gemma-3-270m效果实录:Ollama中生成技术博客大纲+段落扩写全过程
  • FPGA复位策略全流程验证:从RTL到实现后的仿真与电路解析
  • FlashPatch终极指南:三步解决Flash游戏无法播放的难题
  • SAP物料凭证跳号问题深度解析:从SNRO缓存调整到SM56缓存重置的实战指南
  • 2026年免登在线PDF转Word免费工具横评与选型指南
  • AMD ROCm深度学习实战:从零构建高性能AI推理架构
  • Qwen2.5-Omni:多模态流式交互的Thinker-Talker架构设计与TMRoPE同步优化
  • 3分钟掌握N_m3u8DL-CLI-SimpleG:让M3U8视频下载变得像复制粘贴一样简单
  • 避坑指南:Triton配置文件config.pbtxt里那些容易踩的坑(input/output参数详解)
  • Kimi内置19套结构化提示词全解析:从爆款文案到影评达人的实战技巧
  • 视觉SLAM必备:Pangolin 0.5版本在Ubuntu20.04上的完整配置流程
  • 如何用CoT蒸馏让Llama 3学会GPT-4的推理能力?保姆级教程
  • RNA-seq新手必看:如何正确选择FPKM、RPKM还是CPM指标?
  • 3大核心突破:M5Stack-Core-S3让AI语音助手开发效率提升10倍
  • 自动化工具GSE进阶指南:从流程混乱到高效自动化
  • CRaxsRat v7.4远程管理工具实战指南:从配置到高级功能解析
  • 用OpenCV和C++实现无人机影像自动匹配:从Moravec特征点到NCC相关系数的完整流程
  • 空间测量革命:ARuler如何用手机摄像头重新定义物理世界感知
  • Apache Superset API实战手册:从问题解决到企业集成
  • 基于Avalonia的跨平台实时协作工具开发实战(支持Win、银河麒麟、统信UOS)
  • 4步精通:零成本PHP翻译集成实战指南