96SEO 2026-08-02 07:18 1
话说回来,
昨晚凌晨我跑通了一个能调3种工具的 Agent——查天气、查数据库、读文件。不过,跑通那一刻才真正理解一件事:LLM自己啥也干不了它只会下工单。 你的代码才是干活的人。
新鲜道理,但手敲代码跑通闭环后感受完全不一样。之前看文档觉得 FC 挺简单——定义函数、注册 tool、两轮对话,概念三步就完了。其实,实际写的时候踩了4 个坑还有一个是中文数据库的 charset 问题。排查半小时才定位到根因,

今天把完整过程写出来从 FC 本地调函数到 MCP 协议通信,一条线看透 Agent 工具链是怎么从“一个人干活”进化到“团队协作”。
痛点:很多同学在实现 Function Calling 时只写了“查询天气”几个字的 description,导致 LLM 把所有涉及天气的话都误认为要调接口。
工具链的起点是 Function Calling。原理我之前学过——LLM 不调用函数,它只输出 tool_calls 意图。你的代码拿到意图执行后喂回去,LLM 才生成最终回答。两轮对话,LLM 只决定 “调什么、传什么参数”。
这次我把它跑通了。用 的免费天气 API,写了个 get_wear 函数,注册成 FC tool,让 LLM 决定什么时候调:
tools =
}
}
}]
问 “北京今天天气怎么样”。LLM 输出 get_wear代码执行拿到 “°C 晴 湿度24%”,喂回去,LLM 生成 “北京今天晴,30 度,湿度较低比较干燥”。
问 “帮我写个快排”——LLM 直接回答,不调工具。判断正确,
关键设计点: Description 字段是 LLM 决策的唯一依据。 写清楚比写花哨关键。如果你只写 “查天气” 三个字,LLM 可能把 “帮我查一下明天穿什么” 也理解成要调天气工具。写成 “查询指定城市的当前天气信息”,它就知道什么时候该调什么时候不该调。
痛点:
天气 API 跑通后我让 Agent 查 MySQL 数据库。其实,思路一样——定义 query_database 函数。注册成 tool,LLM 生成 SQL,代码执行返回结果。不过,
Agent 问 “工程部有几个员工? 平均薪资多少,” LLM 生成的 SQL 完全正确:
SELECT COUNT FROM employees WHERE department = '工程部';
conn = mysql.connector.connect(
host="localhost"。port=3306,user="root",password="llm_learn_2026",database="llm_learn",charset="utf8mb4" # 必须加,否则中文 WHERE 匹配不到
)
This pitfall is especially sneaky for Agent‑DB projects—SELECT * 能看到所有行,但 WHERE 中文条件永远匹配不到。说起来,如果你在做 Agent + 数据库的项目,请记住:"中文数据库必须全程统一使用 utf8mb4".
if not re.match:
return "错误:只允许 SELECT 查询。禁止 INSERT/UPDATE/DELETE/DROP"
sql = sql.split.strip # 截断分号防注入
LLM 生成的 SQL 并非基本可信;没有这层校验,一句 DROP TABLE 就可能毁库。话说回来,这是 Agent 安全的第一道防线——**工具函数自己做输入校验。不指望 LLM 自觉**。怎么说呢,
Pain point:
、返回格式怎样,无需硬编码。
I 用 Python 的 FastMCP 库实现了一个文件程序 Server,两项功能:list_files和 read_file。Server 代码极简:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP
@mcp.tool
def list_files -> str:
"""列出指定目录下的所有文件和子目录名称"""
# 实现省略
@mcp.tool
def read_file -> str:
"""读取指定文件的文本内容,限制返回前500行"""
# 实现省略
mcp.run
@mcp.tool 注解自动把函数名、参数、docstring 打包成 MCP 的 tool schema。 代表着 Agent 通过标准输入输出管道与 Server 通信,不需要打开 HTTP 端口。
The log after client connects:
Server 暴露了以下工具:
- list_files: 列出指定目录下的所有文件和子目录名称
- read_file: 读取指定文件的文本内容。限制返回前500行
能力,只要连上就能发现并调用。
MCP 调用方式与 FC 不同:
文件”和“读取 wear_agent.py 内容”。LLM 自动选择调用 list_files 或 read_file,并传递正确参数。整个闭环仍然是两轮对话,但工具发现与调用方式彻底不同,更加解耦、更易
| 维度 | FC 本地调用 | MCP 协议通信 |
|---|---|---|
| 工具发现 | 硬编码 tool 定义 | Server 自描述 |
| 调用方式 | 本地函数调用 | STDIO / SSE 协议 |
| 性 | 加新工具要改代码 | Server 热加载,新 Tool 就可以使用 |
| 部署形态 | 同进程 | 独立进程 / 跨机器 |
| 层级 | 名称 | 特征 | 类比 |
|---|---|---|---|
| 1 | Function Calling | 本地硬编码 | Spring MVC |
| 2 | Multi‑Channel Protocol | Server 自描述+协议交互 | 微服务 RPC |
| 3 | Skills | 可复用·可热加载·可分享 | Spring Boot Starter |
| 4 | Agent‑to‑Agent | 多 Agent 协作·消息队列·自治 | Kafka / Service Mesh |
| PITFALL | 根因 | 解决办法 |
|---|---|---|
| "中文WHERE匹配不到" | "Docker exec 插入时 charset=latin1 双重 UTF‑8 编码" | "SET NAMES utf8mb4;Python connector 加 charset=utf8mb4" |
| "第二轮未传 tools 参数" | "create 请求忘记带 tools 参数" | "第二轮 create 时一样传 tools=tools" |
| "Tool description 太模糊" | "LLM 无法区分何时应调何时不应调" | "description 写成完整业务意图与参数说明" |
| "Docker exec 插中文数据损坏" | "容器默认字符集不一致" | "统一使用 utf8mb4,从插入到查询全程保持" |
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback