Hermes函数调用优化:从格式约束到语义理解
函数调用:智能体的核心能力 函数调用(Function Calling)是LLM从"聊天机器人"进化为"智能体"的关键能力。Hermes 4在这一维度上做了深度优化,将函数调用的准确率从78%提升到了94%以上。本文剖析其背后的技术细节。 函数调用的三个层次 层次一:格式约束(Format-Level) 最基础的层次——确保模型输出符合可解析的函数调用格式: // 期望格式 { "tool": "search_web", "parameters": { "query": "2026年AI最新进展", "num_results": 5 } } 早期模型依赖严格的格式提示词和后处理来保证格式正确性: # 传统格式约束方法 FORMAT_PROMPT = """ 你必须以严格的JSON格式回复,不要添加任何其他文本。 格式示例: {"tool": "<函数名>", "parameters": {<参数键值对>}} 可用函数: - search_web(query: str, num_results: int): 搜索网页 - send_email(to: str, subject: str, body: str): 发送邮件 """ def parse_tool_call(response): """脆弱的JSON解析,需要大量容错处理""" try: # 尝试从回复中提取JSON json_str = extract_json(response) call = json.loads(json_str) return validate_call(call) except: # 格式错误时的降级处理 return fallback_parse(response) 这种方法的问题在于:模型并不"理解"函数的用途,只是在模仿格式。 层次二:语义理解(Semantic-Level) Hermes 4的核心突破在于让模型真正理解函数的语义——什么情况下该调用哪个函数、参数应该如何填充: # Hermes 4 的语义级函数调用 class HermesFunctionCaller: def __init__(self, model, tool_registry): self.model = model self.tools = tool_registry async def call(self, user_request, context=None): # 1. 语义路由:理解用户意图,匹配最合适的函数 intent = await self.model.understand_intent(user_request) candidate_tools = self.tools.match(intent) # 2. 参数推理:从对话中推理参数值 for tool in candidate_tools: args = await self.model.infer_arguments( tool_schema=tool.schema, user_request=user_request, context=context ) # 3. 完整性验证:检查必填参数 missing = tool.check_required(args) if missing: # 主动追问缺失信息 return {"status": "need_info", "missing": missing} # 4. 类型验证:确保参数类型正确 if tool.validate_types(args): return {"status": "ready", "tool": tool.name, "args": args} return {"status": "no_match"} 层次三:链式编排(Orchestration-Level) 最复杂的层次——根据用户目标自动编排多步函数调用: ...