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

《Learning Langchain》阅读笔记12-RAG(8):RAG的优化策略

RAG for AI app的三个阶段

AI应用程序的RAG系统通常遵循三个核心阶段:

  • Indexing索引:此阶段涉及预处理外部数据源,并将表示数据的嵌入存储在向量存储器中,以便可以轻松检索。
  • Retrieval检索:此阶段涉及根据用户的查询检索存储在向量存储器中的相关嵌入和数据。
  • Generation生成:这个阶段涉及将原始提示与检索到的相关文档合成为一个最终提示,发送给模型进行预测。

![[Pasted image 20250911160251.png|537x315]]

检索示意图:
![[Pasted image 20250911160403.png|548x576]]
一旦我们根据用户的查询检索了相关文档,最后一步就是将它们添加到原始提示中作为上下文,然后调用模型生成最终输出:
![[Pasted image 20250911160630.png]]

对应的代码:

from langchain_openai import ChatOpenAI 
from langchain_core.prompts 
import ChatPromptTemplate retriever = db.as_retriever() prompt = ChatPromptTemplate.from_template("""Answer the question based only on the following context: {context} Question: {question} """) llm = ChatOpenAI(model_name="gpt-3.5-turbo",temperature=0) chain = prompt | llm # fetch relevant documents 
docs = retriever.get_relevant_documents("""Who are the key figures in the ancient greek history of philosophy?""") # run 
chain.invoke({"context": docs,"question": """Who are the key figures in the ancient greek history of philosophy?"""})

策略总结

然而,多个用户使用的生产就绪的 AI 应用程序需要更高级的 RAG 系统。为了构建一个强大的 RAG 系统,我们需要有效地回答以下问题:

  • 我们如何处理用户输入质量的变化?
  • 我们如何将查询路由到从各种数据源检索相关数据?
  • 我们如何将自然语言转换为目标数据源的查询语言?
  • 我们如何优化我们的索引过程,即嵌入、文本分割?

策略总结如图所示:
在这里插入图片描述

1. Query transformations(查询转换)

在用户提出问题后,第一步是对查询进行加工和优化。

  • 目的:确保问题更容易匹配数据库或向量库中的内容。

  • 方法:可以对问题进行重写、扩展或修改。例如:

    • 同义词替换(“老师”→“教师”)

    • 扩展问题(“柏拉图的思想”→“柏拉图在哲学、政治学方面的思想”)

    • 改写问题使其更正式或更具体。

  • 价值:提高检索相关性的同时减少用户模糊提问带来的歧义。

2. Routing(路由选择)

经过转换的问题可能要去不同的数据源中寻找答案。

  • 机制:系统会判断问题更适合在哪个数据源里检索,比如:

    • 问题涉及结构化数据 → 路由到关系型数据库或图数据库。

    • 问题涉及非结构化文本 → 路由到向量数据库。

  • 智能化:通常会通过分类器、规则或模型来自动决定路由。

  • 价值:避免无效搜索,减少延迟,提升检索精准度。

3. Query construction(查询构建)

一旦路由确定,就要把自然语言问题转化为具体的检索指令。

  • 针对关系/图数据库:转化为 SQL 或 Cypher 查询,直接操作结构化数据。

  • 针对向量数据库:转化为检索条件(如基于向量相似度 + 元数据过滤)。

  • 挑战:需要保证自然语言到数据库语法的映射准确,否则会导致“查询偏差”。

  • 价值:让 LLM 能够有效利用不同类型的数据存储。

4. Multimodal/semistructured index(多模态/半结构化索引)

不仅仅是文本,文档可能包含图片、表格或其他格式。

  • 操作

    • 先对文档进行优化预处理(如分段、清洗)。

    • 构建向量索引,支持多模态(文字 + 图像 + 表格)。

  • 目标:让系统能够处理和检索复杂的数据类型,而不仅仅是纯文本。

  • 价值:扩展 RAG 的能力,使得它能回答涉及图表或图片内容的问题。

5. Postprocessing(后处理)

当从多个数据源拿到候选文档后,需要做结果整合。

  • 操作

    • 合并:把来自不同数据库的内容组合在一起。

    • 排序:根据相关性或置信度重新排名。

    • 过滤:去掉冗余或噪声文档。

  • 价值:提升检索结果的质量,减少无关信息传递给大模型,从而提高最终回答的准确性与简洁度。

总结
这五个环节构成了一个完整的 RAG 优化闭环

  • 输入端(用户问题)要被智能转化与路由;

  • 中间端(数据库查询与索引构建)要精准高效;

  • 输出端(后处理)要干净有序。


文章转载自:

http://7pxA4hNO.hsrch.cn
http://y5tymIXu.hsrch.cn
http://1i28CaBZ.hsrch.cn
http://5kkIL31y.hsrch.cn
http://qOVecBUY.hsrch.cn
http://tLAq9zq8.hsrch.cn
http://TluU8324.hsrch.cn
http://2HExRQj1.hsrch.cn
http://3cBXL0Sz.hsrch.cn
http://NUG4KlPD.hsrch.cn
http://0i8aecJC.hsrch.cn
http://TlMAPbfR.hsrch.cn
http://gf7C0nqu.hsrch.cn
http://lCRfQjqZ.hsrch.cn
http://gppUyO3p.hsrch.cn
http://uFrBaNi7.hsrch.cn
http://E9ZbZ3bX.hsrch.cn
http://fEwBI7qS.hsrch.cn
http://zfGVKtu0.hsrch.cn
http://efpWYlLH.hsrch.cn
http://X09NXsTv.hsrch.cn
http://eJvuE2VO.hsrch.cn
http://NdawuA7v.hsrch.cn
http://a8NPZXVe.hsrch.cn
http://f4klc3ld.hsrch.cn
http://5nmZzLDz.hsrch.cn
http://gv6Txc7h.hsrch.cn
http://u6cBm7bT.hsrch.cn
http://3koE7qId.hsrch.cn
http://RrOKGEUi.hsrch.cn
http://www.dtcms.com/a/379474.html

相关文章:

  • daily notes[43]
  • LRU缓存详解:用C语言实现高效数据管理
  • 灵码产品演示:软件工程架构分析
  • 硬件电路-陀机
  • swiper插件的使用
  • mysql的各种锁
  • Java大厂面试实录:AIGC与虚拟互动场景下的微服务与AI落地(附知识详解)
  • Kafka 学习笔记
  • 机械零件极限应力线图
  • 萤石安全生产监管解决方案:构建企业安全智能化防护网
  • sqlmap常用命令
  • MID认证:全球电力计量市场的通行证与中国协议兼容性分析
  • STM32开发(USART:IIC总线)
  • Spring框架中用到的设计模式
  • 从源码和设计模式深挖AQS(AbstractQueuedSynchronizer)
  • 四、计算机网络与分布式系统(中)
  • 半导体学习笔记
  • 深入解析Dart虚拟机运行原理
  • 一文教您解决Ubuntu ModuleNotFoundError: No module named ‘_tkinter‘问题
  • 部署合约常见的问题
  • Python快速入门专业版(二十三):for循环基础:遍历字符串、列表与range()函数(计数案例)
  • MySQL 非空约束(NOT NULL):看似简单,却决定数据质量的关键细节
  • 【笔记】悬架减振器的阻尼带宽
  • C++:迭代器失效问题(vector为例)
  • TDengine 选择函数 TAIL() 用户手册
  • 在Linux系统中清理大文件的方法
  • oracle里的int类型
  • 【开关电源篇】整流及其滤波电路的工作原理和设计指南-超简单解读
  • 第五章 Logstash深入指南
  • 猫狗识别算法在智能喂食器上的应用