目标是开发支持多个 Function 定义的智能体代理系统
✅ 第一部分:是否支持多个函数(multi-function calling)
模型名称 | 支持多个函数注册 | 是否支持函数选择(name 匹配) | 是否能生成结构化参数 |
---|---|---|---|
OpenChat 3.5 / 3.5-0106 | ✅(Prompt 支持) | ✅(会选择最合适函数) | ✅ |
OpenHermes 2.5 | ✅ | ✅ | ✅(非常稳定) |
OpenOrca-Platypus2 | ✅ | ✅(function_name 识别率高) | ✅ |
DeepSeek-Coder-Instruct | ✅ | ✅(更偏工具能力) | ✅(格式更结构化) |
Yi-34B-Chat | ✅ | ✅ | ✅(但中文环境对 prompt 依赖更大) |
Mistral-7B-Instruct-v0.2 | ⚠️有限支持(可识别但误判多) | ❌ | ⚠️ |
Command R / R+ | ✅ | ✅(复杂函数选择能力强) | ✅ |
🧠 第二部分:适合智能体(AI Agent)开发的模型对比
模型名称 | 优势 | 劣势 | 推荐用途 |
---|---|---|---|
OpenHermes 2.5 | ✅ 模拟 ChatGPT 能力强✅ 支持多函数调度✅ JSON 格式稳定 | ❌ 可能对较复杂嵌套结构不稳定 | 通用 AI Agent 开发、快速原型 |
OpenChat 3.5 / 3.5-0106 | ✅ 兼容性强、结构清晰✅ 非常善于"选择正确函数"✅ 与 ChatGPT 风格相似 | ❌ 英文 prompt 响应更准❌ 中文多轮对话略弱 | 多函数调度+判断型智能体 |
OpenOrca-Platypus2 | ✅ 函数结构响应自然✅ 可与 RAG 配合(搜索后调用) | ❌ 对 prompt 格式要求严格 | RAG+调用类 Agent,如知识库问答 |
DeepSeek-Coder-Instruct | ✅ 参数封装能力强✅ 特别适合复杂 JSON✅ 在中文环境效果好 | ❌ 本体对话能力一般(偏工具型) | 工具调度型 Agent(如数据分析、代码生成) |
Yi-34B-Chat | ✅ 中文支持强✅ 多函数兼容性高✅ 多轮语境判断优于 Mistral | ❌ 资源消耗大(部署要求高) | 中文环境下的复杂工具调度 Agent |
Command R+ | ✅ 最接近 GPT-4 Function Calling✅ 可处理复杂依赖链✅ 稳定返回结构化调用意图 | ❌ 模型体积大(不适合轻量本地部署) | 高级智能体框架、生产级多工具调度 |
📌 场景推荐表(更详细)
场景 | 推荐模型 | 详细理由 |
---|---|---|
🧠 通用智能体(类似 ChatGPT Plugins) | OpenHermes 2.5 | 响应快,格式稳定,调度能力良好 |
📚 知识问答 + 工具调用 | OpenOrca-Platypus2 | 和向量检索结合效果佳,支持 tool use |
🧾 数据查询、API封装类代理 | DeepSeek-Coder-Instruct | 能准确构造复杂参数,适合内部流程自动化 |
📦 多函数判断 + 对话型智能体 | OpenChat 3.5-0106 | 善于判断何时调用哪个函数,语义理解好 |
🌏 中文业务智能体(中文场景) | Yi-34B-Chat | 中文指令理解优秀,适合中文问答、工具调度 |
🧠 多步推理 + 工具链代理 | Command R / R+ | 适合多步骤 function chain 场景,极高结构化支持度(但资源大) |
🛠 开发建议:
如果你打算本地部署并构建一个「多工具调度 + 推理判断 + 状态维护」的智能体,推荐如下组合:
🚀 首选组合
-
模型:OpenChat 3.5-0106 / OpenHermes 2.5
-
理由:兼容性好,响应稳定,支持 Function 调用 prompt,能模拟"调用哪个函数"的思考
📚 增强功能组合(支持数据分析、代码)
-
模型:DeepSeek-Coder-Instruct
-
适合构造复杂函数结构,如图表生成、数据库查询等
🌏 中文语境增强
-
模型:Yi-34B-Chat
-
用于提升中文语义判断、提示理解、对话链处理
是否可以在分析和回答\对话的时候使用不同模型已达到更好效果?
模型是否可以「搜索后调用函数」?
可以,但效果好不好,取决于它是否能理解并正确处理以下三点:
🔍 1. 先"判断是否需要搜索"
-
**优质模型(如 OpenOrca、OpenHermes、OpenChat)**可以根据 prompt 里的"未能直接回答、是否调用函数"来自动决定是否调用。
-
**较弱模型(如普通 Mistral)**会更依赖 prompt 明确指令,比如"请调用 searchDocs() 查询资料"。
🧠 2. 搜索结果+上下文合并后,是否能自动调用函数
-
OpenOrca-Platypus2 是目前社区反馈在 "读完 context 后发起函数调用" 做得最自然的模型之一。
-
OpenChat 3.5 和 Hermes 2.5 也能实现这个流程,但提示词需要设计得更清晰。
你需要把 RAG 的搜索结果插入在 prompt 前,告诉模型"你刚刚查到的资料如下......是否需要调用某个函数?"------这个 prompt 设计是关键。
🛠 举个例子:
你是一个智能助手,有访问工具的能力。 以下是你在知识库中查到的资料: 《香薰生产 SOP》: 1. 原料必须先检验。 2. 所有批次都要称重记录。 3. 灭菌需符合 GB 标准。 现在的问题是:我需要准备一批香薰,能帮我安排流程并调用相关服务吗?
如果模型支持 function calling,它就会基于知识库的 context 自动发起像:
{ "function_call": { "name": "schedule_production", "arguments": "{\"product\": \"香薰\", \"steps\": [\"检验\", \"称重\", \"灭菌\"]}" } }
✅ Q2:是否可以在 不同任务阶段切换模型 使用?
✔️ 技术上可以 ,而且在 Agent 系统中是高级应用方式之一,叫做 Multi-Agent 或 Hybrid Model 架构。
例如你可以这么设计:
阶段 | 使用模型 | 理由 |
---|---|---|
📥 用户输入理解 | OpenChat 3.5 | 自然语言理解、判断是否调用函数 |
🔍 RAG 检索与摘要 | DeepSeek-Coder | 处理 JSON、向量检索后信息压缩能力强 |
🔧 函数构造 | OpenHermes 2.5 | 更擅长输出符合工具调用结构 |
🗣️ 中文对话反馈 | Yi-34B-Chat | 中文环境下表现稳定,逻辑清晰 |
不过,这需要构建一个"中控逻辑",决定什么时候切模型,什么时候聚合输出。
🔍 小结:
是否可用搜索后调用函数 | 是否推荐 |
---|---|
OpenOrca-Platypus2 | ✅ 最推荐 |
OpenHermes 2.5 | ✅ 可用,稍强 prompt 设计要求 |
OpenChat 3.5 | ✅ 语义理解强,判断能力优 |
DeepSeek-Coder | ✅ 适合配合工具处理 JSON |
Mistral-7B-Instruct | ⚠️ 函数理解能力弱,不推荐 |
Yi-34B-Chat | ✅ 中文表现强,适合中文场景对话调度 |
如果之后考虑RAG + 多模型协同 + Function Chain这些方向,可以先设计初始的 Agent 框架(例如一个流程控制器 + 模型池调度规则),先专注一个模型原型跑通功能。
🧠 Part 1:「搜索知识后自动调用函数」Prompt 示例
以下是为Function Calling 支持模型(如 OpenHermes、OpenChat、OpenOrca)设计的标准 prompt 模板:
🔧 场景假设:
用户输入:「广州明天要下雨吗?帮我带伞提醒。」
你系统会检索天气数据 + 决定是否调用函数。
✅ Prompt 示例(带知识检索结果)
你是一个智能助手,可以访问函数工具。
用户提问:广州明天要下雨吗?帮我安排带伞提醒。
你在天气数据库中查到的信息如下:
【知识库搜索结果】
广州未来三天天气:
- 4月26日:阴天转中雨,气温22°C ~ 28°C。
- 4月27日:雷阵雨,气温23°C ~ 29°C。
- 4月28日:多云,气温24°C ~ 30°C。
请根据搜索信息,判断是否需要调用函数。如果需要,请使用以下函数调用格式:
可用函数:
```json
[
{
"name": "setUmbrellaReminder",
"description": "设置带伞提醒",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"},
"date": {"type": "string"},
"weather": {"type": "string"}
},
"required": ["city", "date", "weather"]
}
}
]
现在请根据用户的问题和搜索内容,决定是否需要调用函数,并用 JSON 格式输出调用参数。
🔁 期望模型输出(符合 OpenAI Tool Use)
```json
{
"function_call": {
"name": "setUmbrellaReminder",
"arguments": "{\"city\": \"广州\", \"date\": \"2024-04-26\", \"weather\": \"阴转中雨\"}"
}
}
🧠 Part 2:智能体系统的初始架构设计(多模型 + RAG + 函数调用)
🧱 1. 架构图(文本描述)
[用户输入]
↓
[主控 Agent Controller]
↓(判断是否需要搜索)
[检索模块 RAG]
↓(返回搜索内容)
[模型选择器]
├─> OpenChat 3.5(理解 + 调度函数)
├─> DeepSeek-Coder(结构化 JSON)
└─> Yi-34B(中文环境)
↓
[函数调用生成器]
↓
[API 执行/数据库操作/系统执行]
↓
[结果反馈生成]
↓
[输出给用户]
📦 2. 各模块职责说明
模块 | 功能 | 推荐工具/语言 |
---|---|---|
Agent Controller | 识别用户意图、控制流程 | Spring Boot / Node.js |
检索模块(RAG) | 使用向量数据库,如 Redis Vector / Weaviate | Redis Stack / Faiss / Milvus |
模型选择器 | 根据任务类型切换模型 | 可用 OpenAI 风格接口包装各模型 |
Prompt 构造器 | 将搜索内容 + 函数定义注入 Prompt | Java/Node.js 构建模板系统 |
函数执行模块 | 调用 API、写数据库、发消息等 | Spring / n8n / LangGraph |
用户交互前端 | 聊天界面、反馈页面 | React / Vue / Expo RN |
✅ Bonus:使用 Spring Boot 做智能体控制器的思路
可以用如下方式封装控制逻辑:
@RestController
public class AgentController {
@Autowired private VectorSearchService vectorService;
@Autowired private ChatModelService modelRouter;
@Autowired private FunctionExecutor functionExecutor;
@PostMapping("/ask")
public AgentResponse askAgent(@RequestBody AgentRequest request) {
String searchContext = vectorService.search(request.getQuestion());
String fullPrompt = PromptComposer.compose(request.getQuestion(), searchContext);
ModelResponse response = modelRouter.ask(fullPrompt);
if (response.hasFunctionCall()) {
FunctionCallResult result = functionExecutor.execute(response.getFunctionCall());
return AgentResponse.fromFunctionResult(result);
} else {
return AgentResponse.fromText(response.getText());
}
}
}
🧪 小结:推荐你的起步顺序
-
✅ 用 OpenHermes 2.5 或 OpenChat 3.5 跑通基础 Prompt + Function Call
-
✅ 接入向量数据库做简单的 RAG 搜索合并
-
✅ 使用 Spring Boot 或 Node 搭建控制器,构建 Function 执行接口
-
✅ 再逐步探索多模型切换与链式调用