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

不支持函数调用的大语言模型解决技巧

一、这是什么?(概念解释)

当使用不支持原生函数调用的大语言模型时(如 Moonshot、某些开源模型),无法像 GPT-4 那样使用bind_tools()tool_calls

解决方案:通过精心设计的 Prompt,让模型以JSON 格式输出工具调用指令,然后手动解析并执行工具。

核心思想:

  • 不依赖模型的原生函数调用能力
  • 让模型输出结构化的 JSON:{"name": "工具名", "arguments": {参数}}
  • 手动解析 JSON 并执行对应的工具

二、有什么用?(应用场景)

场景说明
使用国产模型Moonshot、智谱、通义千问等早期版本不支持原生函数调用
使用开源模型Llama、Qwen 等开源模型部署时
降低成本某些支持函数调用的模型价格较高,用便宜模型替代
统一接口让不同能力的模型都能使用工具调用功能
灵活控制完全控制工具调用的解析和执行流程

三、完整示例代码

#!/usr/bin/env python # -*- coding: utf-8 -*- import json import os from typing import Type, Any, TypedDict, Dict, Optional import requests from langchain_core.output_parsers import JsonOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnableConfig, RunnablePassthrough from langchain_core.tools import BaseTool, render_text_description_and_args from langchain_openai import ChatOpenAI from pydantic import Field, BaseModel import dotenv dotenv.load_dotenv() # ============ 第一步:定义工具(与原生方式相同)============ class WeatherArgsSchema(BaseModel): city: str = Field(description="需要查询天气的城市,例如:北京") class WeatherTool(BaseTool): """查询指定城市的天气预报""" name: str = "weather_query" description: str = "当你需要查询天气信息时使用此工具" args_schema: Type[BaseModel] = WeatherArgsSchema def _run(self, city: str) -> str: # 实际调用天气 API return f"{city}今天晴天,温度 25°C" # ============ 第二步:创建工具字典和执行函数 ============ weather_tool = WeatherTool() tool_dict = {weather_tool.name: weather_tool} tools = [weather_tool] # 定义工具调用请求的类型 class ToolCallRequest(TypedDict): name: str arguments: Dict[str, Any] # 定义工具执行函数 def invoke_tool( tool_call_request: ToolCallRequest, config: Optional[RunnableConfig] = None, ) -> str: """执行工具调用""" name = tool_call_request["name"] requested_tool = tool_dict.get(name) return requested_tool.invoke(tool_call_request.get("arguments"), config=config) # ============ 第三步:构建 Prompt(关键!)============ # 将工具列表渲染成文本描述 rendered_tools = render_text_description_and_args(tools) system_prompt = f"""你是一个聊天机器人,可以访问以下工具。 以下是每个工具的名称和描述: {rendered_tools} 根据用户输入,返回要使用的工具的名称和输入。 将您的响应作为具有`name`和`arguments`键的JSON块返回。 `arguments`应该是一个字典,其中键对应于参数名称,值对应于请求的值。""" prompt = ChatPromptTemplate.from_messages([ ("system", system_prompt), ("human", "{query}") ]) # ============ 第四步:创建执行链 ============ # 使用不支持函数调用的模型 llm = ChatOpenAI(model="moonshot-v1-8k", temperature=0) # 链路:Prompt -> LLM -> 解析JSON -> 执行工具 chain = ( prompt | llm | JsonOutputParser() # 关键:解析模型输出的 JSON | RunnablePassthrough.assign(output=invoke_tool) # 执行工具并将结果赋值给 output ) # ============ 第五步:调用 ============ result = chain.invoke({"query": "北京今天天气怎么样?"}) print(result) # 输出类似: # { # "name": "weather_query", # "arguments": {"city": "北京"}, # "output": "北京今天晴天,温度 25°C" # }

四、流程对比图

┌─────────────────────────────────────────────────────────────────────────┐ │ 原生函数调用 VS Prompt Engineering 方式对比 │ └─────────────────────────────────────────────────────────────────────────┘ ================== 原生支持函数调用 (GPT-4) ================== 用户提问 LLM 应用层 │ │ │ ▼ ▼ │ "北京天气?" ──────────▶│ 返回 tool_calls │ │ │ (结构化对象) │ │ │ [{name: "weather", │ │ │ args: {...}}] │ │◀──────────────────│ │ │ │ │ │ 解析 tool_calls │ │ │ │ │ ▼ │ │ 调用工具 ──────────────────────────────────────▶│ │ │ │◀─────────────────────────────────────────│ 工具返回 │ │ ▼ │ │ 构造 ToolMessage ──────▶│ 生成最终回答 │ │ │ │ │◀──────────────────│ │ 最终回答 │ ================== 不支持函数调用 (Moonshot) ================== 用户提问 LLM 应用层 │ │ │ ▼ ▼ │ "北京天气?" ──────────▶│ 返回文本 │ │ │ (JSON字符串) │ │ │ '{"name": "weather"│ │ │ "arguments": {...│ │ │ }}' │ │◀──────────────────│ │ │ │ │ ▼ │ │ JsonOutputParser │ │ (解析 JSON) │ │ │ │ │ ▼ │ │ invoke_tool() ────────────────────────────────▶│ (手动执行工具) │ │ │ │◀─────────────────────────────────────────│ 工具返回 │ │ │ ▼ ▼ ▼ 返回完整结果 │ {name, arguments, output} │ ┌─────────────────────────────────────────────────────────────────────────┐ │ 核心差异 │ └─────────────────────────────────────────────────────────────────────────┘ 原生方式: Prompt Engineering 方式: - LLM 返回结构化对象 - LLM 返回 JSON 文本 - 自动解析 tool_calls - 手动用 JsonOutputParser 解析 - 使用 ToolMessage 反馈 - 直接将结果附加到输出 - 模型内置支持 - 完全靠 Prompt 设计

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!​

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示

​因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

四、AI大模型商业化落地方案

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

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

相关文章:

  • 基于遗传算法(GA)求解多旅行商问题(MSTP)的MATLAB实现代码
  • 2026最新粗糙度仪/硬度计/探伤仪/手持式光谱仪/测厚仪供应商推荐:西北检测仪器领域的可靠之选 - 十大品牌榜
  • 加工业ERP系统上线失败的常见误区
  • 优优推电话查询:品牌推广服务概况与建议 - 品牌推荐
  • 安卓版微信5.0应用宝上线 多图详解Android版微信5.0
  • 机械表走时误差从+15秒/天到+2秒/天:我的30天维修保养实证记录
  • 2026 年成都旅行社口碑推荐榜:国旅旅行社 / 九寨沟旅游 / 峨眉山旅游 - 深度智识库
  • 2026年 钢筋连接套筒厂家推荐排行榜:直螺纹/分体式/镦粗/冷挤压/焊接套筒,专业工艺与高强性能深度解析 - 品牌企业推荐师(官方)
  • Agent架构的真相:你可能不需要那么复杂
  • 游客实测:2026国旅旅行社实力口碑榜最新发布(硬核数据对比) - 深度智识库
  • 2026年 广州打印机/净水机/直营水机出售安装维修服务推荐榜:专业高效,一站式办公与净水解决方案 - 品牌企业推荐师(官方)
  • 【AI】2026年3月各大模型公司openclaw 产品集
  • SaaS vs 自建:针对中小企业的CRM与ERP部署成本与运维复杂度对比分析
  • 2026年报警器生产厂家实力推荐:常州市武进悦达电声器材有限公司,多场景报警器专业供应商 - 品牌推荐官
  • 使用 LangChain 构建 AI 代理:自动化创建 React TodoList 应用
  • 3月4日-布局2026:半导体圈内人已经开始关注的主流技术论坛盘点 - 品牌2026
  • 方盾工业防尘口罩终极指南:守护呼吸安全的关键防线
  • 夸克网盘免费领取1TB空间最新教程!新老用户均可!亲测可行!
  • 总结2026年上海民商事律师推荐,性价比高的律师怎么选 - myqiye
  • DBA生存指南:高并发场景下数据库性能调优与自动化备份恢复策略
  • 2026年全封闭管教学校服务性价比排名,揭阳普宁新阳光教育基地上榜 - 工业推荐榜
  • vue npm-cache log
  • 设置代理解决docker compose pull 时 报Client.Timeout
  • 宝东站计算机联锁工程设计
  • 2026最新硬度计推荐!西北区域机械制造/计量检测等场景优质供应商权威榜单 - 十大品牌榜
  • 2026年热镀锌锅设备推荐:天津市亿润鼎金属科技,专业生产圆/大型/工业镀锌锅 - 品牌推荐官
  • 无线通信系统信道估计算法详解
  • 2026年常州GEO推广/AI获客营销/AI搜索优化/企业网站与外贸独立站建设/微信小程序开发/百度推广服务商实力推荐榜:智能技术与全域增长解决方案深度解析 - 品牌企业推荐师(官方)
  • 2026成都旅行社哪家强?五大实力派深度解析,九寨沟专线首选揭晓 - 深度智识库
  • 2026年不锈钢筛管/筛板生产厂家推荐:江苏润达筛管筛板有限公司全系产品详解 - 品牌推荐官