这里写目录标题
- 语义搜索:高级检索策略
- 简介
- 最大边际相关性 (MMR)
- 自我查询检索
- 上下文压缩
- 增强语义搜索的高级文档检索技术
- 引言
- 设置环境
- 导入必要的库
- 初始化向量数据库以进行相似性搜索
- 导入 Chroma 向量存储库和 OpenAI 嵌入
- 填充向量数据库
- 定义文本列表以填充数据库
- 创建小型向量数据库用于演示
- 高级检索技术
- 通过最大边际相关性 (MMR) 解决多样性问题
- 实施 MMR 的实际例子
- 利用元数据增强特定性
- 利用元数据进行针对性搜索
语义搜索:高级检索策略
简介
能够从大量数据集中准确检索相关信息对于开发智能系统(如聊天机器人和问答模型)至关重要。虽然语义搜索为此类任务提供了坚实的基础,但在某些情况下其效果可能会减弱。本章深入探讨了旨在克服这些局限性的高级检索方法,从而提高检索信息的准确性和多样性。
语义搜索仅依赖于语义相似性,可能无法始终产生最信息丰富或多样化的结果集。高级检索方法通过纳入机制来确保检索到的信息不仅相关而且多样且全面。此类技术对于处理需要细腻回答的复杂查询至关重要。
最大边际相关性 (MMR)
MMR 是一种旨在平衡相关性和多样性的技术。它通过选择那些不仅与查询语义相近,而且彼此之间也多样化的文档。这种做法在提供广泛的信息对于充分回答查询至关重要的场景中特别有用。
该过程涉及首先基于语义相似性获取较大数量的文档。然后,从这个集合中根据文档与查询的相关性及其与其他已选文档的差异性来选择文档。这种方法确保最终的文档集为查询主题提供了全面的视角。
自我查询检索
自我查询检索擅长处理既包含语义元素又包含元数据成分的查询。例如,一个询问关于1980年制作的外星人电影的查询结合了一个语义元素(“关于外星人的电影”)和一个元数据过滤器(“1980年制作”)。此方法将查询拆分为这两个部分,使用语义搜索处理前者,并使用元数据过滤处理后者。
上下文压缩
上下文压缩涉及从检索到的文档中提取最相关的段落。当整个文档并非回答查询所必需时,这种技术尤其有价值,因为它聚焦于最相关的信息。
该方法通常需要额外的处理,因为必须分析每个检索到的文档以识别和提取相关部分。虽然这可能会增加计算成本,但它显著提高了对查询的回答质量和具体性。
增强语义搜索的高级文档检索技术
引言
从大量文档中检索相关信息是检索增强生成 (RAG) 工作流程中的关键步骤,尤其是在聊天机器人和问答系统的应用中。本章探讨了改进基本语义搜索的高级检索技术,解决了常见的边缘案例,并增强了结果的多样性和特定性。
设置环境
在深入了解核心功能之前,设置工作环境至关重要。这包括加载必要的库和配置对外部服务的访问,例如 OpenAI 的 API 用于生成嵌入。以下是完成此设置的逐步指南:
导入必要的库
import os
import openai
import sys
# 将根目录添加到 sys.path 以确保正确导入相对路径
sys.path.append('../..')
# 从 .env 文件加载环境变量以安全管理 API 密钥
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
# 从环境变量设置 OpenAI API 密钥
openai.api_key = os.environ['OPENAI_API_KEY']
初始化向量数据库以进行相似性搜索
我们的目标是创建一个可以基于语义相似性高效检索信息的向量数据库。这涉及使用 OpenAI 的嵌入将文本内容嵌入高维向量空间。以下是初始化此类数据库的方法:
导入 Chroma 向量存储库和 OpenAI 嵌入
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings
# 指定向量数据库将持久化数据的目录
persist_directory = 'vector_db/chroma/'
# 初始化使用 OpenAI 模型的嵌入函数
embedding_function = OpenAIEmbeddings()
# 创建 Chroma 向量数据库实例,指定持久化目录和嵌入函数
vector_database = Chroma(
persist_directory=persist_directory,
embedding_function=embedding_function
)
# 打印向量数据库当前条目的数量以验证其准备就绪
print(vector_database._collection.count())
填充向量数据库
接下来,我们填充向量数据库,使用一组文本数据来展示相似性搜索的能力。
定义文本列表以填充数据库
# 定义一系列文本填充数据库
texts = [
"死亡帽蘑菇具有显著的大子实体,常在地表上被发现。",
"在蘑菇中,死亡帽以其大的子实体而突出,有时会呈现全白色。",
"死亡帽,以其毒性著称,是最危险的蘑菇之一。",
]
创建小型向量数据库用于演示
# 使用提供的文本创建较小的向量数据库以供演示之用
demo_vector_database = Chroma.from_texts(texts, embedding_function=embedding_function)
# 定义一个查询,在向量数据库中进行搜索
query_text = "讨论特征为显著白色子实体的蘑菇"
# 对查询执行相似性搜索,检索前2个最相关的结果
similar_texts = demo_vector_database.similarity_search(query_text, k=2)
print("相似性搜索结果:", similar_texts)
# 执行最大边际相关性搜索以找到多样化但仍相关的结果,检索更多的候选结果以进行比较
diverse_texts = demo_vector_database.max_marginal_relevance_search(query_text, k=2, fetch_k=3)
print("多样化搜索结果:", diverse_texts)
高级检索技术
通过最大边际相关性 (MMR) 解决多样性问题
在检索系统中一个常见的挑战是确保搜索结果不仅是相关的,而且是多样化的。这样可以防止重复信息的主导地位,并为查询的主题提供更广阔的视角。最大边际相关性 (MMR) 算法通过在查询的相关性和结果之间的多样性之间取得平衡来解决这一问题。
实施 MMR 的实际例子
# 定义一个寻求信息的查询
query_for_information = "有关数据分析工具的见解有哪些?"
# 执行标准相似性搜索以查找前3个相关文档
top_similar_documents = vector_database.similarity_search(query_for_information, k=3)
# 显示前两个文档的内容开头以进行对比
print(top_similar_documents[0].page_content[:100])
print(top_similar_documents[1].page_content[:100])
# 注意潜在的信息重叠。为了引入多样性,我们应用 MMR。
diverse_documents = vector_database.max_marginal_relevance_search(query_for_information, k=3)
# 显示前两个多样化文档的内容开头以观察区别
print(diverse_documents[0].page_content[:100])
print(diverse_documents[1].page_content[:100])
这段代码展示了标准相似性搜索结果与使用 MMR 获得的结果之间的对比。通过使用 MMR,我们确保检索到的文档不仅相关,还提供了关于查询的不同视角。
利用元数据增强特定性
向量数据库通常包含丰富的元数据,这些元数据可以被利用来进一步细化搜索查询。元数据提供了额外的上下文,使得可以基于特定的标准过滤结果。
利用元数据进行针对性搜索
# 定义一个带有特定上下文的查询
specific_query = "第三讲中有关回归分析的讨论有哪些?"
# 使用元数据过滤器执行相似性搜索以定位来自特定讲座的文档
targeted_documents = vector_database.similarity_search(
specific_query,
k=3,
filter={"source": "documents/cs229_lectures/MachineLearning-Lecture03.pdf"}
)
# 遍历结果以显示它们的元数据,突出搜索的特定性
for document in targeted_documents:
print(document.metadata)