前言
该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial
我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容
这是教程清单
- 1.初试langchain
- 2.prompt
- 3.OutputParser/输出解析
- 4.model/vllm模型部署和langchain调用
- 5.DocumentLoader/多种文档加载器
- 6.TextSplitter/文档切分
- 7.Embedding/文本向量化
- 8.VectorStore/向量数据库存储和检索
- 9.Retriever/检索器
- 10.Reranker/文档重排序
- 11.RAG管道/多轮对话RAG
- 12.Agent/工具定义/Agent调用工具/Agentic RAG
VectorStore-backed Retriever
基于VectorStore的检索器 是一种文档检索系统,它利用向量存储根据文档的向量表示来进行搜索。这种方法使得基于相似度的搜索变得高效,特别适用于处理非结构化数据。
RAG系统中的文档搜索和响应生成步骤包括:
- 文档加载:导入原始文档。
- 文本切分:将文本切分成可管理的块。
- 向量嵌入:使用嵌入模型将文本转换为数值向量。
- 存储到向量数据库:将生成的嵌入向量存储到向量数据库中,以便高效检索。
在查询阶段:
- 流程:用户查询 → 嵌入 → 在向量存储中搜索 → 检索相关块 → LLM生成响应
- 用户的查询被转化为一个嵌入向量,使用嵌入模型。
- 该查询嵌入向量与向量数据库中存储的文档向量进行比较,以 检索最相关的结果。
- 检索到的文档块被传递给大语言模型(LLM),该模型基于检索到的信息生成最终响应。
import faiss
from langchain_core.documents import Document
from langchain_community.vectorstores import FAISS
from langchain_community.docstore.in_memory import InMemoryDocstore
from langchain_openai import OpenAIEmbeddings
openai_embedding = OpenAIEmbeddings(
model="bge-m3",
base_url='http://localhost:9997/v1',
api_key='cannot be empty',
# dimensions=1024,
)
embed_dim = len(openai_embedding.embed_query("hello world"))
texts = [
"AI helps doctors diagnose diseases faster, improving patient outcomes.",
"AI can analyze medical images to detect conditions like cancer.",
"Machine learning predicts patient outcomes based on health data.",
"AI speeds up drug discovery by predicting the effectiveness of compounds.",
"AI monitors patients remotely, enabling proactive care for chronic diseases.",
"AI automates administrative tasks, saving time for healthcare workers.",
"NLP extracts insights from electronic health records for better care.",
"AI chatbots help with patient assessments and symptom checking.",
"AI improves drug manufacturing, ensuring better quality and efficiency.",
"AI optimizes hospital operations and reduces healthcare costs."
]
documents = [
Document(text, metadata={
"source":text})
for text in texts
]
db = FAISS.from_documents(documents, openai_embedding)
一旦向量数据库创建完成,就可以使用检索方法,如 相似度搜索 和 最大边际相关性(MMR),加载并查询数据库,从中搜索相关的文本。
as_retriever
方法允许你将一个向量数据库转换为一个检索器,从而实现从向量库中高效地搜索和检索文档。
工作原理:
as_retriever()
方法将一个向量库(如 FAISS)转换为一个检索器对象,使其与 LangChain 的检索工作流兼容。- 这个检索器可以直接用于 RAG 流水线,或与大型语言模型(LLM)结合,用于构建智能搜索系统。
retriever = db.as_retriever()
高级检索器配置
as_retriever
方法允许你配置高级检索策略,如 相似度搜索、最大边际相关性(MMR) 和 基于相似度分数阈值的过滤。
参数:
**kwargs
:传递给检索函数的关键字参数:search_type
:指定搜索方法。"similarity"
:基于余弦相似度返回最相关的文档。"mmr"
:利用最大边际相关性算法,平衡 相关性 和 多样性。"similarity_score_threshold"
:返回相似度分数超过指定阈值的文档。
search_kwargs
:其他用于微调结果的搜索选项:k
:返回的文档数量(默认值:4
)。score_threshold
:用于"similarity_score_threshold"
搜索类型的最小相似度分数(例如:0.8
)。fetch_k
:在 MMR 搜索过程中最初检索的文档数量(默认值:20
)。lambda_mult
:控制 MMR 结果中的多样性(0
= 最大多样性,1
= 最大相关性,默认值:0.5
)。filter
:用于选择性文档检索的元数据过滤。
返回值:
VectorStoreRetriever
:初始化后的检索器对象,可以直接用于文档搜索任务。
注意事项:
- 支持多种搜索策略(
similarity
、MMR
、similarity_score_threshold
)。 - MMR 通过减少结果中的冗余,提升结果多样性同时保持相关性。
- 元数据过滤使得根据文档属性选择性地检索文档成为可能。
tags
参数可以用于给检索器加标签,以便更好地组织和识别。
警告:
- 使用 MMR 时的多样性控制:
- 小心调整
fetch_k
(最初检索的文档数量)和lambda_mult
(多样性控制因子)以获得最佳平衡。 lambda_mult
:- 较低值(< 0.5)→ 优先考虑多样性。
- 较高值(> 0.5)→ 优先考虑相关性。
- 为有效的多样性控制,设置
fetch_k
大于k
。
- 小心调整
- 阈值设置:
- 使用较高的
score_threshold
(例如 0.95)可能会导致没有结果。
- 使用较高的
- 元数据过滤:
- 在应用过滤器之前,确保元数据结构已经定义好。
- 平衡配置:
- 为了获得最佳的检索性能,保持
search_type
和search_kwargs
设置之间的适当平衡。
- 为了获得最佳的检索性能,保持
retriever = db.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={
"k": 5, # Return the top 5 most relevant documents
"score_threshold": 0.5 # Only return documents with a similarity score of 0.4 or higher
}
)
query = "How does AI improve healthcare?"
results = retriever.invoke(query)
# Display search results
for doc in results:
print(doc.page_content)
No relevant docs were retrieved using the relevance score threshold 0.5
检索器的 invoke()
方法
invoke()
方法是与检索器交互的主要入口点。它用于根据给定的查询搜索并检索相关的文档。
工作原理:
- 查询提交:用户提交查询字符串作为输入。
- 嵌入生成:如果需要,查询会被转换成向量表示。
- 搜索过程:检索器使用指定的搜索策略(如相似度、MMR 等)在向量数据库中进行搜索。
- 结果返回:该方法返回一组相关的文档片段。
参数:
-
input
(必需):- 用户提供的查询字符串。
- 查询会被转换成向量,并与存储的文档向量进行相似度比较,以进行基于相似度的检索。
-
config
(可选):- 允许对检索过程进行细粒度控制。
- 可用于指定 标签、元数据插入和搜索策略。
-
**kwargs
(可选):- 允许直接传递
search_kwargs
进行高级配置。 - 示例选项包括:
k
:返回的文档数量。score_threshold
:文档被包括的最低相似度分数。fetch_k
:MMR 搜索中最初检索的文档数量。
- 允许直接传递
返回值:
List[Document]
:- 返回包含检索到的文本和元数据的文档对象列表。
- 每个文档对象包括:
page_content
:文档的主要内容。metadata
:与文档相关联的元数据(例如,来源、标签)。
用例 1
docs = retriever.invoke("What is an embedding?")
for doc in docs:
print(doc.page_content)
print("=========================================================")
Machine learning predicts patient outcomes based on health data.
=========================================================
AI monitors patients remotely, enabling proactive care for chronic diseases.
=========================================================
AI chatbots help with patient assessments and symptom checking.
=========================================================
用例 2
# search options: top 5 results with a similarity score ≥ 0.7
docs = retriever.invoke(
"What is a vector database?",
search_kwargs={
"k": 5, "score_threshold": 0.7}