LLM之RAG实战(五十八)| Agentic RAG 如何改变信息检索

向量数据库大模型机器学习

picture.image

 在人工智能领域,检索增强生成 (RAG) 改变了游戏规则,通过引入外部知识使大型语言模型 (LLM) 变得更加智能。但严重依赖向量数据库来存储和获取数据块,这是传统 RAG 致命缺陷。Agentic RAG是一种更智能、由agent驱动的方法,正在改变一切。我们所知道的向量数据库就这样结束了吗?不完全是,但 Agentic RAG 正在通过使信息检索动态、适应性和更有效来突破界限。


 将传统的 RAG 想象成一个图书馆员,他根据关键字检索书籍,但不检查它们是否正是您需要的。Agentic RAG 就像一个智能助手,可以提出问题、完善您的请求、搜索多个货架(甚至在线),并在提交信息之前仔细检查。在这里,我们将深入探讨传统 RAG 为何陷入困境,以及 Agentic RAG 如何解决它。

一、 什么是 RAG?

 在开始之前,让我们先介绍一下RAG基础知识。RAG 主要包括两个步骤: 检索 (从数据库中查找相关信息)和生成 (使用 GPT 等 LLM 根据检索到的信息生成响应)。这有助于帮助LLM在真实数据中生成正确答案来避免“幻觉”(编造事实)。


  示例:您问人工智能:“气候变化政策的最新情况是什么?”,传统的 RAG 会将查询嵌入为向量,在向量数据库中搜索文档中的类似文本块,并将它们提供给 LLM 以获得响应。


 但随着查询变得复杂,这种简单的设置就显得不够了。

二、传统 RAG 的问题

 传统的 RAG 适用于简单的问题,在复杂性下就会崩溃。下面我们从多个角度来看一下传统RAG的窘境。

2.1 分块窘境

  文件不整齐,又长又乱。传统的 RAG 将它们拆分为“块”(小文本片段)以嵌入到矢量中。但是块应该有多大呢?太小,你会失去上下文(例如,没有段落的句子)。太大,检索效率低下。

例: 想象一下一份关于电动汽车的 10 页报告。如果按句子分块,查询“电池寿命问题”可能会错过与另一个块中的“充电基础设施”的连接。

输出 :肤浅的回应,例如“电池会随着时间的推移而退化”,缺少更广泛的背景。

picture.image

2.2 嵌入模型

 嵌入将文本转换为数字(向量)以进行相似性搜索。但并非所有的嵌入都是平等的,它们可能会错过同义词或讽刺等细微差别。这是一场“彩票”,因为结果取决于嵌入模型,而糟糕的结果会导致不相关的检索。

示例 :查询:“苹果股崩盘。糟糕的嵌入可能会拉出水果从树上掉下来而不是从公司掉下来的块。

输出 :响应中令人困惑的混淆。

常见的嵌入问题:

picture.image

2.3 向量数据库

 矢量数据库(如 Pinecone 或 Weaviate)功能强大,但很麻烦。您需要为数据创建索引、处理缩放、管理更新并支付计算费用。对于大型数据集,这就像驯服野生动物一样,成本高昂且复杂。

示例 :一家拥有数百万个文档的公司必须随着数据的变化不断重新索引。一次更新?繁荣、停机或错误。

2.4 上下文

 LLM 有tokens限制(例如,GPT-4 为 128K)。传统的 RAG 内容在提示中检索了块,但如果块不相关或太多,上下文就会被“杀死”,LLM 会忽略关键部分或产生幻觉。


  幻觉风险即使进行了检索,如果块不能完全回答查询,LLM 也会用虚构的信息填补空白。研究表明,传统的 RAG 可以减少 50-70% 的幻觉,但对于多步骤问题则不然。

三、 Agentic RAG

  Agentic RAG 通过添加“agents”AI 组件(比如思考、计划和行动)来弥补传统RAG的不足。代理的流程不是静态的,而是根据环境动态决定下一步该做什么,从而使系统具有适应性。

3.1 核心概念

 从本质上讲,Agentic RAG 将检索视为一个推理过程。代理使用以下模式:
  • 反思(Reflection) :批评和改进产出。

  • 规划(Planning) :将查询分解为多个步骤。

  • 工具使用(Tool Use) :调用外部资源(例如网络搜索、API)。

  • 多代理协作(Multi-Agent Collaboration) :多个代理组队(例如,一个检索,另一个验证)。

    这种理念从“检索和希望”转变为“推理和适应”,尽管它们仍然有用,但可能会减少在简单情况下对海量向量数据库的需求。

3.2 技术拆解

Step1:文档导航器

代理首先“导航”您的数据。它优化查询、决定工具和检索。

工作流如下所示:

picture.image

输出示例: 查询:“巧克力蛋糕的最佳食谱。

  • 传统 RAG:检索随机块,输出基本配方。
  • 代理 RAG:代理检查饮食需求(例如素食主义者?),在网上搜索变化,验证新鲜度。
  • 输出:“纯素巧克力蛋糕:配料 2 杯面粉......步骤:在 350°F 下烘烤 30 分钟。资料来源:最近的 Allrecipes 评论。

代码(使用 LangChain 进行简单的代理 RAG):

  
from langchain_openai import OpenAI  
from langchain.tools import Tool  
from langchain.agents import initialize_agent  
  
# Define tools (e.g., a retriever and web search)  
retriever_tool = Tool(name="Retriever", func=lambda q: "Retrieved: Chocolate recipe chunks")  
web_search_tool = Tool(name="WebSearch", func=lambda q: "Web: Vegan variations")  
  
# Initialize LLM and agent  
llm = OpenAI(temperature=0.7)  
agent = initialize_agent(tools=[retriever_tool, web_search_tool], llm=llm, agent_type="zero-shot-react-description")  
  
# Run query  
response = agent.run("Find a vegan chocolate cake recipe.")  
print(response) 

四、Agentic RAG vs 传统 RAG

为了清楚起见,让我们在表格中进行比较。

picture.image

查询:“计划去巴黎的旅行,包括预算和天气。

  • 传统 RAG:检索块,输出脱节的信息。

  • Agentic RAG:代理计划步骤(天气 API、预算计算器)、

  • 输出:“预算:1500 美元。天气:20°C 晴。行程:第一天......”

五、Agentic RAG的优缺点

5.1 优点

  • 动态检索 :代理即时选择源(矢量数据库、Web、API)。
  • 自我更正 :如果需要,验证并重新检索。
  • 多步骤推理 :处理“假设”场景。
  • 工具集成 :调用计算器、电子邮件或代码执行器。

5.2 缺点

代理 RAG 并不完美:

  • 延迟和成本 :多个座席呼叫 = 响应较慢,账单较高。
  • 复杂性 :构建和调试代理很困难。
  • 协调: 多代理可能会沟通不畅。
  • 道德问题 :动态数据提取的隐私风险。

缓解措施:为代理使用较小的 LLM,添加保护措施。

六、什么时候选择 Agentic RAG?

如果出现以下情况,请继续这样做:

  • 查询是复杂/多步骤的。
  • 数据是动态的(例如,实时新闻)。
  • 您需要高精度而不是速度。

坚持传统,对静态数据进行简单的问答。

七、未来的可能性

Agentic RAG 可以演变成完全自主的人工智能系统。

 趋势:语音代理、浏览器作代理、深入研究工具。矢量数据库不会消亡,它们将作为众多工具中的一个集成。期待像 LangGraph 这样的框架使构建变得更容易。

八、 Agentic RAG系统

 让我们使用 Python 和 LangGraph(一种流行的框架)构建一个基本的框架。

步骤如下:

1、安装相关包:

  
pip install langchain langgraph openai

2、设置 OpenAI API 密钥。

3、代码:

  
from langgraph.graph import StateGraph, END  
from langchain_core.messages import HumanMessage  
from langchain_openai import ChatOpenAI  
  
# Define state and agents  
class State:  
    query: str      
    context: str = ""  
      
llm = ChatOpenAI(model="gpt-4")  
  
def refine_query(state):  
    refined = llm.invoke([HumanMessage(content=f"Refine: {state.query}")]).content      
    return {"query": refined}  
  
def retrieve(state):      
    # Simulate retrieval      
    context = "Retrieved context for " + state.query      
    return {"context": context}  
      
def generate(state):  
    response = llm.invoke([HumanMessage(content=f"Generate with context: {state.context}")]).content      
    return {"query": response}    
      
# Build graph  
workflow = StateGraph(State)  
workflow.add_node("refine", refine_query)  
workflow.add_node("retrieve", retrieve)  
workflow.add_node("generate", generate)  
workflow.set_entry_point("refine")  
workflow.add_edge("refine", "retrieve")  
workflow.add_edge("retrieve", "generate")  
workflow.add_edge("generate", END)  
  
app = workflow.compile()  
  
# Run  
result = app.invoke({"query": "Easy chocolate cake recipe"})  
print(result["query"])  
 这是一个入门级添加真实工具,例如用于生产的矢量数据库(例如 FAISS)。测试它:输入查询,查看实际的工作流程。


 总之,Agentic RAG 并没有扼杀矢量数据库,而是将它们发展成为更智能生态系统的一部分。通过使检索代理驱动,它正在彻底改变人工智能处理信息的方式,一次一个自适应步骤。
0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论