一、背景与目标

随着大模型和 MCP(Model Context Protocol)生态的成熟,AI Agent 已经能够通过标准化的工具调用完成越来越复杂的任务。但在技术文章自动生成与分发的场景中,仅依赖模型内部知识往往存在信息滞后或领域深度不足的问题。通过引入联网检索,Agent 可以在生成前主动拉取最新的技术博客、面经或社区问答,将外部知识注入到上下文里,再由 MCP 工具将生成的长文自动发布至 CSDN 等平台。本文围绕这一工作流,梳理从关键词提取、联网检索、上下文注入到最终发布的工程链路,并给出可部署、可观测的生产级实践建议。

我们将以社区中几个成熟的开源方案为参考,如 gulihua10010/mcp-server-article、CorgiBoyG/mcp-server-csdn、AI-MCP-CactusLi 等,它们提供了 CSDN 发布、搜索面经、查询资讯等 MCP 工具。这些项目让 Agent 可以直接调用工具获取外部文章,再由大模型总结加工,最终生成高质量长文并发布。本文的目标是帮助开发者在自己的 AI Agent 系统中复现并优化这一流程,同时解决 Cookie 管理、超时重试、日志审计等生产问题。

二、整体架构设计

一个典型的联网检索增强的自动发文系统由三层组成:触发与编排层、工具与检索层、发布与观测层。触发层可以是定时任务(如 CactusLi 中的 Cron 调度)或 API 调用,负责向 Agent 发送指令,要求其根据指定主题生成文章并发布。工具与检索层则包含 MCP 客户端以及背后的一系列 MCP Server,例如搜索新闻、检索牛客面经、抓取 CSDN 站内内容等。发布层通过 CSDN 发布工具将代理生成的内容提交到平台,同时记录日志与发布链接。

整个流程中的数据流转通常为:触发器传入话题或关键词 → Agent 调用关键词提取工具(或自行从话题提取)→ 调用联网检索工具获取多篇文章内容 → 将原文聚合、去重、压缩后注入对话上下文 → 大模型生成 Markdown 长文 → 调用 CSDN 发布工具提交文章 → 返回发布结果与链接。这种架构清晰地分离了职责,使得每一层可以独立扩展、替换模型或变更目标平台。

三、核心节点职责与交互

在基于 Spring AI 的 Java 实现中,核心节点通常包括:ChatClient 编排器、ToolCallbackProvider 提供的工具集、以及各个 MCP Server 的服务端。ChatClient 作为 Agent 的大脑,接收用户 Prompt 后根据内置工具列表决定调用哪些工具、传入何种参数。例如,当用户说“帮我写一篇关于快速排序的技术文章并发布到 CSDN”时,ChatClient 可能先调用搜索工具获取最新的排序算法讨论,再调用生成工具总结内容,最后调用 CSDN 发布工具。

MCP Server 的职责是封装外部服务为标准的 @Tool 方法。以 CorgiBoyG/mcp-server-csdn 为例,saveArticle 方法定义了 title、markdowncontent、tags 等参数,内部负责将 Markdown 转 HTML、组装请求头、携带 Cookie 调用 CSDN API。类似地,gulihua10010/mcp-server-article 中的 searchNews 工具则通过 HTTP 客户端请求外部搜索接口,解析返回的标题和摘要,为 Agent 提供可用的参考素材。各节点通过 MCP 协议的 stdio 或 SSE 通道通信,Agent 无需关心远端实现细节,只需知道工具签名即可组合使用。

四、关键词提取与联网检索链路

为了让联网检索返回高质量内容,关键词提取是关键一步。一种常见做法是让大模型先从用户意图中提取出核心术语。例如,针对“快速排序算法文章”,Agent 可能提取“快速排序”、“Java 实现”、“时间复杂度分析”等词组,然后作为查询参数传给搜索工具。在腾讯云社区的《DEBUG MCP SERVER》一文中,还提到了使用 rapidfuzz 对搜索结果进行模糊匹配和评分排序,保留与查询相关度最高的片段,从而提升检索质量。

搜索工具的实现可以多种多样。searchNews 可能调用公开的新闻 API,searchExperienceQuestion 可能直接请求牛客网接口,而站内检索工具则通过 site:csdn.net 限定范围。为防止重复和低质内容污染上下文,可对返回文章进行结构化抽取和语义切片,只保留标题、摘要或高相似度段落,这就是上下文压缩的意义。在代码层面,搜索工具返回的数据通常被整理为文本数组,供 Agent 下一步引用。例如以下伪代码展示了工具内部的处理逻辑:

@Tool(description = "搜索 CSDN 站内文章,返回摘要列表")
public List searchCsdn(String query, int limit) {
List
articles = searchProvider.search(query, limit);
articles.sort(Comparator.comparing(Article::getScore).reversed());
return articles.stream()
.map(a -> a.getTitle() + "\n" + a.getExcerpt())
.toList();
}

完成检索后,Agent 会将得到的内容片段注入到对话上下文中,并指示模型基于这些素材生成技术文章。为了保证上下文长度不超出限制,同时保留足够的信息量,可以选择最相关的 3~5 篇内容,截取前 500~800 词作为参考,或者使用摘要模型预先压缩原文。这种做法既控制了 Token 消耗,又避免了无关内容稀释生成质量。

五、上下文注入与长文生成

上下文注入的过程需要谨慎设计 Prompt 模板。通常会加入一段明确的指令,例如“请基于以下参考资料写一篇 CSDN 风格的技术文章,要求包含代码示例和原理解析”,然后将检索到的摘要拼接在 Prompt 末尾。如果参考资料中涉及代码,模型会自然地在生成文章中复现或改写这些代码,增强文章的可读性和实用性。同时,为了让文章具备个人风格或避免抄袭检测,可以要求模型对参考内容进行改写、融合多个来源的观点,并补充自己的见解。

长文生成还需注意格式保持。由于最终要发布到 CSDN,模型输出的 Markdown 必须包含合适的标题层级、代码块、列表等。如果使用的是 ChatClient 的流式输出,需要在前端或中间件中收集完整的 Markdown 文本,再交给 CSDN 发布工具。对于生成质量的控制,可以在 Prompt 中设置约束条件,如“全文不少于 800 字,至少包含两个代码示例”,并配合字数校验的逻辑。在 CactusLi 的定时任务中,还实现了对生成文章的自动审核,如果检测到内容过短或关键部分缺失,会触发重试或告警。

六、MCP 工具调用与 CSDN 自动发布

CSDN 发布工具是整条链路的最后一步,也是最依赖平台适配的一环。开源项目如 CorgiBoyG/mcp-server-csdn 和 luyanchang/mcp-server-csdn-final 都提供了典型的实现:它们基于 Retrofit 或 Hutool 封装了 CSDN 的文章保存接口 https://bizapi.csdn.net/blog-console-api/v3/mdeditor/saveArticle,在服务器端完成 Markdown 到 HTML 的 Flexmark 转换,并携带从浏览器抓取的 Cookie 完成认证。Agent 只需要调用 saveArticle 工具并传入 title、markdowncontent、tags 等参数即可。

在工具配置层面,开发者需要在 MCP 客户端配置文件(如 application.yml 或 mcp-servers-config.json)中声明 CSDN MCP Server 的启动命令、jar 包路径以及 Cookie 环境变量。例如:

"mcpServers": {
"csdn-server": {
"command": "java",
"args": ["-jar", "path/to/mcp-server-csdn.jar"],
"env": {
"CSDN_COOKIE": "your_csdn_cookie_value"
}
}
}

这样,ChatClient 在启动时会自动加载该工具,Agent 便可以通过自然语言驱动发布流程。发布成功后,工具通常会返回文章 ID 和链接,Agent 可将这些信息反馈给用户或写入日志,供后续查询或数据统计使用。需要注意的是,Cookie 存在过期问题,生产环境中应建立定期刷新机制或通过配置中心热更新。

七、错误处理与容错机制

生产系统中的 Agent 工作流必须应对各种故障:联网检索超时、CSDN API 返回 403 或 500、生成内容不符合规范等。对于网络层面的错误,应在 MCP Server 实现中加入超时与重试逻辑。例如,CSDN 发布服务可以在 Retrofit 中配置连接超时和重试拦截器,当遇到 5xx 错误时自动重试 2~3 次,间隔指数退避。工具方法还应捕获异常并返回结构化的错误信息,而不是直接抛出,避免 Agent 流程中断。

try {
Response response = csdnApi.saveArticle(article, cookie);
if (!response.isSuccess()) {
throw new RuntimeException("发布失败: " + response.getMsg());
}
return response.getData().getArticleUrl();
} catch (IOException e) {
log.error("网络异常", e);
return "ERROR: 网络连接失败,已触发重试";
}

对于生成内容质量的错误,可以在 Agent 编排层加入校验步骤。例如,当生成的文章字数少于 200 字,或者 Markdown 中缺少必要的标题时,编排服务可以自动让模型重新生成或补充。如果多次重试仍不合格,则进入人工审核队列并发送告警通知。这种分层错误处理方式保证了系统弹性。

八、生产部署建议

部署一个联网检索增强的自动发文系统时,首先需要规划运行环境。推荐使用 Docker 容器化各个 MCP Server,并通过 Docker Compose 启动全套组件。Docker 镜像可以基于 openjdk:17-slim 构建,将 jar 包和配置文件打包在一起。环境变量(如 API Key、Cookie)应通过安全的 Secrets 管理工具注入,禁止硬编码在镜像或代码仓库中。

定时任务的调度建议使用分布式调度框架,如 XXL-JOB 或基于 Spring 的 @Scheduled 注解,并限制执行时间窗口(如 8:00-23:00),避免深夜生成文章引起平台封禁风险。日志方面,建议将 Agent 调用链路、MCP 工具入参出参、耗时、异常等全部输出到结构化日志中,便于排查问题。CSDN 发布结果、文章链接等关键信息可写进数据库,形成发布记录,便于后续统计分析及对账。Cookie 管理方面,可以编写一个健康检查任务,每天验证 Cookie 是否有效,无效时通过邮件或即时通讯工具通知运维更新。

九、可观测性与审计

可观测性不仅仅是查看日志,还要监控整个工作流的关键指标。建议对每个 MCP 工具调用进行埋点,记录调用次数、成功率、平均耗时和异常率。例如,使用 Micrometer + Prometheus 导出指标,并在 Grafana 中配置面板。对于 CSDN 发布工具,需要重点关注发布成功率、平均转换耗时(Markdown 转 HTML 等)以及不同文章分类的发布量分布。

审计方面,应保留每次生成文章的完整链路快照,包括触发关键词、检索到的参考资料列表、最终生成的 Markdown 原文以及发布后的 URL。这些数据可以存储在对象存储或数据库中,方便追溯内容来源、排查平台投诉或分析文章质量。同时,可在 Agent 层面添加 human-in-the-loop 环节,对于高风险分类或自动检测到低质内容的文章,先发送到审核界面,由人工确认后再发布,进一步降低风险。

十、演进建议与总结

当前方案已经能够实现从联网检索到自动发布的闭环,但仍有优化的空间。例如,在上下文注入环节,可以引入向量数据库对检索到的长文进行更细粒度的切片和相似度排序,仅注入与生成主题最相关的段落,进一步提升生成质量。在发布平台方面,可扩展至掘金、博客园、微信公众号等多个渠道,通过统一的门面工具根据配置自动分发,并在发布后采集阅读量和评论反馈回来作为生成策略优化的依据。

总结来说,将联网检索融入 AI Agent 工作流,可以显著增强生成内容的时效性和深度,而基于 MCP 的工具调用则让发布动作变得标准、可组合。开发者在落地时需重点关注密钥与 Cookie 管理、错误处理与重试、可观测性建设以及内容审核机制,才能在享受自动化的同时避免生产事故。希望本文的工程实践能帮助你构建一个稳定、智能的自动发文系统。

参考资料

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐