本文目录
  1. 5.1 基本定义
  2. 5.2 LangChain 在 RAG 中的位置
  3. 5.3 三个必须排除的误解
  4. 六、Models 基础
  5. 6.1 LLM
  6. 6.2 Chat Model
  7. 6.3 Embedding Model
  8. 6.4 三者对比
  9. 七、Messages 与多轮对话
  10. 7.1 SystemMessage
  11. 7.2 HumanMessage
  12. 7.3 AIMessage
  13. 7.4 多轮对话的消息结构
  14. 7.5 关键易错点:历史消息不是全部变成 SystemMessage
  15. 八、invoke() 的通用含义

LangChain、Models 与 Messages

5.1 基本定义

LangChain 是一个用于构建大模型应用的开发框架。

它不是 RAG 专用框架。除了 RAG,还可以用于对话应用、Agent 等大模型应用。

“框架”可以暂时理解成:

一套组织组件、规定组件如何协作并组合工作流的方式。

5.2 LangChain 在 RAG 中的位置

                    RAG 应用
                       │
                  LangChain
                 组织 / 连接
                       │
      ┌────────────────┼────────────────┐
      ↓                ↓                ↓
 Embedding Model   Vector Store    LLM / Chat Model
   文本转向量       存储与检索        生成答案

LangChain 更像“项目经理 + 连接器”。真正完成计算的是外部组件:

  • Embedding Model 负责把文本变成向量;
  • 向量数据库负责存储和检索向量;
  • LLM 或 Chat Model 负责理解上下文并生成答案;
  • LangChain 负责调用、组织和串联这些能力。

5.3 三个必须排除的误解

LangChain 不是大模型
LangChain 不是向量数据库
LangChain 也不等于 RAG

六、Models 基础

LangChain 自己不会生成答案,它需要通过 Models 接口与真正的模型交互。

Python 程序
    ↓
LangChain 的模型接口
    ↓
OpenAI / DeepSeek / Qwen / 其他模型服务
    ↓
返回模型结果

今天需要区分三类模型。

6.1 LLM

这里把 LLM 接口理解为偏“文本输入、文本输出”的模型调用方式:

输入:一段字符串 Prompt
输出:模型生成的文本

示意代码:

response = llm.invoke("请用一句话解释 RAG。")

6.2 Chat Model

Chat Model 以“消息列表”为核心输入,消息带有不同角色,更适合聊天和多轮对话:

输入:System / Human / AI 等消息组成的列表
输出:通常是 AIMessage

示意代码:

response = chat_model.invoke(messages)
print(response.content)

初学代码中,模型对象有时仍被命名为 llm,例如 llm = ChatOpenAI(...)。变量名不改变它实际属于 Chat Model 接口这一事实;要根据所创建的类和输入输出方式判断。

6.3 Embedding Model

Embedding Model 不负责回答问题,而是把文本转换成向量:

输入:"怎么申请年假?"
输出:[0.142, -0.372, 0.821, ...]

这些向量用于语义相似度计算和检索。

6.4 三者对比

类型 主要输入 主要输出 在 RAG 中的作用


LLM 字符串 Prompt 生成文本 根据 Prompt 生成答案 Chat Model 带角色的消息列表 AI 消息 理解对话上下文并生成回答 Embedding Model 文本 数值向量 向量化文档和问题,支持语义检索


七、Messages 与多轮对话

Chat Model 常见的三种消息类型如下。

7.1 SystemMessage

用于设定模型的身份、总体规则和行为边界。

from langchain_core.messages import SystemMessage

SystemMessage(content="你是一名耐心的 Python 老师。")

7.2 HumanMessage

表示用户说的话。

from langchain_core.messages import HumanMessage

HumanMessage(content="请解释什么是变量。")

7.3 AIMessage

表示 AI 之前的回答,也通常是 Chat Model 返回的消息对象类型。

from langchain_core.messages import AIMessage

AIMessage(content="变量可以理解成保存数据的名字。")

7.4 多轮对话的消息结构

from langchain_core.messages import (
    SystemMessage,
    HumanMessage,
    AIMessage,
)

messages = [
    SystemMessage(content="你是一名耐心的 Python 老师。"),
    HumanMessage(content="什么是变量?"),
    AIMessage(content="变量是程序中用于保存或引用数据的名称。"),
    HumanMessage(content="请再举一个简单例子。"),
]

response = chat_model.invoke(messages)
print(response.content)

消息历史应保留原来的角色顺序:

System:规则和身份
Human:用户第一轮问题
AI:模型第一轮回答
Human:用户第二轮问题
……

7.5 关键易错点:历史消息不是全部变成 SystemMessage

错误理解:

为了让模型知道历史,把以前所有内容都包装成 SystemMessage。

正确理解:

历史对话中的用户内容仍是 HumanMessage,AI 回答仍是 AIMessage;SystemMessage 主要承载系统级规则和身份设定。

角色本身就是对话上下文的一部分。全部改成 SystemMessage 会丢失真实的说话者结构,还会不恰当地提高普通历史内容的指令层级。


八、invoke() 的通用含义

不要把 invoke() 死记成“调用大模型”。更通用、更准确的理解是:

给当前组件一份输入,执行该组件一次,并得到输出。

不同调用对象有不同含义:

prompt.invoke(data)       # 执行 PromptTemplate:填充变量
llm.invoke(prompt_value)  # 执行模型:生成结果
chain.invoke(data)        # 执行整条 Chain:数据依次流经各组件

统一抽象:

输入 → 当前组件.invoke(...) → 输出

这也是为什么理解组件和数据流,比死背某一行代码更重要。