尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
说说RAG
RAGRetrieval-Augmented Generation检索增强生成是当前大语言模型LLM应用中最火热的架构也是解决大模型知识截止、幻觉、数据安全等核心问题的关键技术。面试官问这个问题通常是想考察你对大模型落地实践的理解深度以及是否真的做过相关项目。一、什么是RAG核心概念1.1 为什么需要RAG大模型如 GPT-4虽然强大但有三个致命缺陷问题说明RAG如何解决知识截止模型训练后新知识不知道实时检索最新文档幻觉模型会编造答案用检索到的真实内容约束生成数据安全企业私域数据不能用于训练只在问答时检索数据不外传1.2 RAG的定义RAG 检索Retrieval 生成Generation简单说在让大模型回答问题前先从知识库中检索相关文档然后把文档作为上下文一起给大模型让它基于这些材料生成答案。二、RAG的完整工作流程[用户问题] ↓ 1. 问题理解 向量化 ↓ 2. 向量检索 (从知识库找相似文档) ↓ 3. 检索结果排序 过滤 ↓ 4. 构建Prompt (问题 检索到的文档) ↓ 5. LLM生成答案 ↓ [最终答案]2.1 详细拆解第一步知识库准备离线阶段# 1. 文档切分documentsload_documents()chunkssplit_documents(documents,chunk_size500,# 每块大小chunk_overlap50# 重叠避免切断语义)# 2. 向量化fromsentence_transformersimportSentenceTransformer modelSentenceTransformer(BAAI/bge-large-zh)# 国产开源embedding模型vectors[]forchunkinchunks:vectormodel.encode(chunk)# 转为向量 (768/1024维)vectors.append(vector)# 3. 存入向量数据库# 如FAISS, Milvus, PGVector, Chroma, Elasticsearchvector_store.add_vectors(vectors,chunks)第二步在线检索# 用户提问question公司今年的营收目标是少# 1. 问题向量化question_vectormodel.encode(question)# 2. 向量检索相似度搜索top_k5resultsvector_store.search(question_vector,top_ktop_k,similarity_threshold0.7# 相似度阈值)# 3. 检索结果retrieved_docs[result.textforresultinresults]第三步增强生成# 构建Promptpromptf 请基于以下材料回答问题。如果材料中没有相关信息请说根据提供的资料无法回答。 材料{.join(retrieved_docs)}问题{question}答案 # 调用LLManswerllm.generate(prompt)三、RAG的核心技术点面试重点3.1 文档切分策略# 不好的切分按固定长度硬切chunks[text[i:i500]foriinrange(0,len(text),500)]# ❌ 可能切断句子破坏语义# 好的切分按语义边界fromlangchain.text_splitterimportRecursiveCharacterTextSplitter splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50,separators[\n\n,\n,。,,,,, ,])chunkssplitter.split_text(text)# ✅ 尽量在句子边界切分3.2 向量化模型选择模型特点适用场景BGE系列国产开源中英文好通用场景OpenAI Embedding英文强中文一般国际化业务M3E轻量级中文优化资源受限场景E5多语言效果好学术场景3.3 向量数据库选型数据库特点适用场景FAISS内存索引速度快小规模单机Milvus分布式云原生大规模生产PGVectorPostgreSQL插件已有PostgreSQLElasticsearch全文检索向量混合搜索Chroma轻量Python原生快速原型3.4 检索优化RAG的关键# 1. 混合检索向量 关键词# 向量检索语义相似vector_resultsvector_search(query)# 关键词检索精确匹配bm25_resultsbm25_search(query)# 融合排序RRF算法final_resultsreciprocal_rank_fusion(vector_results,bm25_results)# 2. 重排序Rerankfromsentence_transformersimportCrossEncoder rerankerCrossEncoder(BAAI/bge-reranker-large)pairs[(query,doc)fordocincandidate_docs]scoresreranker.predict(pairs)# 更精确的语义打分# 3. 元数据过滤resultsvector_store.search(query,filter{date:{$gte:2024-01-01},department:销售部})四、RAG的进阶优化面试加分项4.1 Query改写解决检索词与文档不匹配# 原始问题今年赚了多少钱# 文档中可能只有营收、利润没有赚了多少钱# Query改写策略defrewrite_query(question):# 1. 同义词扩展expandedexpand_synonyms(question)# 2. 假设性问题hypotheticalgenerate_hypothetical_doc(question)# 3. 多角度查询sub_queriesdecompose_query(question)return[question]expanded[hypothetical]sub_queries4.2 多路召回defmulti_recall(query):results[]# 路1向量检索语义results.extend(vector_search(query))# 路2关键词检索精确results.extend(keyword_search(query))# 路3知识图谱检索实体关系results.extend(graph_search(query))# 路4SQL查询结构化数据results.extend(sql_search(query))# 统一去重、排序returndedup_and_rerank(results)4.3 上下文管理defbuild_context(retrieved_docs,max_tokens4000):# 1. 按相关性排序docssorted(retrieved_docs,keylambdax:x.score,reverseTrue)# 2. 动态截断context[]total_tokens0fordocindocs:doc_tokenscount_tokens(doc.text)iftotal_tokensdoc_tokensmax_tokens:breakcontext.append(doc.text)total_tokensdoc_tokens# 3. 关键信息前置防止长上下文丢失注意力return\n\n.join(context)五、RAG vs Fine-tuning选型决策维度RAGFine-tuning知识更新实时更新改文档即可需重新训练周期长幻觉控制强基于检索内容弱依赖记忆数据安全数据不离线安全数据需用于训练推理成本低仅检索调用同普通模型复杂推理较弱强模型能力适用场景FAQ、知识库问答特定风格、复杂任务最佳实践RAG Fine-tuning 结合Fine-tuning让模型学会怎么回答风格、格式RAG给模型最新知识回答什么六、RAG系统的评估指标# 检索阶段recallk检索到的相关文档数/总相关文档数 precisionk检索到的相关文档数/检索总数 mrr第一个相关文档的排名倒数# 生成阶段answer_relevance答案是否回答了问题 factual_consistency答案是否基于检索文档 faithfulness答案是否与检索文档一致# 整体end_to_end_latency检索时间生成时间 user_satisfaction用户反馈评分七、生产级RAG架构完整示例# 完整的RAG服务classRAGService:def__init__(self):self.embedding_modelSentenceTransformer(BAAI/bge-large-zh)self.vector_storeMilvusClient(hostlocalhost,port19530)self.rerankerCrossEncoder(BAAI/bge-reranker-large)self.llmOpenAIClient()# 或本地LLMself.cacheRedisCache()# 缓存常见问题asyncdefanswer(self,question:str,user_id:str)-str:# 1. 检查缓存cachedself.cache.get(question)ifcached:returncached# 2. 检索docsawaitself.retrieve(question)# 3. 生成answerawaitself.generate(question,docs)# 4. 缓存带过期时间self.cache.set(question,answer,ttl3600)# 5. 异步记录日志用于后续分析asyncio.create_task(self.log_interaction(question,docs,answer,user_id))returnanswerasyncdefretrieve(self,question:str)-List[str]:# 多路召回candidates[]# 向量检索q_vecself.embedding_model.encode(question)vector_resultsself.vector_store.search(q_vec,top_k20)candidates.extend(vector_results)# 关键词检索可选ifself.need_keyword_search(question):keyword_resultsself.keyword_search(question)candidates.extend(keyword_results)# 去重candidatesdedup(candidates)# 重排序pairs[(question,doc.text)fordocincandidates]scoresself.reranker.predict(pairs)# 按重排序得分取top_ktop_docs[docfor_,docinsorted(zip(scores,candidates),reverseTrue)[:5]]return[doc.textfordocintop_docs]
RELATED

相关推荐

HTTP请求走私:原理、攻击技术与防御实战

HTTP请求走私:原理、攻击技术与防御实战

1. 项目概述:重新认识HTTP请求走私如果你是一名Web安全工程师、渗透测试人员,或者后端开发,那么“HTTP请求走私”这个词对你来说一定不陌生。它不像SQL注入或XSS那样直观,更像是一种隐藏在协议层、利用服务器解析差异的“幽灵攻击…

📅 2026/11/2 10:33:17
如何面对cursor等ai工具删除代码,甚至删除一些重要文件

如何面对cursor等ai工具删除代码,甚至删除一些重要文件

面对Cursor这类AI工具可能删除代码或重要文件的问题,这确实是个需要认真对待的挑战。我有以下几点建议: 1. 版本控制是第一道防线 Git是你的好朋友:经常commit,重要改动前确保工作区是干净的使用.gitignore排除无关文件&#xff0…

📅 2026/10/9 19:15:02
芯参谋(1): 之模拟电路参数计算器,解决模拟参数的烦恼!

芯参谋(1): 之模拟电路参数计算器,解决模拟参数的烦恼!

芯参谋 链接: https://pan.baidu.com/s/1kOwSLhm5CvAFqkNwy89BEw?pwd1788你是否还在为这个电路 中电阻,电容应该设多少 而烦恼。用这个模拟电流参数计算器,一键帮你 里面还集成了几十种工具帮你提高工作效率。要用的赶快下载,现在都是免费使…

📅 2026/9/12 4:46:13
MORE NEWS

更多资讯

📰

Unity连接MySQL显示表格:Simple TableUI实现与避坑指南

简介:面向 Unity 开发者的 MySQL 数据展示整合包,适用于在 Unity 2020.3.45f1 客户端直连数据库、读取表格数据,并借助 Simple TableUI 完成界面渲染的技术场景,尤其适合做后台管理面板、数据监控看板或本地工具类应用的中级开发者…

📰

C语言链表:从基础操作到高级应用全解析

1. 链表基础与核心概念 链表是C语言中最基础也最重要的数据结构之一,它与数组最大的区别在于内存的非连续性和动态扩展能力。想象一下火车车厢的连接方式——每节车厢独立存在,通过挂钩连接,这就是链表的生动写照。 1.1 链表的结构定义 链表…

📰

C# WinForm MQTT客户端实例:协议选型、订阅发布与避坑指南

简介:面向 C# WinForm 开发者的 MQTT 客户端实例(StdioMQTT-master),适合需要接入 MQTT 服务器、学习消息遥测传输协议,或搭建桌面端物联网验证工具的开发人员。压缩包共 121 个文件、7.82MB,含 13 个 cs 源…

📰

基于蒙特卡洛法的电动汽车充电负荷计算MATLAB仿真程序

简介:针对电动汽车充电负荷预测这一电力系统规划的关键问题,这份MATLAB程序提供了基于蒙特卡洛法的完整计算方案,面向电力系统研究人员、电动汽车方向学生及工程师,适用于充电基础设施规划与电网调度分析。程序通过大量随机抽样模…

📰

微服务架构在数据开发中的实践与优化

1. 微服务设计模式与数据开发的天然契合 数据开发领域正经历着从传统ETL管道向实时化、智能化方向的演进。在这个过程中,微服务架构展现出了与数据开发需求高度匹配的特性。我们团队在过去三年中,逐步将单体数据平台拆分为微服务架构,最直观的…

📰

A2A 1.0协议:智能体间通信的标准化解决方案

1. A2A 1.0协议概述 A2A(Agent-to-Agent)1.0协议是Google Cloud主导开发的智能体间通信开放标准。这个协议解决了一个关键痛点:在AI代理生态系统中,不同厂商开发的智能体往往采用各自封闭的通信方式,导致系统间形成信息…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬