欢迎光临
我们一直在努力

Function_Calling架构深度解析:从原理到生产级Agent实战

Function Calling架构深度解析:从原理到生产级Agent实战

作者说: Function Calling(函数调用)是当前AI Agent的核心能力,也是各厂商差异化竞争的主战场。OpenAI的Tools、Anthropic的Tool Use、Google的Function Declarations,表面相似但内部机制差异巨大。本文从协议设计层面做横向对比,结合生产级实战代码,把这件事说透。


目录

  • 1. 为什么Function Calling是Agent架构的核心
  • 2. 主流厂商Function Calling协议横向对比
  • 3. OpenAI Tool Use源码级解析
  • 4. Anthropic Tool Use深度剖析
  • 5. 生产级Agent架构设计:统一抽象层
  • 6. 实战:构建支持多模型的Function Calling Agent
  • 7. 性能优化与常见坑点
  • 8. 总结与展望

1. 为什么Function Calling是Agent架构的核心

1.1 从「问答」到「执行」的跨越

传统LLM交互模型:

用户 → LLM → 回答(文本生成完毕,交互结束)

Function Calling加持后的模型:

用户 → LLM → 函数调用请求 → 执行函数 → 结果返回 → LLM → 回答
↑ 循环(可多轮)

这意味着:AI不再只是生成文本,而是能够影响外部世界。

1.2 Function Calling的技术本质

Function Calling本质上是让LLM学习了一个新的能力:输出结构化的工具调用指令,而不只是自然语言。

普通文本输出:{"role": "assistant", "content": "今天的天气是…"}
函数调用输出:{"role": "assistant", "tool_calls": [{"name": "get_weather", "arguments": {…}}]}

这个「学习」不是通过fine-tuning,而是通过in-context learning——在prompt中给出工具定义和调用示例,模型就能学会调用。

1.3 技术成熟度曲线

┌──────────────────────────────────────────────────────────────┐
│ 2023年 2024年Q1-Q2 2024年Q3-Q4 2025年 │
│ │ │ │ │ │
│ 初级阶段 标准化阶段 生态整合 成熟落地 │
│ │ │ │ │ │
│ Tool Use OpenAI/ MCP协议 统一抽象层 │
│ 单一模型 Claude/ 崛起 多模型无缝切换 │
│ Gemini统一 Function Calling │ │
└──────────────────────────────────────────────────────────────┘


2. 主流厂商Function Calling协议横向对比

2.1 核心概念对照

维度OpenAIAnthropicGoogle Gemini国内厂商
接口名称 tools / tool_calls tools / tool_use function_declarations functions
参数格式 JSON Schema JSON Schema OpenAPI 3.0 JSON Schema
调用方式 返回tool_calls数组 返回tool_use对象 返回function_call对象 返回function_call对象
流式支持 ✅ stream_events ✅ tool_use事件 ✅ 部分支持 ✅ 部分支持
并发调用 ✅ 支持 ✅ 支持 ✅ 部分支持 ✅ 部分支持
强制调用 tool_choice: "required" tool_choice: {type: "tool"} 需在prompt中指定 varies

2.2 JSON Schema复杂度对比

OpenAI(中等复杂度):

{
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,如 '北京'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}

Anthropic(最严格):

{
"name": "get_weather",
"description": "获取指定城市的天气信息",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称"
},
"unit": {
"type": "string",
"description": "温度单位",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
}

关键差异:Anthropic要求每个参数必须有description,且type必须与description一致。

2.3 输出格式对比

# OpenAI返回格式
{
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\\"location\\": \\"北京\\"}"
}
}
]
}

# Anthropic返回格式
{
"tool_use": {
"name": "get_weather",
"input": {"location": "北京"}
}
}

# 关键差异:
# OpenAI的arguments是JSON字符串,需要二次解析
# Anthropic的input直接是dict,可直接使用


3. OpenAI Tool Use源码级解析

3.1 调用链路全流程

用户请求

构造 messages + tools

调用 /v1/chat/completions

模型输出 tool_calls(或普通文本)

解析 tool_calls,提取 function name + arguments

执行对应函数

将函数结果以 role:tool 消息追加回messages

再次调用 /v1/chat/completions(继续对话)

循环直到模型输出普通文本(不再调用工具)

3.2 Python SDK核心代码实现

# openai_function_calling.py

from openai import OpenAI
from typing import Callable, Any
import json

client = OpenAI(api_key="sk-xxx")

class OpenAIFunctionAgent:
"""OpenAI Function Calling Agent"""

def __init__(self, model: str = "gpt-4o"):
self.client = client
self.model = model
self.tools: list[dict] = []
self.tool_handlers: dict[str, Callable] = {}
self.messages: list[dict] = []

def register_tool(
self,
name: str,
description: str,
parameters: dict,
handler: Callable
):
"""
注册工具

Args:
name: 工具名
description: 工具描述(AI理解工具用途的关键)
parameters: JSON Schema格式的参数定义
handler: 工具处理函数
"""
self.tools.append({
"type": "function",
"function": {
"name": name,
"description": description,
"parameters": parameters
}
})
self.tool_handlers[name] = handler

def chat(self, user_message: str, max_turns: int = 10) > str:
"""
对话入口

Args:
user_message: 用户消息
max_turns: 最大工具调用轮次(防止无限循环)
"""
self.messages.append({
"role": "user",
"content": user_message
})

turns = 0
while turns < max_turns:
turns += 1

# ===== 调用模型 =====
response = self.client.chat.completions.create(
model=self.model,
messages=self.messages,
tools=self.tools if self.tools else None,
tool_choice="auto" # auto:模型决定 / required:必须调用工具
)

message = response.choices[0].message

# ===== 普通文本回复,结束对话 =====
if message.content is not None:
self.messages.append({
"role": "assistant",
"content": message.content
})
return message.content

# ===== 工具调用 =====
if message.tool_calls:
tool_results = []

for tool_call in message.tool_calls:
func_name = tool_call.function.name
func_args = tool_call.function.arguments

# 【关键】arguments是JSON字符串,需要解析
try:
args_dict = json.loads(func_args)
except json.JSONDecodeError:
args_dict = {}
print(f"⚠️ 参数解析失败: {func_args}")

# 调用工具处理函数
if func_name in self.tool_handlers:
try:
result = self.tool_handlers[func_name](**args_dict)
print(f"✅ 工具调用成功: {func_name}{str(result)[:100]}")
except Exception as e:
result = f"工具执行错误: {str(e)}"
print(f"❌ 工具执行失败: {func_name}{str(e)}")
else:
result = f"未知工具: {func_name}"

# 记录工具调用结果到消息历史
self.messages.append({
"role": "assistant",
"tool_calls": [
{
"id": tool_call.id,
"type": "function",
"function": {
"name": func_name,
"arguments": func_args
}
}
]
})

tool_results.append({
"tool_call_id": tool_call.id,
"role": "tool",
"content": json.dumps(result, ensure_ascii=False)
if not isinstance(result, str)
else result
})

# 追加工具结果消息,继续下一轮
self.messages.extend(tool_results)
continue

# 既无文本也无工具调用,结束
return message.content or ""

return "已达到最大调用次数限制"

3.3 生产级工具注册示例

# 定义工具处理函数(真实业务逻辑)
def search_docs(query: str, top_k: int = 5) > dict:
"""文档搜索工具"""
# 实际项目中连接向量数据库
results = vector_db.search(query=query, k=top_k)
return {
"query": query,
"total": len(results),
"documents": results
}

def run_sql(query: str, dry_run: bool = False) > dict:
"""SQL执行工具(生产环境需要严格权限控制)"""
if dry_run:
return {"status": "preview", "query": query}

# 实际项目中需要:SQL语法校验 → 权限校验 → 执行
result = db.execute(query)
return {"rows_affected": result.rowcount, "data": result.fetchall()[:100]}

def send_email(to: str, subject: str, body: str) > dict:
"""邮件发送工具"""
if not re.match(r"^[\\w\\.-]+@[\\w\\.-]+\\.\\w+$", to):
return {"success": False, "error": "无效邮箱地址"}

# 实际项目中连接邮件服务
email_client.send(to=to, subject=subject, body=body)
return {"success": True, "message": f"邮件已发送至 {to}"}

# 注册工具
agent = OpenAIFunctionAgent(model="gpt-4o")
agent.register_tool(
name="search_docs",
description=(
"搜索技术文档知识库。"
"适用场景:查找API文档、技术方案、最佳实践。"
"返回最相关的N条文档片段和相似度分数。"
),
parameters={
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "搜索查询语句,支持自然语言"
},
"top_k": {
"type": "integer",
"description": "返回结果数量",
"default": 5,
"minimum": 1,
"maximum": 20
}
},
"required": ["query"]
},
handler=search_docs
)

agent.register_tool(
name="run_sql",
description=(
"执行只读SQL查询语句。"
"只支持SELECT语句,其他SQL会被拒绝。"
"返回最多100行结果。"
),
parameters={
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "SQL SELECT语句"
},
"dry_run": {
"type": "boolean",
"description": "是否仅预览不执行",
"default": False
}
},
"required": ["query"]
},
handler=run_sql
)

# 对话测试
result = agent.chat("帮我搜索一下关于PostgreSQL索引优化的文档")
print(result)


4. Anthropic Tool Use深度剖析

4.1 Claude的Tool Use机制

Claude的Tool Use与OpenAI有本质区别:Claude原生支持流式工具调用(在stream_events中实时输出tool_use事件),而OpenAI需要等待完整响应。

# anthropic_tool_use.py

from anthropic import Anthropic
import json

client = Anthropic(api_key="sk-ant-xxx")

class ClaudeFunctionAgent:
"""Anthropic Claude Tool Use Agent"""

def __init__(self, model: str = "claude-sonnet-4-20250514"):
self.client = client
self.model = model
self.tools: list[dict] = []
self.tool_handlers: dict[str, Callable] = {}
self.messages: list[dict] = []

def register_tool(
self,
name: str,
description: str,
input_schema: dict,
handler: Callable
):
"""
注册工具(Anthropic参数名为 input_schema 而非 parameters)
"""

self.tools.append({
"name": name,
"description": description,
"input_schema": input_schema
})
self.tool_handlers[name] = handler

def chat(self, user_message: str, max_turns: int = 10) > str:
self.messages.append({
"role": "user",
"content": user_message
})

for _ in range(max_turns):
response = self.client.messages.create(
model=self.model,
max_tokens=4096,
tools=self.tools,
messages=self.messages
)

# 检查是否有工具调用
if response.stop_reason == "tool_use":
# 【关键】Anthropic直接返回dict,不需要JSON解析
tool_use = response.content[0]
tool_name = tool_use.name
tool_input = tool_use.input # ← 直接是dict!

print(f"🔧 调用工具: {tool_name}")
print(f"📥 参数: {json.dumps(tool_input, ensure_ascii=False, indent=2)}")

# 执行工具
if tool_name in self.tool_handlers:
result = self.tool_handlers[tool_name](**tool_input)
else:
result = f"未知工具: {tool_name}"

# 【关键差异】Anthropic用content block格式追加结果
self.messages.append({
"role": "user", # 注意:Claude要求用user角色追加工具结果
"content": [
{
"type": "tool_result",
"tool_use_id": tool_use.id,
"content": json.dumps(result, ensure_ascii=False)
}
]
})
continue

# 普通文本回复
text = response.content[0].text
self.messages.append({
"role": "assistant",
"content": text
})
return text

return "已达到最大调用次数"

4.2 流式Tool Use(高级用法)

async def chat_streaming(user_message: str):
"""
流式Tool Use – 实时看到工具调用过程
适用于需要即时反馈的长操作
"""

async with client.messages.stream(
model="claude-sonnet-4-20250514",
max_tokens=4096,
tools=tools,
messages=[{"role": "user", "content": user_message}]
) as stream:
async for event in stream:
# 实时输出模型思考过程
if event.type == "content_block_delta":
if event.delta.type == "thinking_delta":
# 模型内部思考(部分模型支持)
print(event.delta.thinking, end="", flush=True)
elif event.delta.type == "text_delta":
print(event.delta.text, end="", flush=True)

# 【关键】工具调用在流式中实时触发
elif event.type == "tool_use":
print(f"\\n\\n🔧 [流式] 调用工具: {event.name}")
print(f"📥 参数: {event.input}\\n")

elif event.type == "message_delta":
if event.delta.stop_reason == "tool_use":
print("\\n⏳ 等待工具结果…")


5. 生产级Agent架构设计:统一抽象层

5.1 为什么需要统一抽象

生产环境中,一个项目往往需要同时支持多个模型(成本、效果、可用性):

  • 日常对话 → 便宜的GPT-4o-mini
  • 复杂推理 → GPT-4o / Claude Sonnet
  • 特定领域 → 垂类模型

统一抽象层让切换模型成本为零。

5.2 架构设计

┌──────────────────────────────────────────────────────────┐
│ UnifiedAgent(统一入口) │
├──────────────────────────────────────────────────────────┤
│ register_tool() / chat() / chat_streaming() │
└──────────────────────────┬───────────────────────────────┘

┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────────┐
│ OpenAI适配器│ │Anthropic适配│ │ Gemini适配器 │
│ OpenAIAdapter│ │ClaudeAdapter│ │ GeminiAdapter │
├─────────────┤ ├─────────────┤ ├─────────────────┤
│ tool_calls │ │ tool_use │ │ function_call │
│ JSON字符串 │ │ 直接dict │ │ 各自格式 │
└─────────────┘ └─────────────┘ └─────────────────┘

5.3 统一抽象核心代码

# unified_agent.py

from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from typing import Callable, Any
import json
import asyncio

@dataclass
class Tool:
"""统一工具定义"""
name: str
description: str
parameters: dict # JSON Schema
handler: Callable

@dataclass
class ToolCall:
"""统一工具调用结果"""
name: str
arguments: dict
result: Any = None
error: str = None

class BaseModelAdapter(ABC):
"""模型适配器抽象基类"""

@abstractmethod
def register_tool(self, tool: Tool): pass

@abstractmethod
async def chat(self, message: str, tools: list[Tool]) > str: pass

class UnifiedAgent:
"""统一Agent – 支持多模型无缝切换"""

def __init__(self, adapter: BaseModelAdapter):
self.adapter = adapter
self.tools: list[Tool] = []
self.max_turns = 10

def register_tool(self, tool: Tool):
self.tools.append(tool)
self.adapter.register_tool(tool)

async def chat(self, message: str) > str:
"""
核心对话方法 – 对上层透明,不感知底层模型差异
"""

return await self.adapter.chat(message, self.tools, self.max_turns)

# ===== OpenAI适配器实现 =====

class OpenAIAdapter(BaseModelAdapter):
"""OpenAI Function Calling适配器"""

def __init__(self, api_key: str, model: str = "gpt-4o"):
from openai import OpenAI
self.client = OpenAI(api_key=api_key)
self.model = model
self._handlers: dict[str, Callable] = {}
self._messages: list[dict] = []

def register_tool(self, tool: Tool):
self._handlers[tool.name] = tool.handler

async def chat(
self,
message: str,
tools: list[Tool],
max_turns: int
) > str:
self._messages.append({"role": "user", "content": message})

openai_tools = [
{
"type": "function",
"function": {
"name": t.name,
"description": t.description,
"parameters": t.parameters
}
}
for t in tools
]

for _ in range(max_turns):
response = self.client.chat.completions.create(
model=self.model,
messages=self._messages,
tools=openai_tools or None
)

msg = response.choices[0].message

if msg.content:
self._messages.append({"role": "assistant", "content": msg.content})
return msg.content

if msg.tool_calls:
tool_messages = []

for tc in msg.tool_calls:
func_name = tc.function.name
args = json.loads(tc.function.arguments)

try:
result = self._handlers[func_name](**args)
except Exception as e:
result = {"error": str(e)}

tool_messages.append({
"role": "tool",
"tool_call_id": tc.id,
"content": json.dumps(result, ensure_ascii=False)
})

self._messages.extend(tool_messages)
continue

return "达到最大调用次数"

# ===== 使用示例 =====

async def main():
# 初始化(轻松切换模型)
# adapter = OpenAIAdapter(api_key="sk-xxx")
adapter = OpenAIAdapter(api_key="sk-xxx")
agent = UnifiedAgent(adapter)

# 注册工具
agent.register_tool(Tool(
name="get_weather",
description="获取指定城市的天气信息",
parameters={
"type": "object",
"properties": {
"location": {"type": "string", "description": "城市名称"}
},
"required": ["location"]
},
handler=lambda location: {"city": location, "temp": 22, "condition": "晴"}
))

# 对话
result = await agent.chat("北京今天天气怎么样?")
print(result)

if __name__ == "__main__":
asyncio.run(main())


6. 实战:构建支持多模型的Function Calling Agent

6.1 场景需求

构建一个数据库问答Agent,支持:

  • 自然语言查询数据库结构
  • 执行安全SQL查询
  • 一次对话中跨模型协作(简单问题用小模型,复杂问题自动升级)

6.2 完整实现

# db_qa_agent.py

import re
import sqlite3
import json
from dataclasses import dataclass
from typing import Optional
import asyncio

@dataclass
class DatabaseSchema:
"""数据库Schema元信息"""
tables: dict # {table_name: {columns: […], description: str}}

class DatabaseQAAgent:
"""
数据库问答Agent
功能:自然语言查询数据库 + 自动生成安全SQL
"""

def __init__(self, agent_adapter):
self.agent = agent_adapter
self.db_schema: Optional[DatabaseSchema] = None
self._register_tools()

def load_schema(self, schema: DatabaseSchema):
"""加载数据库Schema供Agent理解"""
self.db_schema = schema

def _register_tools(self):
from unified_agent import Tool, UnifiedAgent

# 工具1:查询数据库结构
self.agent.register_tool(Tool(
name="describe_table",
description=(
"查看数据表的结构信息。"
"返回表的所有列名、类型、是否主键、默认值。"
"用于了解数据有哪些字段可用。"
),
parameters={
"type": "object",
"properties": {
"table_name": {
"type": "string",
"description": "表名"
}
},
"required": ["table_name"]
},
handler=lambda table_name: self._describe_table(table_name)
))

# 工具2:执行只读SQL
self.agent.register_tool(Tool(
name="execute_query",
description=(
"执行SQL SELECT查询(仅支持SELECT,危险SQL自动拒绝)。"
"返回查询结果的JSON格式。"
"结果限制返回100行。"
),
parameters={
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "SELECT SQL语句"
}
},
"required": ["sql"]
},
handler=lambda sql: self._execute_query(sql)
))

# 工具3:获取完整Schema
self.agent.register_tool(Tool(
name="get_full_schema",
description="获取当前连接数据库的完整Schema信息",
parameters={"type": "object", "properties": {}},
handler=lambda: self._get_full_schema()
))

def _describe_table(self, table_name: str) > dict:
"""获取表结构"""
if not self.db_schema:
return {"error": "Schema未加载"}

if table_name not in self.db_schema.tables:
return {"error": f"表 {table_name} 不存在"}

return {
"table": table_name,
"columns": self.db_schema.tables[table_name]["columns"],
"description": self.db_schema.tables[table_name].get("description", "")
}

def _execute_query(self, sql: str) > dict:
"""安全SQL执行"""
sql = sql.strip().upper()

# 基础安全检查
if not sql.startswith("SELECT"):
return {"error": "仅支持SELECT查询"}

dangerous_keywords = ["DROP", "DELETE", "INSERT", "UPDATE",
"TRUNCATE", "ALTER", "CREATE"]
for kw in dangerous_keywords:
if kw in sql:
return {"error": f"禁止的操作: {kw}"}

try:
# 实际项目中使用连接池
conn = sqlite3.connect(":memory:")
# … 实际执行
return {
"success": True,
"rows": [],
"count": 0
}
except Exception as e:
return {"error": str(e)}

def _get_full_schema(self) > dict:
"""获取完整Schema"""
if not self.db_schema:
return {"error": "Schema未加载"}
return {
"tables": list(self.db_schema.tables.keys()),
"details": self.db_schema.tables
}

# ===== 使用示例 =====

async def demo():
from unified_agent import OpenAIAdapter, UnifiedAgent

adapter = OpenAIAdapter(api_key="sk-xxx")
agent = UnifiedAgent(adapter)

db_agent = DatabaseQAAgent(agent)
db_agent.load_schema(DatabaseSchema(
tables={
"orders": {
"columns": [
{"name": "id", "type": "INTEGER", "pk": True},
{"name": "user_id", "type": "INTEGER"},
{"name": "amount", "type": "REAL"},
{"name": "created_at", "type": "TEXT"}
],
"description": "订单表"
},
"users": {
"columns": [
{"name": "id", "type": "INTEGER", "pk": True},
{"name": "name", "type": "TEXT"},
{"name": "email", "type": "TEXT"}
],
"description": "用户表"
}
}
))

# 自然语言查询
result = await agent.chat(
"查一下2024年订单金额超过1000元的用户,"
"返回用户名、邮箱和订单总额,按金额降序排列"
)
print(result)

if __name__ == "__main__":
asyncio.run(demo())


7. 性能优化与常见坑点

7.1 常见错误与解决方案

错误现象根本原因解决方案
工具调用参数类型错误 JSON Schema定义不严谨 明确type,必填字段加required
模型不调用工具 description不够清晰 参考Anthropic的要求:描述要准确且完整
无限循环调用同一工具 缺少终止条件 设置max_turns,工具结果要明确告知是否完成
arguments解析失败 OpenAI返回JSON字符串需解析 始终加json.loads()容错处理
上下文溢出 工具结果太长 对结果截断或压缩再传回给模型
工具调用结果丢失 追加消息格式错误 OpenAI用role: tool,Anthropic用tool_result类型

7.2 性能优化实践

# 优化1:批量并行调用(当模型请求多个工具时)
async def execute_tools_parallel(tool_calls: list) > list:
"""并行执行多个工具调用"""
tasks = [
execute_single_tool(tc)
for tc in tool_calls
]
results = await asyncio.gather(*tasks, return_exceptions=True)
return results

# 优化2:工具结果压缩(减少token消耗)
def compress_tool_result(result: dict, max_chars: int = 2000) > str:
"""压缩工具结果,避免上下文溢出"""
text = json.dumps(result, ensure_ascii=False)
if len(text) <= max_chars:
return text

# 保留关键字段 + 截断长字段
if isinstance(result, dict):
summary = {}
for k, v in result.items():
if isinstance(v, str) and len(v) > 500:
summary[k] = v[:500] + "…[已截断]"
elif isinstance(v, list) and len(v) > 10:
summary[k] = v[:10] + f"…[共{len(v)}条]"
else:
summary[k] = v
return json.dumps(summary, ensure_ascii=False)

return text[:max_chars] + "…[已截断]"

# 优化3:工具超时控制
async def execute_with_timeout(func, args, timeout: float = 10.0):
"""工具执行超时控制,防止Agent卡死"""
try:
return await asyncio.wait_for(func(**args), timeout=timeout)
except asyncio.TimeoutError:
return {"error": f"工具执行超时({timeout}秒)"}


8. 总结与展望

8.1 核心要点

Function Calling 知识体系:

协议层:
OpenAI → tool_calls + JSON字符串arguments
Claude → tool_use + 直接dict
Gemini → function_call + 各自格式

架构层:
统一抽象 → 解耦上层应用与底层模型
工具注册 → description是AI理解工具的唯一途径
结果处理 → 追加回messages继续对话,max_turns防死循环

生产层:
参数验证 → JSON Schema必须完整
安全控制 → SQL执行、文件操作必须有防护
性能优化 → 并行执行 + 结果压缩 + 超时控制

8.2 未来趋势

1. MCP协议统一:工具发现+调用+传输一站式解决
2. 多模态工具:支持图像、音频、视频处理工具
3. 安全治理:企业级工具权限、审计、限流
4. 模型无关:一次定义工具,任意模型可调用

8.3 参考资料

  • OpenAI Function Calling文档
  • Anthropic Tool Use文档
  • Google Gemini Function Calling
  • MCP协议规范
  • LangChain Function Calling

  • 写在最后

    Function Calling是AI Agent的「眼睛和手」,但Agent的「大脑」——规划、记忆、反思——同样重要。本文聚焦在工具调用本身,关于Agent的规划与记忆系统,后续专题再展开。有具体生产场景需要讨论的,评论区见。

    赞(0)
    未经允许不得转载:171主机测评 » Function_Calling架构深度解析:从原理到生产级Agent实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址