RAG实战:用检索增强生成十分钟搭建AI快讯系统
1. 项目概述RAG到底在解决什么痛点1.1 从AI快讯这个场景说起先解释一下这个项目的由来。有一次朋友问我能不能弄一个“AI自动生成快讯”的小工具——就是抓取一堆新闻素材让大模型自动整理成条理清晰的快讯。我第一反应是很简单直接把素材丢给大模型不就行了但真正试过之后才发现这条路根本走不通。第一个问题是时效性。底层的通用大模型训练数据有严格的时间截止点它对最近发生的热点事件几乎一无所知。第二个问题是幻觉。如果素材里没有明确给出数字、人名和来源大模型为了让内容“看起来合理”会自动脑补出根本不存在的细节。第三个问题是可控性。你希望快讯的结论来自你提供的准确数据源而不是模型自己发挥。这时候RAGRetrieval-Augmented Generation检索增强生成就派上用场了。它把“知识”从大模型的静态参数里剥离出来变成一份可以动态查询的外部资料库。大模型在回答之前先到资料库里去检索相关内容再把检索结果作为参考资料拼接进提示词最后才生成答案。说白了就是给大模型配了一个“开卷考试”的资料库让它翻着资料答题而不是凭空回忆。把这个方案用在AI快讯上非常匹配。快讯的特点就是信息来源固定、时效性强、对准确性要求高这些恰好全是RAG的舒适区。而整个实现链路并不复杂一套完整的最小可用版本数据准备充分的情况下确实可以在十分钟以内跑通。1.2 适合谁看能解决什么问题如果你满足下面任何一个条件这篇内容都会对你有帮助刚接触大模型应用开发想找一个低门槛、可上手的落地场景有一定编程基础但对“RAG怎么做”“为什么这么做”缺乏系统性认知正在做知识库问答、文本摘要、自动报告之类的项目需要把外部数据接入大模型想理解“搜索大模型”这套组合在实际工程中的完整形态而不只是看概念。我说的“3分钟生成AI快讯”不是说三分钟能做出一个生产级系统而是指你已经具备数据、脚本和运行环境的前提下核心链路可以在几分钟内完成一次成功跑通。剩下的时间主要花在数据处理、效果调优和错误排查上——这些才是RAG应用真正的工程重点。2. 核心链路拆解先搞清楚RAG的每个环节在做什么2.1 离线部分知识入库是怎么完成的RAG的整体架构可以分成两条链路离线索引链路和在线查询链路。前者负责把一堆原始文档变成模型能检索的格式后者负责在收到提问时完成检索和生成。离线部分的工作可以拆成三步第一步是数据清洗。原始素材并不是直接能用新闻快讯里可能混有广告、重复段落、无关的页脚信息。清洗时要先去除HTML标签和无效字段再按新闻ID去重并确保每条记录都有标题、正文、发布时间这几个核心字段。数据不干净后面所有环节都会受影响这一步值得多花时间。第二步是文本切分Chunking。大模型有输入长度限制而且向量检索以文本块为单位不能把整篇长文一次扔进数据库。切分需要考虑语义边界比如按段落、按句子或者按固定长度切。不同切分方式会影响检索效果后面我会专门展开讲。第三步是向量化和入库。把切好的文本块通过嵌入模型转成向量数组再写入向量数据库。嵌入模型的效果决定了“语义相似”判断的好坏向量数据库的选型则决定了检索性能和后续扩展性。“向量化”这个概念我用一个简单的比喻解释把“苹果”和“水果”转换成高维空间里的两个坐标点语义越接近的点距离越近。RAG就是把所有素材都转成坐标点用户提问时也转成一个坐标点然后去库里找距离最近的那些点对应的原文。2.2 在线部分一次提问背后的完整旅程在线链路相对更直观一共五个步骤每一步都有对应的工程取舍。第一步用户输入一条查询也就是“快讯”的生成指令。第二步这条查询同样经过嵌入模型转成向量。第三步在向量数据库中进行相似度检索取回最相关的若干条文本块。第四步也是容易被忽视的一步把检索结果按照相关度排序筛选掉明显无关的内容。这步称为重排可以在一定程度上提升准确率。第五步把“用户指令 检索到的参考文本 要求格式”拼接成完整的提示词交给大模型生成。在实际项目中我建议在在线链路上加上一个日志中间层把每次检索命中了哪些文本块、用了多长时间、模型输出了什么内容全部记录下来。调试时如果没有日志效果差了只能靠猜有了日志才能快速定位是检索的问题、提示词的问题还是模型本身的问题。2.3 和微调相比RAG在快讯场景下的优势很多人在做类似项目时会纠结到底是该用RAG还是微调我直接说结论——知识类、事实类、时效性强的场景优先选RAG。微调的代价很高需要准备大批量标注数据训练过程耗时耗力而且每次知识更新都需要重新训练。尤其对快讯这种高频更新、来源分散的场景微调根本无法满足时效性。RAG的优势在于知识更新即时换一批数据重新入库就行回答可以追溯来源给每条快讯附上原始素材链接开发门槛也低不需要训练模型。当然两者的边界不是绝对的当业务需要固定语态风格、长期积累大量历史知识时把RAG和微调结合起来用效果也很理想。3. 实操篇构建一个最小可用的AI快讯RAG应用3.1 环境准备和工具选型实操部分用的都是比较常见的开源组件方便在不同环境复现。Python 3.10以上嵌入模型接口选择任一主流云服务商提供的文本嵌入API或者本地开源的嵌入模型优先保证中文语义效果向量数据库我用了本地文件型的向量库代码简单适合快速验证数据量大了以后建议迁移到独立向量库服务大模型接口选择支持长上下文的对话模型用于最终生成相关Python库读取网页用Requests和BeautifulSoup切分文本用LangChain或者递归字符文本分割器向量计算用开源的相似度检索库这里有几个关键参数需要提前了解。嵌入向量维度取决于你所选的嵌入模型常见的从几百到上千维不等切分块大小推荐500到800个字符重叠度控制在100到200个字符之间不是固定的需要根据实际数据调试。提示如果只是做技术验证没必要一开始就上一套复杂的向量数据库集群。本地文件型向量库对中小数据量完全够用等真实业务量上来再迁移架构这样更务实。3.2 数据准备和切分逻辑为便于演示我模拟了一批新闻快讯数据每条包含标题、发布时间、正文。真实场景里可以用爬虫定时抓取但抓取时要注意目标站点的访问频率限制和robots协议避免给对方服务器造成压力这是一名从业者必须考虑的基本礼仪。切分代码逻辑如下from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter RecursiveCharacterTextSplitter( chunk_size600, # 每块目标长度字符数 chunk_overlap120, # 相邻块重叠长度 separators[\n\n, \n, 。, , , , , , ] ) chunks text_splitter.split_text(document_full_text)为什么一定要有重叠因为如果把一段完整的话拦腰截断上半个下半个都失去了完整语义检索时容易漏掉关键信息。重叠能保证切分边界附近的上下文信息不丢失。但切分块大小也并不是越大越好。块越大向量中包含的噪声越多检索精度可能下降块太小则缺乏足够的上下文语境。600字符加120重叠是一个经过较多项目验证的起点后续可以根据检索效果调整。3.3 离线索引部分代码实现接下来写数据入库脚本。主要任务是读取原始数据、切分成文本块、生成向量、写入向量数据库。from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.schema import Document # 初始化嵌入模型不同提供商的接口可能不同核心是返回向量 embedding_fn OpenAIEmbeddings(modelyour-embedding-model) documents [] for item in news_data: chunks text_splitter.split_text(item[content]) for i, chunk in enumerate(chunks): documents.append(Document( page_contentchunk, metadata{ title: item[title], publish_time: item[publish_time], source: item[source_url], chunk_index: i } )) vector_store Chroma.from_documents( documentsdocuments, embeddingembedding_fn, persist_directory./news_fast_news_db )这里有一个经常被新手忽略的点metadata一定要充分记录来源信息。后面生成快讯时要标注“信息来源”如果入库时没有把来源链接保存下来生成端就无法引用出处整个系统的可信度会大打折扣。我在实际项目里甚至会把切分块的序号也记下来便于排查是哪一块文本导致的错误。3.4 在线检索与生成部分代码实现在线部分的核心是先检索出相关信息再把信息拼进提示词里让模型生成。以下是完整的可运行逻辑。from langchain.llms import ChatOpenAI from langchain.prompts import ChatPromptTemplate query 生成今天最新的科技行业动态快讯重点包括人工智能和芯片领域 retrieved_chunks vector_store.similarity_search_with_score(query, k5) # 按分数排序并过滤低分结果分数阈值需要根据实际返回的相似度范围调整 filtered_chunks [doc for doc, score in retrieved_chunks if score 0.3] context_text \n\n.join( f[来源: {doc.metadata.get(source, 未知)} | 标题: {doc.metadata.get(title, 未知)}]\n{doc.page_content} for doc in filtered_chunks ) prompt_template ChatPromptTemplate.from_messages([ (system, 你是一名资深快讯编辑请基于给定的参考资料生成简洁、客观、信息准确的快讯。 禁止编造参考资料中没有的信息。每条快讯末尾需标注信息来源。), (human, 参考资料\n{context}\n\n请生成快讯{query}) ]) llm ChatOpenAI(modelyour-chat-model, temperature0.2) response llm.invoke(prompt_template.format_messages( contextcontext_text, queryquery )) print(response.content)温度参数我设置为0.2这是一个偏向精准和保守的值。快讯类内容要求事实准确、风格稳定不适合模型自由发挥。如果做创意写作或头脑风暴可以调高温度但快讯场景温度越低越安全。另外还有一个细节值得注意把来源信息直接嵌入到参考文本中而不是让模型自己去推理来源。这样模型在生成快讯时引用来源的成功率会显著提高因为它是在上下文里“读到”了这些信息。我在多个项目里都验证过这个小技巧非常有效。4. 效果调优为什么检索结果总是不理想4.1 三个常见问题对应的三种解决思路RAG系统上线之后最常见的三个问题分别是检索不到、检索不准、模型不听话。下面分别说排查思路。检索不到往往问题出在文档切分块太小或查询改写不足。用户问“今天芯片行业有啥大事”库里存的是“半导体产业今日动态”语义相近但用词不同有可能检索不到。解决思路是扩大Top-K的数量比如从5调到10同时检查嵌入模型对不同表述的识别能力。如果还是不行可以对用户提问做一次意图改写把模糊问题转成更明确的几个子查询再分别检索。检索不准多数是块太大或噪声过多。比如一篇新闻通稿的开头可能是“各位观众大家好”这种套话没有实质含义却拉低了整块文本的向量质量。解决思路是清洗阶段要提前去掉套话和模板句同时在切分时尽量按语义完整段落来切而不是机械按固定长度硬切。模型不听话总是编造内容这本质上是提示词约束力不足。需要在系统提示词里明确写清“如果参考资料中没有对应内容请明确回答没有找到相关信息不要自行推断”并且可以在模型回复后进行自动校验把生成内容的日期、时间、人名等字段与原文比对不一致的命中断言错误。4.2 用“重排”进一步提升精度向量检索本质上是在做“语义近似匹配”它对关键词的精确匹配和段落间细微差异的感知能力有限。实际工程中可以把重排Rerank作为精度提升的关键一步。基本思路是先粗召回Top 50个候选块再用一个专门的重排模型对每一条做精细打分最后保留分数最高的Top 5。粗召回用向量检索保证召回率精筛用重排模型保证精确率。这套“两阶段检索”在多个项目里都显著提升了最终回答质量。但重排也有代价一是重排模型需要额外调用或者额外本地部署二是增加了耗时。对于快讯这种对响应速度有一定要求的场景建议做个开关默认关只在质量不达标时手动开启。工程上讲究按需取舍不要为炫技增加不必要的复杂度。4.3 切分策略的进一步实验如果你有时间可以做一个简单的对比实验来验证切分策略的影响。分别用200字小快、600字中块、1200字大块跑同一批数据对同一组问题做检索对比召回Top K内容的命中率和最终生成质量。实验结果通常会显示短文档场景下小块效果更好长文档场景下中块配合标题元数据效果更佳。这个实验我做过的结论是600字左右的切块配合120字重叠在新闻快讯场景下综合表现最优。但每次换数据源都要重新验证不能复制粘贴了事。5. 实操总结与经验补充分享5.1 项目踩坑实录速查表为了便于参考我把实际项目中最常踩的坑整理成了一张速查表。这张表每一条都来自真实调试经历能帮你省下不少排查时间。症状根因解决方案快讯内容张冠李戴切分边界切断语义增加重叠长度按段落而非固定长度切分引用来源对不上元数据未保存来源链接入库时同步存储source字段生成时强制携带检索结果完全无关嵌入模型对中文语义理解不足更换中文优化过的嵌入模型测试相似度阈值模型拒绝回答问题提示词约束过强且上下文过少调整提示词以灵活引导同时增加Top-K候选数响应时间过长单次检索质量不高反复重试引入缓存机制对高频查询做结果复用重复内容多多条切块内容高度相似引入去重逻辑按文本哈希过滤近重复块5.2 下一步可以怎么扩展这个快讯生成项目只是一个基础形态它本身就是一个可演进的框架。按实际需求可以扩展的方向不少加一个定时调度器每天定时采集素材并重新入库加一个流式输出接口让快讯逐字输出而不是等全部生成完毕加一个多级分类策略把科技、财经、体育快讯分开查询和汇总加一个用户审查反馈循环让编辑人员可以对生成结果打标打标后的样本积累到一定量后可以做二次微调或者提示词优化。我个人在实际开发中的体会是不要把RAG当成一个复杂的“高科技黑盒”。把它拆成“文档处理、索引入库、检索召回、提示词拼接、生成后处理”这五个模块每个模块都可以独立调试、独立替换、独立优化。当效果不理想时先定位是哪个模块出了问题再用模块化的方式去替换它而不是盲目调整整个系统。还有一个小技巧值得分享给系统加一个“最低相似度阈值”并跟踪阈值的变化趋势。如果系统每天返回的平均相似度在缓慢下降说明新入库的数据与旧数据之间存在偏差或者数据质量在下降。这个指标是检查RAG系统健康度的很灵敏的风向标比用户反馈要早得多。最后做一点提醒任何RAG应用都要留出人工审核环节尤其涉及对外发布的自动生成内容时。技术上可用的系统流程上不一定是安全的。先把“自动生成人工复核”的闭环建立起来再逐步提高自动化比例这个节奏才靠谱。

相关新闻

深度学习模型训练全流程:从数据预处理到PyTorch代码实现

深度学习模型训练全流程:从数据预处理到PyTorch代码实现

最近在带一个新入门深度学习的同学看代码,发现一个很有意思的规律:刚把线性回归、梯度下降、反向传播这些概念过完一遍之后,大家都急着想“训练一个真正属于自己的模型”。但真到了上手敲代码这一步,不少人反而卡住了——不是理论…

2026/10/18 5:54:46 阅读更多 →
C++17 std::filesystem实战:路径处理、遍历与清理工具

C++17 std::filesystem实战:路径处理、遍历与清理工具

在C里写文件系统操作,以前是件让人有点拧巴的事。你需要在不同操作系统之间维护完全不同的代码路径,要么就一直带着一个笨重的三方依赖过活。C17引入的std::filesystem,算是标准库终于正面回应了这个老问题。这篇文章不是照着文档念API&#…

2026/10/18 5:54:46 阅读更多 →
区分agent中长期记忆和偏好记忆

区分agent中长期记忆和偏好记忆

一句话区分&#xff1a;长期记忆记"发生过的事"&#xff0c;偏好记忆记"这个人是什么样的人"。1. 数据结构完全不同长期记忆 LongTermMemory&#xff1a;一个会遗忘、会合并的列表List<MemoryItem> items // 每条 {id, content, importance, embedd…

2026/10/18 5:54:46 阅读更多 →

最新新闻

OpenClaw(Clawdbot)本地部署指南:从零构建24小时AI助理与自动化工作流

OpenClaw(Clawdbot)本地部署指南:从零构建24小时AI助理与自动化工作流

1. 从“一周只工作2天”说起&#xff1a;我为什么认真琢磨起了AI助理先别急着把“未来一周只工作2天”当成一个段子。作为一个常年被日报、周报、数据汇总、消息回复淹没的从业者&#xff0c;我第一次听到这个观点时也觉得是专家的嘴骗人的鬼。但当我花了几个周末&#xff0c;把…

2026/10/18 6:58:58 阅读更多 →
OpenClaw AI助理实战:从部署到技能开发,打造7×24小时数字员工

OpenClaw AI助理实战:从部署到技能开发,打造7×24小时数字员工

“未来一周只工作两天”这个话题最近被讨论得挺热闹&#xff0c;先不管专家们怎么预测&#xff0c;我自己的判断是——AI助理这类工具确实是目前普通人最容易够到、也最接近“省人力”效果的东西。OpenClaw&#xff08;社区里也叫Clawdbot&#xff09;就是其中一个非常典型的开…

2026/10/18 6:58:58 阅读更多 →
道尔夫-切比雪夫加权:MATLAB实现等副瓣阵列综合与避坑指南

道尔夫-切比雪夫加权:MATLAB实现等副瓣阵列综合与避坑指南

简介&#xff1a;这份资源面向学习阵列信号处理与相控阵天线综合的高校学生、科研人员及工程技术人员&#xff0c;提供基于MATLAB的线阵道尔夫-切比雪夫加权完整仿真代码&#xff0c;用于解决低副瓣方向图综合中激励幅度分布求解与性能验证问题。压缩包共3个文件&#xff0c;包…

2026/10/18 6:58:58 阅读更多 →
企业数据灾备方案全解析:从备份到容灾的落地实践与避坑指南

企业数据灾备方案全解析:从备份到容灾的落地实践与避坑指南

前阵子有个做连锁零售的朋友跟我诉苦&#xff0c;说他们门店收银系统前一夜被勒索病毒加密&#xff0c;总部虽然保留了上一周的完整备份&#xff0c;但恢复出来的数据只能追溯到七天前&#xff0c;这一周所有的销售明细、会员积分、库存流水全丢了。他问我&#xff1a;为什么明…

2026/10/18 6:58:58 阅读更多 →
科研效率翻倍:6个网站打通文献检索到选刊投稿全流程

科研效率翻倍:6个网站打通文献检索到选刊投稿全流程

1. 先说说我自己的效率翻倍经历&#xff1a;从收藏夹吃灰开始研一上学期&#xff0c;我干过一件特别蠢的事&#xff1a;花了一整个周末&#xff0c;把各种"学术神器""科研必备网站"的帖子翻了个遍&#xff0c;然后把这些网站统统塞进浏览器收藏夹。收藏夹整…

2026/10/18 6:58:58 阅读更多 →
机器学习大作业实战指南:从数据清洗到模型调优的完整流程

机器学习大作业实战指南:从数据清洗到模型调优的完整流程

简介&#xff1a;这份资源是电子科技大学机器学习课程大作业的完整配套资料&#xff0c;面向正在修读机器学习、人工智能相关课程的高校学生&#xff0c;以及希望系统梳理算法理论与工程实践的自学者。内容围绕监督学习、无监督学习、半监督学习与强化学习等范式展开&#xff0…

2026/10/18 6:57:58 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →