RETRIEVAL-AUGMENTED GENERATION · 03
认识 LangChain、LLM、Chat Model、Embedding Model、消息结构与 invoke 调用方式。
- LangChain
- Models
- Messages
本文目录
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(...) → 输出
这也是为什么理解组件和数据流,比死背某一行代码更重要。