一、 三者关系:一个生动的比喻

首先,我们用一个“超级侦探团队”的比喻来直观理解三者的关系:

  • RAG:是这个团队的“档案管理员”。当侦探遇到未知信息时,管理员会快速地从庞大的档案库(你的私有数据)中查找相关资料,并把相关档案片段交给侦探。它解决了大模型“知识陈旧”和“幻觉”的问题。

  • LangChain:是这个团队的“调度中心”和“工作流程”。它规定了侦探破案的标准流程:先让管理员(RAG)查资料,再决定是否需要调用外部工具(如调用地图API、查询航班信息),最后整理答案并生成报告。它解决了“如何将多个组件串联起来”的问题。

  • Agent:是这个团队的“侦探本人”,是决策大脑。他接收用户的问题(“帮我规划一个去北京的行程”),然后利用调度中心(LangChain)制定的流程,主动思考:第一步该做什么(查资料),第二步该做什么(调用天气API),第三步该做什么(调用航班查询工具)。它解决了“如何让大模型主动使用工具”的问题。

总结关系:

  • RAG 是增强模型知识核心技术

  • LangChain 是构建和管理 RAG、Agent 等应用的框架和工具包

  • Agent 是赋予模型推理和使用工具能力的范式或架构

  • 在实践中,我们常常用 LangChain 这个框架,来构建一个具备 RAG 能力的 Agent


二、 发展历程:为什么是它们三个?

它们的出现不是偶然,而是大模型应用发展的必然结果。

  1. 原始时代(Prompt Engineering):人们发现直接问大模型,它经常胡说八道(幻觉),而且不知道2023年之后的事情(知识陈旧)。

  2. RAG 的诞生(2023年初):为了解决幻觉和知识更新问题,人们想到把最新的、私有的资料和问题一起传给大模型,让它基于这些“证据”来回答。这就是 RAG,它成了大模型应用的“标配”。

  3. LangChain 的兴起(2023年中):随着大家纷纷构建 RAG 应用,发现里面步骤繁多(加载文档、切分、向量化、检索、生成...)。于是,LangChain 这个框架出现了,它把所有这些步骤封装成标准模块,让开发者能像搭乐高一样快速构建应用。

  4. Agent 的爆发(2023年底至今):人们不再满足于“问答”,希望大模型能“做事”(比如自动发邮件、分析数据)。Agent 的概念火了起来,它让大模型具备了“思考-行动”的循环能力。而 LangChain 自然也成为了构建 Agent 的首选框架。

这个演进历程,清晰地展示了大模型应用从“静态知识库”到“动态智能体”的进化路径,其核心驱动力如下图所示:
 


三、 本质与原理深度剖析

1. RAG - 检索增强生成
  • 本质开卷考试。不让大模型死记硬背(参数化知识),而是允许它在答题时去查阅指定的参考资料(私有数据)。

  • 原理

    1. 预处理:将你的私有文档(Word, PDF等)进行切块,变成一段段文字。

    2. 向量化:使用嵌入模型将每一段文字转换成一个数字向量(一组数字),并存入向量数据库。这个向量代表了这段文字的语义。

    3. 检索:当用户提问时,同样将问题转换成向量,然后在向量数据库中查找语义最相似的文本片段(即向量距离最近)。

    4. 增强:将检索到的文本片段和用户问题一起组合成一个详细的提示词(Prompt),送给大模型。

    5. 生成:大模型基于这个“带着资料的提示词”来生成答案,从而保证答案有据可依,减少幻觉。

2. LangChain
  • 本质大模型应用的“脚手架”或“标准工厂流水线”。它提供了一套预制的、可组装的组件,来简化构建复杂应用的过程。

  • 核心原理与组件

    • Models:抽象层,可以对接不同的大模型(OpenAI, Anthropic, 国内智谱、通义千问等)。

    • Prompts:管理提示词模板,方便复用。

    • Chains核心思想。将多个组件(如一个RAG流程:检索 -> 生成)链接成一个完整的序列。

    • Agents:提供了一系列工具,并封装了让大模型决定使用哪个工具的逻辑。

    • Memory:管理对话历史,让模型有上下文记忆。

3. Agent
  • 本质赋予大模型“大脑”和“手脚”。大脑负责思考决策,手脚就是外部工具(API, 函数等)。

  • 原理 - ReAct 框架:这是Agent最经典的思维模式。

    • Thought:模型思考当前情况,并决定下一步该做什么。

    • Action:根据思考,执行一个动作(调用一个工具,如 search_weather)。

    • Observation:获取工具执行的结果(如“北京晴,25度”)。
      然后循环这个过程:根据观察结果再次 Thought -> Action -> Observation... 直到得出最终答案。


四、 怎样做:从零构建一个 LangChain-Agent-RAG 应用

我们将构建一个 “旅行规划专家” 智能体,它能结合你的私有旅行偏好(RAG)和实时信息(Agent工具)来规划行程。

架构图:

用户: “帮我规划一个去北京的3天美食之旅”
        |
        v
    [LangChain Agent]
        |
        |-- 思考: 需要先了解用户的饮食偏好和预算 (RAG)
        |-- 行动: 从“用户偏好文档”中检索相关信息
        |
        |-- 思考: 需要知道北京的实时天气 (Tool)
        |-- 行动: 调用 get_weather("北京") API
        |
        |-- 思考: 需要推荐一些当地热门餐厅 (Tool)
        |-- 行动: 调用 search_restaurants("北京", "美食") API
        |
        |-- 综合所有信息,生成一份完整的行程计划
        |
        v
最终答案: “根据您偏好...,结合北京近期晴朗天气,为您规划...”

实战步骤(概念性代码):

第1步:准备RAG——用户偏好档案

  1. 创建一个 user_preference.txt 文件,内容如:“该用户偏好中式餐饮,预算中等,不喜欢过于拥挤的景点。”

  2. 使用 LangChain 将其切块、向量化,并存入向量数据库(如Chroma)。

第2步:定义Agent的工具

from langchain.agents import tool

@tool
def get_weather(city: str) -> str:
    """根据城市名获取实时天气。"""
    # 调用一个真实的天气API,如 OpenWeatherMap
    return f"{city}的天气是晴朗,25度。"

@tool
def search_restaurants(city: str, keyword: str) -> str:
    """根据城市和关键词搜索餐厅。"""
    # 调用大众点评或Google Places的API
    return f"在北京找到以下美食餐厅:全聚德烤鸭,护国寺小吃..."

第3步:构建LangChain Agent

import os
from langchain.agents import AgentType, initialize_agent
from langchain.chat_models import ChatOpenAI # 或者其它模型
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.schema import SystemMessage

# 1. 初始化大模型
llm = ChatOpenAI(model="gpt-4", temperature=0)

# 2. 加载RAG向量数据库
vectorstore = Chroma(persist_directory="./chroma_db", embedding_function=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()

# 3. 定义工具列表。注意:我们将RAG的检索器也封装成一个工具!
tools = [get_weather, search_restaurants] 
# 注: 高级用法中,可以用 LangChain 的 `tool` 装饰器将 retriever 也包装成一个工具。

# 4. 创建系统提示,告诉Agent它的角色和能力
system_message = SystemMessage(content="你是一个旅行规划专家。你可以先查阅用户偏好档案,然后使用工具获取实时信息来规划行程。")

# 5. 初始化Agent
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, # 使用ReAct模式的Agent
    verbose=True, # 打印出详细的思考过程,便于调试
    system_message=system_message,
    handle_parsing_errors=True # 处理解析错误
)

# 6. 运行Agent!
result = agent.run(“帮我规划一个去北京的3天美食之旅”)
print(result)

当你运行这个程序时,在 verbose 模式下你会看到类似这样的思考过程:

Thought: 用户需要规划一个北京的美食之旅。我需要先了解他有什么偏好。
Action: 查阅用户偏好档案
Observation: 用户偏好中式餐饮,预算中等...
Thought: 好的,我知道他喜欢中餐。现在我需要知道北京的天气来决定室内还是室外活动。
Action: get_weather
Action Input: {"city": "北京"}
Observation: 北京的天气是晴朗,25度。
Thought: 天气很好,可以安排一些户外小吃街。现在我需要找一些具体的餐厅。
Action: search_restaurants
Action Input: {"city": "北京", "keyword": "美食"}
Observation: 在北京找到以下美食餐厅:全聚德烤鸭,护国寺小吃...
Thought: 现在我有了所有信息,可以综合用户偏好、天气和餐厅信息,生成一个3天的行程了。
Final Answer: 为您规划如下:第一天...

总结与展望

  • RAG:模型的知识源,负责“知”。

  • Agent:模型的决策脑,负责“思”和“行”。

  • LangChain:应用的骨架,负责“连”和“控”。

未来展望:这三者正在深度融合。未来的AI应用将是:一个由LangChain这类框架编排的、具备RAG长期记忆和领域知识、并能像Agent一样自主完成复杂任务的超级智能体。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐