一、这是什么概念解释当使用不支持原生函数调用的大语言模型时如 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), configconfig) # 第三步构建 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(modelmoonshot-v1-8k, temperature0) # 链路Prompt - LLM - 解析JSON - 执行工具 chain ( prompt | llm | JsonOutputParser() # 关键解析模型输出的 JSON | RunnablePassthrough.assign(outputinvoke_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大模型商业化落地方案作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量。