当前位置: 首页 > article >正文

大模型“幻觉“频现?RAG技术如何根治三大痛点,实现精准问答?

文章深入解析了RAG检索增强生成技术的核心原理与实现流程指出大模型普遍存在的三大缺陷幻觉现象、知识更新缓慢以及领域知识理解有限。RAG通过结合向量数据库、嵌入模型和大语言模型实现从外部私有知识库检索信息并作为上下文输入大模型有效解决上述问题。文章详细阐述了RAG的检索流程包括文档编码、向量入库、查询编码、相似性搜索、获取相关文档、构造提示词以及生成最终回答等关键步骤并结合实际应用场景如企业知识库问答、法律条文解读等展示了RAG的实用价值。此外还探讨了RAG的高级阶段包括预检索策略查询增强、改写、扩展和后检索策略重排序、文档后置处理器以进一步提升检索质量与效率。RAG 诞生背景大模型原生缺陷LLM 存在 3 个无法自愈的问题这是 RAG 技术的核心出发点1.LLM存在幻觉现象, 生成无事实依据、虚假编造的内容LLM知识更新缓慢, 预训练数据固定无法同步新数据 / 私有数据LLM对领域知识的理解有限, 对企业内部文档、专业手册等私有知识完全未知RAG的概念·RAGRetrieval Augmented Generation顾名思义先从外部私有知识库检索相关信息再将检索结果作为上下文输入大模型让模型基于真实事实生成回答。·类比:你可以把这个过程想象成开卷考试。让LLM先翻书再回答问题。·价值: 根治大模型私有知识未知、知识过时、内容幻觉三大痛点。·举例: 我想询问LLM有关于我公司内部的请假流程它肯定不知道,但是我把公司的员工手册先给它看,当我在询问的时候他就会知道RAG的检索流程这张图详细展示了检索增强生成Retrieval Augmented Generation, RAG的工作流程结合了向量数据库、嵌入模型和大语言模型LLM以实现基于外部知识的智能问答。整个流程分为7个步骤清晰地描绘了从文档预处理到最终响应生成的完整闭环。整体结构说明图表左侧标注“RAG”表明这是RAG架构的核心流程图。右侧按数字顺序1~7展示数据流与处理阶段·上半部分文档索引与向量化存储离线/批处理阶段·下半部分用户查询与实时响应生成在线/推理阶段中间核心组件包括·Embedding model嵌入模型·Vector database向量数据库·DeepSeek LLM大语言模型此处以 DeepSeek 为例分步详解① Encode —— 文档编码“Additional documents” → “Embedding model”系统将额外的非结构化文档如PDF、TXT、网页等输入嵌入模型将其转换为高维向量表示即“嵌入向量”。这些向量捕捉了文本的语义信息便于后续相似性匹配。✅ 关键点此步骤是ETL中的“Transform”环节通常批量执行。② Index —— 向量入库“Embedding model” → “Vector database”将上一步生成的向量存入向量数据库并建立索引以便高效检索。向量数据库支持近似最近邻搜索ANN能快速找到与查询最相似的文档片段。✅ 关键点向量数据库是RAG中“检索”能力的核心基础设施。③ Encode —— 查询编码“Query” → “Embedding model”当用户提出问题时Query同样通过同一个嵌入模型将其转化为向量。注意这里必须使用与文档编码相同的模型保证语义空间一致。✅ 关键点查询与文档需在相同向量空间中比较才能准确匹配相似度。④ Similarity search —— 相似性搜索“Vector database” ←→ “Similar documents”向量数据库接收查询向量后执行相似性搜索如余弦相似度或欧氏距离返回Top-K个最相关的文档片段Similar documents。✅ 关键点这一步实现了“检索”功能是RAG区别于纯生成式AI的关键。⑤ Retrieve —— 获取相关文档“Vector database” → “Similar documents” “Query”系统将检索到的相关文档片段与原始用户查询一起打包准备送入大语言模型。此时“Query Context”构成完整的提示词Prompt。✅ 关键点上下文增强——让LLM不仅依赖训练知识还能利用最新/专属数据作答。⑥ Prompt —— 构造提示词“Similar documents Query” → “DeepSeek LLM”将用户问题和检索到的相关文档片段组合成一个结构化的提示词Prompt发送给大语言模型如DeepSeek。例如请根据以下资料回答问题[相关资料片段1][相关资料片段2]…问题{用户提问}✅ 关键点Prompt工程决定LLM能否有效利用检索结果避免幻觉或无关输出。⑦ Final response —— 生成最终回答“DeepSeek LLM” → “Final response”大语言模型基于提供的上下文和问题生成自然流畅、准确有据的最终回答并返回给用户。✅ 关键点LLM负责“生成”而RAG框架确保其“有据可依”。流程总结RAG 文档向量化存储 用户查询实时检索 上下文增强的大模型生成它解决了传统LLM缺乏实时知识、易产生幻觉的问题特别适用于企业知识库、客服系统、法律医疗等专业领域。常见应用场景举例·企业内部知识库问答机器人·法律条文/合同条款智能解读·医疗文献辅助诊断建议·教育领域个性化学习助手详见RAG论文https://arxiv.org/pdf/2312.10997向量向量定义向量vector又称矢量在数学中也称为欧几里得向量、几何向量是数学中最基本的概念之一。其定义如下向量是指具有大小magnitude和方向的量。在RAG中用来做语义相似匹配的关键它解决了“电脑怎么理解文字意思”的问题。通常我们会用这些向量来做相似性搜索。比如通过一维向量可以显示出词语或短语之间在意义上的相近程度。举个例子“你好”、“hello”和“见到你很高兴”可以用一维向量来表示它们意思上的接近度。对于像小狗这样复杂的东西我们不能只靠一个特点来找到相似的。得考虑好几个方面才行比如毛色、体型、品种这些。然后把这些特点都变成向量的一部分组合成一个多维向量。举个例子吧一只棕色的小泰迪就可以用这样的多维向量表示[棕色, 小型, 泰迪]。要让搜索结果更准确我们就得用到更多种类的数据把这些数据放在一个更大的空间里。在这个多维度的空间中找相似的东西会变得更难一些。这时候我们需要用到一些方法比如余弦相似度或者欧式距离来衡量这些数据之间的相似程度。而向量数据库可以帮助我们完成这个任务。文本向量化通过向量模型可以把文本转换成向量。我们学到了一种新的模型叫做“向量模型”专门用来把文本变成向量。大语言模型不能直接把文本变成向量所以需要单独用一个向量模型来完成这个任务。现有向量模型厂商如下1.阿里百炼有大量向量模型spring.ai.dashscope.embedding.options.modeltext-embedding-v12.ollama有大量向量模型spring.ai.ollama.embedding.modelqwen3-embedding那么我们用这种向量模型把一句话变成一个向量有什么用呢其实非常有用因为我们可以用这些向量来判断两句话有多相似。举个例子如果你想找和秋田犬类似的狗在向量数据库里每种狗的特点都会被表示成一个多维向量。你会发现秋田犬的向量和柴犬的向量最接近这样就能找到跟秋田犬相似的狗了。·向量模型的本质目标就是把语义相似的内容用“相近”的向量表示把“不相关”内容尽量拉远。·所以好的向量模型能够更好的识别语义 进行向量化.示例以阿里百炼平台向量模型spring.ai.model.embeddingdashscopespring.ai.dashscope.embedding.options.modeltext-embedding-v1com.alibaba.cloud.aispring-ai-alibaba-starter-dashscopeorg.springframework.aispring-ai-advisors-vector-storeAutowired EmbeddingModel embeddingModel; GetMapping(/embedding) public void embedding() { float[] embedded embeddingModel.embed(我叫柱子); System.out.println(embedded.length); System.out.println(Arrays.toString(embedded)); }向量数据库对于向量模型生成出来的向量我们可以持久化到向量数据库并且能利用向量数据库来计算两个向量之间的相似度或者根据一个向量查找跟这个向量最相似的向量。在SpringAi中VectorStore 表示向量数据库目前常见支持的向量数据库有·Chroma Vector Store - The Chroma vector store.·Elasticsearch Vector Store - The Elasticsearch vector store. 可以“以向量关键词”方式做混合检索。深度优化更多针对文本不是专门“向量搜索引擎”。向量存储和检索容量有限制查询延迟高于 Milvus。·Milvus Vector Store - The Milvus vector store.·MongoDB Atlas Vector Store - The MongoDB Atlas vector store.·Neo4j Vector Store - The Neo4j vector store.可以结合结构化图谱查询与向量检索 大规模嵌入检索如千万—亿级高维向量性能明显落后于 Milvus·Redis Vector Store - The Redis vector store. 低门槛实现小规模向量检索。对于高维大规模向量如几百万到上亿条性能和存储效率不如专用向量库。·SimpleVectorStore - A simple implementation of persistent vector storage, good for educational purposes.其中有我们熟悉的几个数据库都可以用来存储向量比如Elasticsearch、MongoDb、Redis。匹配检索在这个示例中我存储了某个PDF文件里面的内容到向量数据库中然后通过招标文件发售开始时间这几个关键字在向量数据库中进行查询以下为流程图此次示例代码讲解Milvus Vector StoreMilvus国产团队、文档友好、社区国内活跃、性能最佳、市场占用率大。 实战中使用的向量数据库2022 年Milvus 支持十亿级向量2023 年它以持续稳定的方式扩展到数百亿级为 300 多家大型企业的大规模场景提供支持包括 Salesforce、PayPal、Shopee、Airbnb、eBay、NVIDIA、IBM、ATT、LINE、ROBLOX、Inflection 等。详见 https://milvus.io/docs/zh 文档。在spring ai使用1、添加依赖org.springframework.aispring-ai-starter-vector-store-milvus2、配置milvusmilvus 配置spring.ai.vectorstore.milvus.client.host192.168.0.143spring.ai.vectorstore.milvus.client.port19530#spring.ai.vectorstore.milvus.client.usernameroot#spring.ai.vectorstore.milvus.client.passwordmilvusspring.ai.vectorstore.milvus.databaseNamedefaultspring.ai.vectorstore.milvus.collectionNameragtestspring.ai.vectorstore.milvus.initializeSchematruespring.ai.vectorstore.milvus.embeddingDimension1536SearchRequest组件可以利用SearchRequest设置检索请求·query 代表要检索的内容·topK 设置检索结果的前N条o通常我们查询所有结果查出来 因为查询结果最终要发给大模型 查询过多的结果会1.过多的token意味着更长延迟 更多的费用 并且过多上下文会超限2.研究表明过多的内容会降低 LLM 的召回性能·similarityThreshold 设置相似度阈值 可以通关设置分数限制召回内容相似度. 从而过滤掉废料。 中文语料要适当降低分数所以应遵循始终以“业务召回效果”为主而不是追求网上常说的高分阈值。public WriterController(EmbeddingModel embeddingModel, VectorStore vectorStore) {logger.info(“WriterController -- start read pdf file by page”);Resource resource new DefaultResourceLoader().getResource(Constant.PDF_FILE_PATH);PagePdfDocumentReader pagePdfDocumentReader new PagePdfDocumentReader(resource); // 只可以传pdf格式文件//pagePdfDocumentReader.read();this.documents pagePdfDocumentReader.get().subList(0, 5); // query 5 pagesthis.vectorStore vectorStore;this.embeddingModel embeddingModel;}GetMapping(/writeVector) public void writeVector() { logger.info(Writing vector...); vectorStore.add(documents); }GetMapping(“/search”)public Listsearch(RequestParam(“msg”) String msg) {msg “招标文件发售开始时间”;logger.info(“start search data: {}”, msg);float[] embed embeddingModel.embed(msg);logger.info(“embed: {}”, embed);return vectorStore.similaritySearch(SearchRequest.builder().query(msg).topK(2).similarityThreshold(0.5).build());}提取转换加载ETL在之前我们主要完成了数据检索阶段 但是完整的RAG流程还需要有emedding阶段 即提取读取、转换分隔和加载写入Document Loaders 文档读取器spring ai提供了以下文档阅读器·JSON·文本·HTMLJSoup·Markdown·PDF页面·PDF段落·TikaDOCX、PPTX、HTML……alibaba ai也提供了很多阅读器https://github.com/alibaba/spring-ai-alibaba/tree/main/community/document-parsers·document-parser-apache-pdfbox用于解析 PDF 格式文档。·document-parser-bshtml用于解析基于 BSHTML 格式的文档。·document-parser-pdf-tables专门用于从 PDF 文档中提取表格数据。·document-parser-bibtex用于解析 BibTeX 格式的参考文献数据。·document-parser-markdown用于解析 Markdown 格式的文档。·document-parser-tika一个多功能文档解析器支持多种文档格式。org.springframework.aispring-ai-jsoup-document-readerorg.springframework.aispring-ai-markdown-document-readerorg.springframework.aispring-ai-pdf-document-readerorg.springframework.aispring-ai-tika-document-reader读取TextGetMapping(“/text”)public ListreadText() {logger.info(“start read text file”);Resource resource new DefaultResourceLoader().getResource(Constant.TEXT_FILE_PATH);TextReader textReader new TextReader(resource); // 适用于文本数据return textReader.read();}读取markdownGetMapping(“/markdown”)public ListreadMarkdown() {logger.info(“start read markdown file”);MarkdownDocumentReader markdownDocumentReader new MarkdownDocumentReader(Constant.MARKDOWN_FILE_PATH); // 只可以传markdown格式文件return markdownDocumentReader.read();}读取pdf·PagePdfDocumentReader一页1个document·ParagraphPdfDocumentReader 按pdf目录分成一个个documentGetMapping(/pdf-page) public ListreadPdfPage() { logger.info(start read pdf file by page); Resource resource new DefaultResourceLoader().getResource(Constant.PDF\_FILE\_PATH); PagePdfDocumentReader pagePdfDocumentReader new PagePdfDocumentReader(resource); // 只可以传pdf格式文件 return pagePdfDocumentReader.read(); } GetMapping(/pdf-paragraph) public ListreadPdfParagraph() { logger.info(start read pdf file by paragraph); Resource resource new DefaultResourceLoader().getResource(Constant.PDF\_FILE\_PATH); ParagraphPdfDocumentReader paragraphPdfDocumentReader new ParagraphPdfDocumentReader(resource); // 有目录的pdf文件 return paragraphPdfDocumentReader.read(); }DocumentSplitter‌ 文档拆分器转换器由于文本读取过来后 还需要分成一段一段的片段(分块chunk) 分块是为了更好地拆分语义单元这样在后面可以更精确地进行语义相似性检索也可以避免LLM的Token限制。SpringAi就提供了一个文档拆分器·TextSplitter 抽象类·TokenTextSplitter 按token分隔TokenTextSplitter1.chunkSize (默认值: 800)o每个文本块的目标大小以token为单位2.minChunkSizeChars (默认值: 350) 建议小一点o如果块超过最小块字符数( 按照块的最后. ! ? \n 符号截取)o如果块没超过最小块字符数,不会按照符号截取(保留原块。3.minChunkLengthToEmbed (默认值: 5)o丢弃短于此长度的文本块(如果去掉\r\n 只剩5个有效文本 那就丢掉4.maxNumChunks (默认值: 10000)o最多能分多少个块 超过了就不管了5.keepSeparator (默认值: true)o是否在块中保留分隔符、换行符 \r\n分块经验过细分块的潜在问题1.‌语义割裂‌ 破坏上下文连贯性影响模型理解‌。2.‌计算成本增加‌分块过细会导致向量嵌入和检索次数增多增加时间和算力开销‌。3.‌信息冗余与干扰‌碎片化的文本块可能引入无关内容干扰检索结果的质量降低生成答案的准确性‌。分块过大的弊端1.‌信息丢失风险‌过大的文本块可能超出嵌入模型的输入限制导致关键信息未被有效编码‌。2.‌检索精度下降‌大块内容可能包含多主题混合与用户查询的相关性降低影响模型反馈效果‌。‌场景‌‌分块策略‌‌参数参考‌微博/短文本句子级分块保留完整语义每块100-200字符‌学术论文段落级分块叠加10%重叠每块300-500字符‌法律合同条款级分块严格按条款分隔每块200-400字符‌长篇小说章节级分块过长段落递归拆分为段落每块500-1000字符‌在实际应用中不应过度依赖基于文本主题的分割策略。由于实战数据体量庞大且缺乏规律难以确保每个切片Chunk都能完整覆盖单一主题即便引入人工干预也收效甚微。因此工程实践中通常需根据数据特性灵活选择分割器主流方案是采用按 Token 数量截断的策略。毕竟不存在完美的分割方法更优的解法往往是结合‘固定 Token 长度’为基础辅以人工规则或大模型智能分割的混合模式。分块五种策略以下是 RAG 的五种分块策略1固定大小分块生成块的最直观和直接的方法是根据预定义的字符、单词或标记数量将文本分成统一的段。由于直接分割会破坏语义流因此建议在两个连续的块之间保持一些重叠上图蓝色部分。这很容易实现。而且由于所有块的大小相同它简化了批处理。但有一个大问题。这通常会打断句子或想法。因此重要的信息很可能会分散到不同的块之间。2语义分块这个想法很简单。·根据句子、段落或主题部分等有意义的单位对文档进行细分。·接下来为每个片段创建嵌入。·假设我从第一个片段及其嵌入开始。o如果第一个段的嵌入与第二个段的嵌入具有较高的余弦相似度则这两个段形成一个块。o这种情况一直持续到余弦相似度显著下降。o一旦发生这种情况我们就开始新的部分并重复。输出可能如下所示与固定大小的块不同这保持了语言的自然流畅并保留了完整的想法。由于每个块都更加丰富它提高了检索准确性进而使 LLM 产生更加连贯和相关的响应。一个小问题是它依赖于一个阈值来确定余弦相似度是否显著下降而这个阈值在不同文档之间可能会有所不同。3递归分块首先根据固有分隔符如段落或章节进行分块。接下来如果每个块的大小超出了预定义的块大小限制则将其拆分成更小的块。但是如果块符合块大小限制则不再进行进一步拆分。输出可能如下所示如上图·首先我们定义两个块紫色的两个段落。·接下来第 1 段被进一步分成更小的块。与固定大小的块不同这种方法还保持了语言的自然流畅性并保留了完整的想法。然而在实施和计算复杂性方面存在一些额外的开销。4基于文档结构的分块这是另一种直观的方法。它利用文档的固有结构如标题、章节或段落来定义块边界。这样它就通过与文档的逻辑部分对齐来保持结构完整性。输出可能如下所示也就是说这种方法假设文档具有清晰的结构但事实可能并非如此。此外块的长度可能会有所不同可能会超出模型令牌的限制。您可以尝试使用递归拆分进行合并。5基于LLM的分块既然每种方法都有优点和缺点为什么不使用 LLM 来创建块呢可以提示 LLM 生成语义上孤立且有意义的块。显然这种方法将确保较高的语义准确性因为 LLM 可以理解超越简单启发式方法用于上述四种方法的上下文和含义。唯一的问题是它是这里讨论的所有五种技术中计算要求最高的分块技术。此外由于 LLM 通常具有有限的上下文窗口因此需要注意这一点。Document Writers文档写入文本向量化向量化存储之前在“文本向量化”介绍了 就是通过向量模型库进行向量化依然通过Qwen向量模型进行向量化 将第分割的chunk进行向量化Autowired EmbeddingModel embeddingModel; GetMapping(/embedding) public void embedding() { float[] embedded embeddingModel.embed(我叫柱子); System.out.println(embedded.length); System.out.println(Arrays.toString(embedded)); }存储向量我们通过向量数据库存储document 可以省略向量化这一步 向量数据库会在底层自动完成向量化GetMapping(“/writeVector”)public void writeVector() {logger.info(“Writing vector…”);vectorStore.add(documents);}向量数据库检索需要先将文本进行向量化 然后去向量数据库查询// 相似性查询Listdocuments vectorStore.similaritySearch(SearchRequest.builder().query(msg).topK(2).similarityThreshold(0.4).build());// 输出System.out.println(documents);完整代码public WriterController(EmbeddingModel embeddingModel, VectorStore vectorStore, EmbeddingModel embeddingModel1) {logger.info(“WriterController -- start read pdf file by page”);Resource resource new DefaultResourceLoader().getResource(Constant.PDF_FILE_PATH);PagePdfDocumentReader pagePdfDocumentReader new PagePdfDocumentReader(resource); // 只可以传pdf格式文件this.documents pagePdfDocumentReader.get().subList(0, 5); // query 5 pagesthis.vectorStore vectorStore;this.embeddingModel embeddingModel1;}GetMapping(/writeVector) public void writeVector() { logger.info(Writing vector...); vectorStore.add(documents); } GetMapping(/search) public Listsearch(RequestParam(msg) String msg) { msg 招标文件发售开始时间; logger.info(start search data: {}, msg); float[] embed embeddingModel.embed(msg); logger.info(embed: {}, embed); return vectorStore.similaritySearch(SearchRequest .builder() .query(msg) .topK(2).similarityThreshold(0.4) .build()); }与模型对话在Spring AI中结合 ChatClient 可以直接将检索和Advisor整合在一起,这边用QuestionAnswerAdvisor// 对话代理ChatClient chatClient;// 向量数据库 VectorStore vectorStore; public AiRagController(ChatModel chatModel, ChatMemory chatMemory, VectorStore vectorStore, MilvusClient milvusClient) { this.chatClient ChatClient.builder(chatModel) // 默认系统提示词 .defaultSystem( 你是太和知识库系统的对话助手请以乐于助人的方式进行对话 今天的日期{current\_data} 我的用户ID是{user\_id} ) .defaultAdvisors( PromptChatMemoryAdvisor.builder(chatMemory).build(), SimpleLoggerAdvisor.builder().build() // 日志拦截 ) .build(); this.vectorStore vectorStore; } GetMapping(/rag) public Fluxrag( RequestParam(value question, defaultValue 招标文件每套售价多少人民币) String question, HttpServletResponse response) { response.setCharacterEncoding(UTF-8); Long userId 100000000l; String currentDate LocalDate.now().toString(); Fluxcontent chatClient.prompt() .system(a - a.param(current\_data, currentDate)) .system(a - a.param(user\_id, userId)) .user(question) .advisors(a - a.param(ChatMemory.CONVERSATION\_ID, userId)) // 简单快速 rag QuestionAnswerAdvisor实现思路 .advisors(QuestionAnswerAdvisor.builder(vectorStore) .searchRequest( SearchRequest.builder() .query(question) .similarityThreshold(0.4d).topK(2) .build() ) .build()) .stream() .content(); return content; }RAG高级阶段基于朴素RAG高级RAG主要通过预检索策略和后检索策略来提升检索质量。详见RAG论文https://arxiv.org/abs/2407.21059Pre-Retrieval预检索增强和转换用户输入使其更有效地执行检索任务解决格式不正确的查询、query 语义不清晰、或不受支持的语言等。1.QueryAugmenter 查询增强使用附加的上下文数据信息增强用户 query提供大模型回答问题时的必要上下文信息2.QueryTransformer查询改写因为用户的输入通常是片面的关键信息较少不便于大模型理解和回答问题。因此需要使用 prompt 调优手段或者大模型改写用户 query3.QueryExpander查询扩展将用户 query 扩展为多个语义不同的变体以获得不同视角有助于检索额外的上下文信息并增加找到相关结果的机会。代码实现com.alibaba.cloud.aispring-ai-alibaba-ragco.elastic.clients elasticsearch-java org.elasticsearch.client elasticsearch-rest-client org.springframework.ai spring-ai-starter-vector-store-elasticsearch// 查询增强ContextualQueryAugmenter queryAugmenter ContextualQueryAugmenter.builder()// 用于增强输入查询的组件提供额外的数据用于为大型语言模型提供必要的上下文以回答用户查询。.allowEmptyContext(false) // 允许空上下文避免在没有上下文时生成空查询.emptyContextPromptTemplate(PromptTemplate.builder().template(“没有相关数据查询”).build()).build();var compressionQueryTransformer CompressionQueryTransformer.builder().chatClientBuilder(chatClient.mutate()).build(); // 查询压缩 --使用大型语言模型将对话历史和后续查询压缩为捕获对话本质的独立查询var rewriteQueryTransformer RewriteQueryTransformer.builder().chatClientBuilder(chatClient.mutate()).targetSearchSystem(“vector store”).build();// 重写用户查询var translationQueryTransformer TranslationQueryTransformer.builder().chatClientBuilder(chatClient.mutate()).targetLanguage(“english”).build();// 查询翻译 --使用大型语言模型翻译用户查询为目标语言// Query Transformation 查询改写ListqueryTransformers List.of(rewriteQueryTransformer,compressionQueryTransformer,translationQueryTransformer);// Query Expansion 查询扩展MultiQueryExpander multiQueryExpander MultiQueryExpander.builder().numberOfQueries(2).chatClientBuilder(chatClient.mutate()).build(); // 查询扩展 --使用大型语言模型扩展用户查询生成多个相关查询Post-Retrieval后检索对于由问题检索得到的一系列上下文后检索策略关注如何优化它们与查询问题的集成。这一过程主要包括重新排序。重新排列检索到的信息将最相关的内容予以定位标记。直接将所有相关文档输入到大型语言模型LLMs可能导致信息过载为了缓解这一点后检索工作集中选择必要的信息强调关键部分并限制了了相应的上下文长度。Document Post-Processing 后置处理器使用附加的上下文数据信息增强用户 query提供大模型回答问题时的必要上下文信息示例介绍下重排模型专业化模型重排序模型如 qwen3-vl-rerank专门针对文档相关性评估进行训练能够更准确地计算查询与文档的语义匹配度。分数阈值过滤通过设置最小分数阈值可以过滤掉低质量的文档确保只有高相关性的内容被保留。在实现中可以看到这个过滤逻辑动态参数调整支持根据实际效果动态调整 topN 等参数优化最终返回的文档数量和质量。示例组件用com.alibaba.cloud.ai.rag.postretrieval.DashScopeRerankPostProcessor重排模型rerank 配置spring.ai.dashscope.rerank.options.modelqwen3-vl-rerank// rerank 重排序DashScopeRerankPostProcessor dashScopeRerankPostProcessor DashScopeRerankPostProcessor.builder().rerankModel(rerankModel).rerankOptions(dashScopeRerankProperties.getOptions()).build();重排前后效果总结后高级RAG流程图如下整体示例代码GetMapping(“/advancedRag”)public FluxadvancedRag(HttpServletResponse response, RequestParam(value “question”, defaultValue “开标时间和地点分别是”) String question) {response.setCharacterEncoding(“UTF-8”);// 查询增强 ContextualQueryAugmenter queryAugmenter ContextualQueryAugmenter.builder() // 用于增强输入查询的组件提供额外的数据用于为大型语言模型提供必要的上下文以回答用户查询。 .allowEmptyContext(false) // 允许空上下文避免在没有上下文时生成空查询 .emptyContextPromptTemplate(PromptTemplate.builder().template(没有相关数据查询).build()) .build(); var compressionQueryTransformer CompressionQueryTransformer.builder() .chatClientBuilder(chatClient.mutate()) .build(); // 查询压缩 --使用大型语言模型将对话历史和后续查询压缩为捕获对话本质的独立查询 var rewriteQueryTransformer RewriteQueryTransformer.builder() .chatClientBuilder(chatClient.mutate()) .targetSearchSystem(vector store) .build(); // 重写用户查询 var translationQueryTransformer TranslationQueryTransformer.builder() .chatClientBuilder(chatClient.mutate()) .targetLanguage(english) .build(); // 查询翻译 --使用大型语言模型翻译用户查询为目标语言 // Query Transformation 查询改写 ListqueryTransformers List.of( rewriteQueryTransformer ,compressionQueryTransformer ,translationQueryTransformer ); // Query Expansion 查询扩展 MultiQueryExpander multiQueryExpander MultiQueryExpander.builder() .numberOfQueries(2) .chatClientBuilder(chatClient.mutate()) .build(); // 查询扩展 --使用大型语言模型扩展用户查询生成多个相关查询 // rerank 重排序 DashScopeRerankPostProcessor dashScopeRerankPostProcessor DashScopeRerankPostProcessor.builder() .rerankModel(rerankModel) .rerankOptions(dashScopeRerankProperties.getOptions()) .build(); // 创建RAG流程,基于模块化架构设计 Advisor retrievalAugmentationAdvisor RetrievalAugmentationAdvisor.builder() .queryTransformers(queryTransformers) .queryExpander(multiQueryExpander) .queryAugmenter(queryAugmenter) .documentRetriever(VectorStoreDocumentRetriever.builder() // Retrieval 检索器--从向量数据库中检索与查询最相关的文档 .similarityThreshold(0.40).topK(2) .vectorStore(vectorStore) .build()) .documentJoiner(new ConcatenationDocumentJoiner()) // 将从多个 query 和从多个数据源检索到的 Document 合并为一个 Document 集合 .documentPostProcessors(dashScopeRerankPostProcessor) // 文档后处理器用于对检索到的文档进行索引方便后续的检索和使用。 .build(); String answer chatClient.prompt().system(a - a.param(current\_data, LocalDate.now().toString())).system(a - a.param(user\_id, 100000000L)) .advisors(retrievalAugmentationAdvisor) .user(question) .call() .content(); Fluxcontent Flux.just(answer); return content;}最近两年大模型发展很迅速在理论研究方面得到很大的拓展基础模型的能力也取得重大突破大模型现在正在积极探索落地的方向如果与各行各业结合起来是未来落地的一个重大研究方向大模型应用工程师年包50w属于中等水平如果想要入门大模型那现在正是最佳时机2025年Agent的元年2026年将会百花齐放相应的应用将覆盖文本视频语音图像等全模态如果你对AI大模型入门感兴趣那么你需要的话可以点击这里大模型重磅福利入门进阶全套104G学习资源包免费分享扫描下方csdn官方合作二维码获取哦给大家推荐一个大模型应用学习路线这个学习路线的具体内容如下第一节提示词工程提示词是用于与AI模型沟通交流的这一部分主要介绍基本概念和相应的实践高级的提示词工程来实现模型最佳效果以现实案例为基础进行案例讲解在企业中除了微调之外最喜欢的就是用提示词工程技术来实现模型性能的提升第二节检索增强生成RAG可能大家经常会看见RAG这个名词这个就是将向量数据库与大模型结合的技术通过外部知识来增强改进提升大模型的回答结果这一部分主要介绍RAG架构与组件从零开始搭建RAG系统生成部署RAG性能优化等第三节微调预训练之后的模型想要在具体任务上进行适配那就需要通过微调来提升模型的性能能满足定制化的需求这一部分主要介绍微调的基础模型适配技术最佳实践的案例以及资源优化等内容第四节模型部署想要把预训练或者微调之后的模型应用于生产实践那就需要部署模型部署分为云端部署和本地部署部署的过程中需要考虑硬件支持服务器性能以及对性能进行优化使用过程中的监控维护等第五节人工智能系统和项目这一部分主要介绍自主人工智能系统包括代理框架决策框架多智能体系统以及实际应用然后通过实践项目应用前面学习到的知识包括端到端的实现行业相关情景等学完上面的大模型应用技术就可以去做一些开源的项目大模型领域现在非常注重项目的落地后续可以学习一些Agent框架等内容上面的资料做了一些整理有需要的同学可以下方添加二维码获取仅供学习使用

相关文章:

大模型“幻觉“频现?RAG技术如何根治三大痛点,实现精准问答?

文章深入解析了RAG(检索增强生成)技术的核心原理与实现流程,指出大模型普遍存在的三大缺陷:幻觉现象、知识更新缓慢以及领域知识理解有限。RAG通过结合向量数据库、嵌入模型和大语言模型,实现从外部私有知识库检索信息…...

AI 短剧变现的 4 大合规赛道 新手低门槛可切入

当下AI短剧成为内容领域的热门风口,不少人想入局分一杯羹,却因担心踩坑违规、找不准变现方向而犹豫不决。其实新手入局无需焦虑,只要选对合规赛道,低门槛也能轻松切入。本文将详细拆解4个核心变现路径,全程贴合平台审核…...

2026年脱模油供应商怎么选?这几点很关键

2026年,建筑行业持续发展,脱模油作为建筑施工中不可或缺的材料,其质量和适用性至关重要。关云建材在脱模油领域深耕多年,积累了丰富的行业经验。接下来,我们就来深入探讨脱模油的相关问题,帮助大家选到合适…...

3种突破Cursor Pro限制的创新方案:解锁AI编程全功能体验

3种突破Cursor Pro限制的创新方案:解锁AI编程全功能体验 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your t…...

2026届必备的AI辅助写作平台解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能论文工具正渐渐在学术写作流程里掺杂进来,变成研究者提高效率的管用帮手…...

Linux 驱动开发流程(带最小可运行代码 + 通俗类比)

Linux 驱动开发流程(带最小可运行代码 通俗类比) 很多人学 Linux 驱动都会卡在这里:API 都看过,但完全不知道它们是怎么串起来工作的这篇文章目标很明确: ✅ 用一条主线讲清流程 ✅ 用类比帮你记住 ✅ 给你一个最小可…...

华硕笔记本性能调校新纪元:GHelper如何重塑硬件控制体验

华硕笔记本性能调校新纪元:GHelper如何重塑硬件控制体验 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, …...

2026AI大模型入门学习教程(建议收藏),大模型入门学习路线,非常详细看这一篇就够了!

一、LLM Fundamentals 基础 1. 机器学习的数学基础 在掌握机器学习之前,理解支撑这些算法的基本数学概念非常重要。 线性代数:这是理解许多算法(特别是深度学习算法)的关键。主要概念包括向量、矩阵、行列式、特征值和特征向量、…...

哪款蓝牙耳机性价比比较高?2026年十大高性价比蓝牙耳机推荐!

现在蓝牙耳机这玩意儿,基本上人手一副了吧?上班路上、健身房、甚至睡觉前都得挂着,早就不是啥稀罕物件了。但正因为太普及了,市场上也是啥妖魔鬼怪都有。最典型的毛病就是“价格虚标”,先定个七八百的指导价&#xff0…...

一体化数字引擎 驱动机械设备非标项目精益盈

机械设备行业正进入深度数字化转型期,非标定制与项目型制造企业普遍面临项目成本失控、进度不透明、变更响应慢、售后价值难挖掘等核心痛点。传统分散式管理与复杂业务场景脱节,导致交付延迟、利润流失、协同效率低下。面向非标设备行业的数字化管理需求…...

山东大学2022-2023学期实时绘制期末考试真题(回忆版)

山东大学2022年到2023年实时绘制期末考试 (一共9到小题,每题10分或12分,包含多个小问,上午考完下午回忆写的,大体就这些,复习时还是应该全面一点。) AABB包围盒构建过程;中间节点和叶…...

3分钟搭建你的微信智能管家:零代码实现24小时自动回复

3分钟搭建你的微信智能管家:零代码实现24小时自动回复 【免费下载链接】WechatBot 项目地址: https://gitcode.com/gh_mirrors/wechatb/WechatBot 想要一个能帮你自动处理微信消息的智能助手吗?WechatBot微信机器人让你在3分钟内拥有一个全天候在…...

BROADCOM博通集成 Matter 1.5平台认证就绪、BK7239N等芯片助力智能家居无缝融合

博通集成多款Wi-Fi SoC的Matter SDK平台已全面完成对Matter v1.5标准的支持,并通过Matter兼容性平台认证。此举标志着Beken芯片方案持续可为客户提供“开箱即用”的Matter开发体验,助力设备制造商高效推出符合最新统一标准的智能产品。随着Matter生态的快…...

今天使用trae进行代码开发的一点点小感触

今天用trae搭建环境,之前项目是一个spring boot项目,用的是一个共公的nacos。因为大家一起测试不太方便,所以想改造一下,心血来潮打算用trae来做这件事,整了一天在使用trae的过程也有一些感受,记录下来与大…...

WindowResizer:打破窗口限制,实现Windows窗口自由调整的终极解决方案

WindowResizer:打破窗口限制,实现Windows窗口自由调整的终极解决方案 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾遇到过某些应用程序窗口大小被…...

大模型应用开发第三天

时间过得真快,一晃眼已经到2026年了。遥想2023年,ChatGPT横空出世的时候,大家还在讨论“AI会不会取代人类工作”。如今三年过去,打工人早已接受现实:该加班还是加班,AI只是让PPT做得更快了而已。但变化也是…...

第一次尝试使用制作HTML列表与表格

一、利用<li>标签&#xff0c;完成此次列表<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>列…...

证书创建方法说明

生成证书 方法一&#xff1a;合适&#xff08;临时测试&#xff0c;不需要管理&#xff09; 快速生成脚本&#xff08;一键完成&#xff09; 创建 create_lan_cert.sh&#xff1a; #!/bin/bash# 配置参数 IP_ADDR"192.168.1.100" # 修改为你的局域网IP DAYS365…...

阻焊层有多重要?PCB封装的防护屏障

在 PCB 封装的构成要素中&#xff0c;阻焊层&#xff08;Solder Mask&#xff09; 是容易被忽视却至关重要的 “防护屏障”&#xff0c;它如同给 PCB 穿上一层 “绝缘防护服”&#xff0c;既保护电路板的导电线路&#xff0c;又规范焊接过程&#xff0c;是保障电路可靠性、稳定…...

丝印层—PCB封装的信息标识系统

如果说焊盘是 PCB 封装的 “硬件骨架”&#xff0c;那么丝印层&#xff08;Silkscreen&#xff09; 就是封装的 “信息标识系统”&#xff0c;是 PCB 表面最直观的 “说明书”。​一、丝印层的基础定义与特性丝印层&#xff0c;又称 “文字层”“标识层”&#xff0c;是 PCB 表…...

hadoop3.3.6上搭建Hbase2.5.13集群

一、什么是Hbase hadoop的局限性 hadoop主要是实现批处理的处理,并且通过顺序方式访问数据 要查找数据必须搜索整个数据集,如果要进行随机读写数据,效率低下 Hbase是Bigtable的开源java版本,是建立在HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的NoSQL数据…...

终极指南:3分钟快速掌握Logisim-evolution数字电路设计与仿真

终极指南&#xff1a;3分钟快速掌握Logisim-evolution数字电路设计与仿真 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 想要学习数字电路设计却不知从何开始&#xff1…...

从PyTorch/Onnx、AIMET量化到 QNN GPU 部署全流程实战:GPU 推理 300FPS+

YOLOv8s 从 AIMET 量化到 QNN GPU 部署全流程实战、GPU 推理 3ms/帧 1. 环境准备 组件 版本/路径 QNN SDK v2.45.0.260326 Android NDK r26d 目标设备 Qualcomm SM8750 目标架构 aarch64-android export QNN_TARGET_ARCH="aarch64-android" export NDK_ROOT=/home/mi…...

windows系统安装gitblit经验分享

1、下载gitblithttp://www.gitblit.com/下载解压后如下图所示&#xff1a;2、安装与配置&#xff08;1&#xff09;修改data/defaults.properties#git仓库地址git.repositoriesFolder E:/GitRepo/git# 配置http访问端口server.httpPort 8090# 配置http访问git时的IP地址serve…...

提升效率:用快马ai生成ubuntu一键自动化安装openclaw的脚本

最近在Ubuntu上安装OpenClaw时&#xff0c;发现手动操作既耗时又容易出错。经过一番摸索&#xff0c;我总结出一套自动化方案&#xff0c;用脚本把整个流程优化到了极致。这里分享下具体实现思路和效率提升的关键点。 环境检测与适配 脚本首先会检查Ubuntu版本和架构&#xff0…...

告别繁琐配置:用快马ai一键生成windows版openclaw自动化安装脚本原型

最近在折腾一个开源工具OpenClaw&#xff0c;发现它在Windows下的安装过程真是让人头大——各种依赖检查、环境变量配置&#xff0c;手动操作一不小心就出错。作为一个懒人程序员&#xff0c;我决定用Python写个自动化安装脚本&#xff0c;结果发现用InsCode(快马)平台的AI辅助…...

高效文档下载解决方案:让知识获取不再受阻

高效文档下载解决方案&#xff1a;让知识获取不再受阻 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档&#xff0c;但是相关网站浏览体验不好各种广告&#xff0c;各种登录验证&#xff0c;需要很多步骤才能下载文档&#xff0c;该脚本就是为了解决您的烦恼…...

Source Han Serif CN全解析:免费商用字体的7大维度深度指南

Source Han Serif CN全解析&#xff1a;免费商用字体的7大维度深度指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 一、问题&#xff1a;中文字体应用的三大行业困境 如何突破中文…...

利用快马平台快速构建类FinalShell服务器监控Web原型

最近在折腾服务器监控工具&#xff0c;发现FinalShell确实好用&#xff0c;但有时候团队协作或者临时演示时&#xff0c;还是需要一个轻量级的Web版监控面板。正好发现了InsCode(快马)平台&#xff0c;用它快速搭建了一个原型&#xff0c;分享下实现思路。 整体架构设计 这个监…...

AI辅助数据库设计:让快马平台的Kimi模型成为你的课程设计智能顾问

今天在完成数据库课程设计作业时&#xff0c;我尝试用InsCode(快马)平台的AI辅助功能来设计医院门诊预约系统&#xff0c;整个过程比想象中顺利很多。作为一个数据库初学者&#xff0c;这种智能辅助开发的方式确实帮我解决了不少难题&#xff0c;下面记录下具体实现过程和经验。…...