学习并掌握 LangChain 检索器的作用,实现让 LLM 动态调用知识库功能

目录

一、前言

[一、为什么 LLM 需要 Retriever](#一、为什么 LLM 需要 Retriever)

[二、Retriever 的本质](#二、Retriever 的本质)

[三、Retriever 工作流程](#三、Retriever 工作流程)

[四、Retriever 与数据库查询的区别](#四、Retriever 与数据库查询的区别)

[五、Retriever 的核心思想](#五、Retriever 的核心思想)

[六、Retriever 与 Embedding 的关系](#六、Retriever 与 Embedding 的关系)

[七、LangChain 中创建 Retriever](#七、LangChain 中创建 Retriever)

[八、Retriever 检索数据](#八、Retriever 检索数据)

[九、Retriever 工作原理](#九、Retriever 工作原理)

[十、Top-K 检索](#十、Top-K 检索)

十一、相似度检索

[十二、MMR 检索策略](#十二、MMR 检索策略)

[十三、Score Threshold 检索](#十三、Score Threshold 检索)

[十四、构建 RAG 检索链](#十四、构建 RAG 检索链)

[十五、LCEL 结合 Retriever](#十五、LCEL 结合 Retriever)

[十六、Retriever 在 RAG 中的位置](#十六、Retriever 在 RAG 中的位置)

[十七、Retriever 与 Agent 的结合](#十七、Retriever 与 Agent 的结合)

十八、企业项目最佳实践

十九、面试高频问题

[什么是 Retriever?](#什么是 Retriever?)

[Retriever 和 Embedding 的区别?](#Retriever 和 Embedding 的区别?)

[Retriever 和数据库查询区别?](#Retriever 和数据库查询区别?)

[Retriever 在 RAG 中作用是什么?](#Retriever 在 RAG 中作用是什么?)

[MMR 检索有什么作用?](#MMR 检索有什么作用?)

二十、总结


一、前言

在学习 LangChain 和 RAG(检索增强生成)时,经常会遇到一个核心组件:

复制代码
Retriever

很多初学者会产生疑问:

复制代码
Retriever 是什么?

为什么已经有向量数据库了还需要 Retriever?

Retriever 和 Embedding 有什么关系?

Retriever 如何帮助 LLM 查询知识库?

实际上:

复制代码
Embedding 负责理解语义

VectorDB 负责存储向量

Retriever 负责查找知识

可以说:

Retriever 是连接 LLM 和知识库之间最重要的一座桥梁。

本文将带你彻底理解:

复制代码
什么是 Retriever

Retriever 的作用

Retriever 的工作原理

LangChain 中如何使用 Retriever

Retriever 与向量数据库的关系

如何实现动态知识库问答

一、为什么 LLM 需要 Retriever

先看一个问题:

复制代码
公司的报销流程是什么?

如果直接问 LLM:

python 复制代码
response = llm.invoke(
    "公司的报销流程是什么?"
)

模型会出现两种情况:

复制代码
知道答案

或者:

复制代码
胡乱猜测(幻觉)

因为:

复制代码
公司内部制度

企业知识库

最新文档

业务数据

根本不在模型训练数据中。


所以需要:

复制代码
先找到相关资料

再让模型回答

这就是:

复制代码
Retriever

存在的意义。


二、Retriever 的本质

Retriever 翻译:

复制代码
检索器

本质职责:

复制代码
根据用户问题

从知识库中

找出最相关内容

例如:

用户:

复制代码
Spring IOC 是什么?

知识库:

复制代码
文档1:Spring IOC

文档2:Redis

文档3:MySQL

Retriever:

复制代码
返回文档1

然后交给:

复制代码
LLM

生成答案。


三、Retriever 工作流程

整体架构:

流程:

复制代码
用户提问

↓

Retriever检索

↓

获取相关文档

↓

拼接Prompt

↓

LLM生成答案

四、Retriever 与数据库查询的区别

传统数据库:

sql 复制代码
SELECT *
FROM employee
WHERE name='张三'

依赖:

复制代码
精确匹配

Retriever:

复制代码
语义匹配

例如:

知识库:

复制代码
Spring IOC 是控制反转思想

用户:

复制代码
Spring 如何实现依赖注入?

虽然:

复制代码
IOC

依赖注入

不是同一个词。

但语义相关。

Retriever 仍然能找到。


五、Retriever 的核心思想

本质:

复制代码
问题

↓

Embedding

↓

向量

↓

相似度计算

↓

最相关文档

架构:


六、Retriever 与 Embedding 的关系

很多人容易混淆:

复制代码
Embedding

Retriever

实际上:

组件 职责
Embedding 文本转向量
Vector DB 存储向量
Retriever 查询向量

关系:


七、LangChain 中创建 Retriever

首先创建向量库。

python 复制代码
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

db = Chroma.from_texts(
    [
        "Spring IOC 是控制反转",
        "Redis 是内存数据库",
        "MySQL 是关系型数据库"
    ],
    embeddings
)

将 VectorDB 转换为 Retriever:

python 复制代码
retriever = db.as_retriever()

就这么简单。


八、Retriever 检索数据

示例:

python 复制代码
docs = retriever.invoke(
    "Spring 如何实现依赖注入"
)

print(docs)

结果:

复制代码
Spring IOC 是控制反转

因为:

复制代码
语义最接近

九、Retriever 工作原理

执行:

python 复制代码
retriever.invoke(
    question
)

背后发生:

复制代码
sequenceDiagram

User->>Retriever: Question

Retriever->>Embedding: 向量化

Embedding->>VectorDB: 查询

VectorDB->>Retriever: TopK文档

Retriever->>User: 返回结果

十、Top-K 检索

默认:

复制代码
返回最相关文档

实际上可以:

复制代码
返回前K条

例如:

python 复制代码
retriever = db.as_retriever(
    search_kwargs={
        "k":3
    }
)

表示:

复制代码
返回前三条结果

十一、相似度检索

Retriever 默认:

复制代码
Similarity Search

即:

复制代码
余弦相似度

公式:

复制代码
Similarity
=
(A·B)
/
(|A|×|B|)

含义:

复制代码
越接近1

越相似

十二、MMR 检索策略

问题:

复制代码
Top3结果可能高度重复

例如:

复制代码
Spring教程1

Spring教程2

Spring教程3

信息重复。


因此:

复制代码
MMR

出现。

全称:

复制代码
Max Marginal Relevance

最大边际相关性。

作用:

复制代码
既相关

又多样化

配置:

复制代码
retriever = db.as_retriever(
    search_type="mmr"
)

十三、Score Threshold 检索

有时候:

复制代码
找不到相关内容

也不应该返回。

例如:

用户:

复制代码
如何做红烧肉

知识库:

复制代码
Java

Spring

Redis

显然不相关。


配置:

python 复制代码
retriever = db.as_retriever(
    search_type="similarity_score_threshold",
    search_kwargs={
        "score_threshold":0.8
    }
)

含义:

复制代码
低于0.8

直接丢弃

十四、构建 RAG 检索链

最经典流程:


代码:

python 复制代码
docs = retriever.invoke(question)

context = "\n".join(
    doc.page_content
    for doc in docs
)

prompt = f"""
请根据资料回答问题:

资料:

{context}

问题:

{question}
"""

answer = llm.invoke(prompt)

十五、LCEL 结合 Retriever

LangChain 推荐:

复制代码
LCEL

写法。

python 复制代码
chain = (
    retriever
    | prompt
    | llm
)

架构:

代码更优雅。


十六、Retriever 在 RAG 中的位置

完整 RAG:

可以看到:

复制代码
Retriever
是RAG最核心组件之一

十七、Retriever 与 Agent 的结合

现代 Agent:

不仅能调用:

复制代码
搜索引擎

数据库

API

也能调用:

复制代码
Retriever

作为工具。

架构:


这样 Agent 就拥有:

复制代码
企业知识查询能力

十八、企业项目最佳实践

推荐组合:

复制代码
OpenAI Embedding

+

Chroma/Milvus

+

Retriever

+

LangChain

+

GPT

架构:


十九、面试高频问题

什么是 Retriever?

复制代码
用于从知识库检索相关文档的组件

Retriever 和 Embedding 的区别?

复制代码
Embedding负责向量化

Retriever负责查询

Retriever 和数据库查询区别?

复制代码
数据库是关键词匹配

Retriever是语义匹配

Retriever 在 RAG 中作用是什么?

复制代码
负责检索上下文知识

MMR 检索有什么作用?

复制代码
避免结果高度重复

二十、总结

Retriever 是 LangChain RAG 体系中的核心组件。

它解决的问题是:

复制代码
如何让 LLM 从海量知识库中找到最相关的信息

整个流程可以概括为:

复制代码
用户问题
      ↓
Retriever
      ↓
知识库检索
      ↓
相关文档
      ↓
LLM生成答案

可以这样理解:

复制代码
Embedding
负责理解问题

VectorDB
负责保存知识

Retriever
负责寻找知识

LLM
负责组织答案

因此:

如果说 Embedding 是知识库的索引技术,那么 Retriever 就是知识库的搜索引擎。

掌握 Retriever 后,你就真正进入了 RAG 与企业知识库系统开发的核心领域,为后续学习 Multi Retriever、Hybrid Search、Self Query Retriever、Agent Tool Calling 等高级技术打下坚实基础。

相关推荐
朱大喜几秒前
AI 数据分析实战:大模型驱动的自动化报表生成,从数据到洞察的工程化链路
人工智能
ptc学习者2 分钟前
python 中描述符@property property 大概的样子
开发语言·python
zmzb01033 分钟前
Python课后习题训练记录Day129
开发语言·python
心之伊始9 分钟前
Spring AI Tool Calling 实战:让 Java Agent 调用本地 Bean 工具方法
java·spring boot·agent·spring ai·tool calling
wb0430720111 分钟前
阿明的二次创业——从阿明用 AI 开第二家店,看 AI 原生创业的四阶段方法论
大数据·人工智能·架构
Godspeed Zhao12 分钟前
Level 4自动驾驶系统设计0——功能与场景0
人工智能·机器学习·自动驾驶
Dola_Zou15 分钟前
边缘智能的“黑暗森林”:工业 AI 模型下沉的资产防护与变现密码
人工智能·安全·自动化·软件工程·软件加密
青岛前景互联信息技术有限公司15 分钟前
前景互联·新一代智能接处警系统:AI+大模型+Agent智能接处警一体化解决方案
大数据·人工智能·物联网
举个栗子。16 分钟前
AI智能体教程合集
ai
xin_yao_xin18 分钟前
Claude Code 安装与 DeepSeek-V4 模型配置(2026 最新)
人工智能·ai·大模型·deepseek·claude code