使用Dify开发新闻自动生成系统的全过程记录
在信息爆炸的时代,热点事件每分钟都在发生,而传统新闻生产流程却难以匹配这种速度。某地突发暴雨引发城市内涝,社交媒体上已有上千条现场视频,但等到记者赶赴现场、撰写稿件、层层审核后发布,黄金传播期早已过去——这样的场景在媒体行业中屡见不鲜。
有没有可能让系统自动感知热点、检索权威信息、生成结构完整且风格统一的新闻稿,并在几分钟内交付?我们尝试用Dify搭建了一套新闻自动生成系统,结果令人振奋:从输入关键词到输出可发布的初稿,平均耗时不到30秒,内容事实准确率提升40%以上。
这背后不是简单调用大模型API,而是构建了一个融合检索增强、智能体编排与工程化管理的闭环系统。接下来,我将带你深入这个项目的每一个关键环节,看看它是如何一步步成型的。
整个系统的核心是 Dify —— 一个开源的 AI 应用开发平台。它不像传统的“写代码+调模型”模式,而是把 LLM 的使用过程变成了“配置即服务”。你可以把它理解为“大模型的操作系统”:提供界面让你设计提示词、连接数据源、编排任务流,最后一键发布成 API。
比如我们要做一个“突发事件报道生成器”,不需要从零写 Flask 服务或封装 LangChain 链条,只需要在 Dify 的可视化界面上完成三件事:
- 定义输入变量(如
topic、length、style); - 编辑 Prompt 模板,嵌入动态上下文;
- 开启 RAG 和 Agent 功能,绑定外部工具。
完成后,系统就能根据用户输入,自动完成信息检索、多步推理和文本生成。
最直观的优势是什么?以前调试一次提示词要改代码、重启服务、重新测试;现在只需修改模板并保存,立即生效。团队协作时,产品经理可以直接参与 Prompt 设计,工程师则专注对接业务系统,效率大幅提升。
这套系统的“大脑”其实是一个由多个模块协同工作的流水线。以生成一篇关于“AI医疗新突破”的新闻为例,整个流程远不止“输入主题→输出文章”这么简单。
首先,系统会判断是否需要补充背景知识。如果启用了 RAG(Retrieval-Augmented Generation),Dify 会在向量数据库中搜索近期相关的科技报道、论文摘要或政策文件。这些资料不是靠关键词匹配找出来的,而是通过语义向量化实现的相似性检索。例如,“深度学习辅助癌症早筛”和“神经网络用于肿瘤影像识别”虽然措辞不同,但会被精准关联。
检索到的内容会被自动拼接到 Prompt 中,作为生成依据。这样做的意义在于显著降低幻觉风险。我们在测试中发现,未启用 RAG 时,模型有约35%的概率虚构研究机构名称或引用不存在的数据;加入检索增强后,这一比例下降至不足8%。
更进一步的是 Agent 工作流的设计。真正的自动化不能只依赖单次生成,而应具备“思考-行动-反馈”的能力。Dify 支持基于 ReAct 框架的智能体编排,这意味着它可以像人类编辑一样分步骤处理任务。
举个例子,当收到“生成SpaceX星舰最新发射报道”的请求时,Agent 的执行路径可能是:
- 观察:接收到主题“SpaceX 星舰第三次试飞”;
- 思考:当前知识库更新截止到第二次试飞,需获取最新进展;
- 行动:调用注册好的“网络搜索工具”,向外部 API 发起查询;
- 等待:暂停流程,等待返回结果;
- 继续:拿到三条相关新闻链接后,提取关键信息;
- 生成:结合检索结果与预设模板,输出包含时间、地点、结果、专家评论的完整稿件。
整个过程中,每一步决策都可在 Dify 后台清晰追踪:为什么调用了某个工具?返回了哪些数据?最终是如何整合成文的?这种透明性对于调试和合规审查至关重要。
为了支撑这套机制,数据准备是第一步。你不能指望模型凭空写出高质量内容,必须为它准备好“弹药库”。
Dify 提供了内置的知识库管理功能,支持上传 PDF、TXT、HTML 等多种格式文档。更重要的是,它会自动完成以下工作:
- 文本分块(chunking),控制每段长度(建议512~1024 tokens);
- 使用嵌入模型(如 BGE 或 text2vec)将其转化为向量;
- 存入向量数据库(支持 Weaviate、Milvus 或内置 Chroma);
- 建立索引,供后续快速检索。
我们每天凌晨定时运行脚本,抓取主流媒体网站的 RSS 内容,清洗后批量导入 Dify 数据集。以下是实际使用的 Python 示例:
import requests DATASET_API = "https://api.dify.ai/v1/datasets" API_KEY = "your-admin-key" # 创建一个新的数据集 create_dataset = { "name": "Latest Tech News Q3_2024", "description": "Quarterly tech news crawl from major outlets" } resp = requests.post(DATASET_API, json=create_dataset, headers={ "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" }) dataset_id = resp.json()["id"] # 添加文档块 document_data = { "dataset_id": dataset_id, "documents": [ { "name": "article_001.txt", "text": "OpenAI launched a new reasoning model...", "indexing_technique": "high_quality", # 使用高质量嵌入 "chunk_optimization_config": { "automatic": True } } ] } doc_resp = requests.post(f"{DATASET_API}/{dataset_id}/documents", json=document_data, headers=headers) if doc_resp.status_code == 201: print("文档成功上传并开始向量化处理") else: print("上传失败:", doc_resp.text)这段代码实现了自动化数据注入。一旦文档进入系统,后续所有启用该知识库的应用都能即时访问最新内容。这对于财经快讯、灾害通报等强时效性场景尤为关键。
除了被动响应请求,我们还希望系统能主动发现问题。为此,我们注册了几个自定义工具,赋予 Agent 更强的外部交互能力。
比如下面这个 JSON 配置,定义了一个名为fetch_latest_news的远程工具:
{ "name": "fetch_latest_news", "description": "Fetch recent news articles about a given topic from external API", "parameters": { "type": "object", "properties": { "query": { "type": "string", "description": "Search keyword, e.g., 'quantum computing'" }, "count": { "type": "integer", "default": 5, "description": "Number of articles to return" } }, "required": ["query"] }, "remote_url": "https://your-service.com/api/news-fetcher", "method": "GET" }只要在 Agent 流程中勾选该工具,它就可以根据需要动态调用。Dify 会自动处理参数填充、HTTP 请求、错误重试等细节,开发者无需关心底层通信逻辑。
类似的工具还包括:
- 敏感词检测接口(防止生成不当言论)
- 语法润色服务(接入 Grammarly 类工具)
- CMS 推送通道(自动生成完成后直发官网)
这些能力组合起来,使得 Agent 不再只是一个“文字生成器”,而更像一个能独立完成采编发全流程的“数字编辑”。
当然,完全放任机器发布内容仍存在风险。因此我们在架构设计上保留了必要的控制点。
首先是权限隔离。不同频道(如体育、财经、社会)使用各自独立的知识库和 Prompt 模板,避免信息交叉污染。例如财经类稿件强调数据准确性,会强制启用高阈值的检索验证;而娱乐新闻侧重可读性,则允许更多创造性表达。
其次是人工兜底。目前所有自动生成的稿件都会先推送到审核后台,由值班编辑快速浏览确认。我们设置了三个核心质量指标进行监控:
| 指标 | 目标值 | 监测方式 |
|---|---|---|
| 平均响应时间 | < 30s | 日志统计 |
| 检索命中率 | > 85% | 成功引用外部资料的比例 |
| 重复内容比 | < 5% | NLP去重算法检测 |
一旦某项指标异常,系统会自动告警并触发优化流程。例如当发现某类话题频繁出现低命中率时,说明知识库覆盖不足,需补充相关数据源。
最后是模型冗余设计。Dify 支持多模型路由策略,我们可以同时配置 OpenAI、通义千问和本地部署的 ChatGLM 作为候选后端。当主模型服务不可达时,系统自动降级至备用模型,确保业务连续性。
对外集成也非常简便。Dify 可将应用一键发布为标准 RESTful API,客户端只需发起 POST 请求即可获取结果。以下是一个典型的调用示例:
import requests # Dify发布的API地址与密钥 API_URL = "https://api.dify.ai/v1/completions" API_KEY = "your-api-key-here" # 请求参数:对应Dify中定义的输入变量 payload = { "inputs": { "topic": "人工智能在医疗领域的最新进展", "length": "800字", "style": "正式新闻稿" }, "response_mode": "blocking" # 同步返回结果 } headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } # 发起请求 response = requests.post(API_URL, json=payload, headers=headers) if response.status_code == 200: result = response.json() print("生成新闻内容:") print(result["data"]["output"]) # 输出生成文本 else: print(f"请求失败:{response.status_code}, {response.text}")这个接口封装了底层所有复杂性:RAG 检索、Prompt 渲染、模型选择、错误重试……前端开发者只需关注输入输出,极大降低了集成门槛。
回过头看,这套系统带来的不仅是效率提升,更是一种工作范式的转变。
过去,内容生产的瓶颈在于人力有限、响应缓慢、风格难统一;而现在,借助 Dify 构建的这套自动化体系,我们实现了:
- 分钟级响应热点事件,尤其适用于地方新闻站、金融资讯平台等高频发布场景;
- 大幅减少初级编辑的重复劳动,让他们转向更高价值的策划与创意工作;
- 保证品牌语调一致性,通过固定模板杜绝表达偏差;
- 持续积累组织知识资产,每一次生成都在反哺知识库,形成正向循环。
更重要的是,它证明了即使没有庞大的算法团队,中小企业也能基于现有工具快速打造出具备专业能力的 AI 应用。
未来,随着 Agent 自主决策能力的增强,我们甚至可以设想一个“全自动新闻编辑室”:系统自行监控舆情、识别重大事件、组织采访资源、生成多版本稿件、按渠道特性分发——而人类的角色,将更多转向监督、评估与战略引导。
Dify 正在推动这样一个时代的到来:AI 不再是黑盒工具,而是可配置、可追踪、可信赖的数字员工。