这里写目录标题
理论
最大边际相关性 (MMR)
最大边际相关性 (MMR) 设计用于优化文档检索中的相关性和多样性之间的平衡。它选取既与查询紧密相关又彼此不同的文档,从而增强了所提供的信息广度。
自我查询检索
自我查询检索有效地处理涉及语义内容和特定元数据的查询,通过将查询拆分为语义和元数据组件,能够生成精确且具有上下文相关性的搜索结果。
上下文压缩
上下文压缩针对提取文档中最相关的部分,专注于提供回答查询所需的信息核心,从而提高了响应的质量并减少了不必要的计算负担。
设置环境
设置环境包括加载必要的库、配置对 API(如 OpenAI 的 API 用于嵌入)的访问,并初始化向量数据库。这一基础步骤确保系统具备有效执行高级检索功能的能力。
初始化向量数据库
初始化向量数据库涉及将文本内容嵌入到高维空间中,以促进有效的语义相似性搜索。这种设置允许根据文本与查询的语义接近程度快速准确地检索文档。
填充向量数据库
向量数据库的填充涉及添加文本内容,并使用相似性搜索找到与查询密切相关的文档。多样化搜索(由 MMR 支持)进一步细化结果,以确保覆盖广泛的信息范围。
在文档检索中使用 MMR
在文档检索中使用 MMR 提升了多样性,防止了类似文档在搜索结果中的聚集。这种方法确保了更广泛的视角和信息,使检索过程更具信息量且不冗余。
利用元数据
元数据通过允许超出语义内容的搜索,针对特定文档属性(如发布日期或文档类型),提高了搜索的特定性,从而产生了更精确且相关的搜索结果。
自我查询检索器
自我查询检索器自动化地从用户输入中提取语义查询和相关元数据,简化了搜索过程,使其更加用户友好,同时也确保了结果能够准确地适应查询的上下文。
上下文压缩
上下文压缩通过集中于文档中最相关部分,提高了检索效率。这不仅精简了呈现给用户的信息,还通过减少处理的数据量节省了计算资源。
最佳实践
最佳实践包括平衡使用 MMR 来提高多样性、有效利用元数据以提高特定性、优化上下文压缩以平衡信息相关性和计算效率,以及为检索战略性地准备文档。
基于向量的方法
基于向量的方法在语义相似性搜索中非常有效,但在某些情况下可能缺乏特定性。替代方法,如 TF-IDF 和 SVM,提供了不同的优势,比如更好地处理基于特定关键词的搜索或分类任务。
集成高级检索技术
集成高级检索技术显著增强了语义搜索系统,通过提供更精确、多样和上下文相关的信息,改善了用户与智能系统的交互体验。
自然语言处理技术的发展
自然语言处理技术的持续发展承诺将进一步改进检索技术,可能引入更复杂的方法来理解和响应复杂的查询,从而维持向更智能和直观的搜索能力的进步。
实践
# 导入必要的包
from typing import List, Tuple
import numpy as np
# 占位符函数,用于 OpenAI 的嵌入
def openai_embedding(text: str) -> List[float]:
# 此函数会调用 OpenAI API 获取文本的嵌入
# 为了演示目的,返回一个随机向量
return np.random.rand(768).tolist()
# 占位符相似性函数,计算两个向量之间的余弦相似性
def cosine_similarity(vec1: List[float], vec2: List[float]) -> float:
# 将列表转换为 numpy 数组
vec1 = np.array(vec1)
vec2 = np.array(vec2)
# 计算余弦相似性
return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
# 向量数据库类
class VectorDatabase:
def __init__(self, persist_directory: str):
self.persist_directory = persist_directory
self.database = [] # 用于存储 (text, embedding) 元组
def add_text(self, text: str):
# 为文本生成嵌入
embedding = openai_embedding(text)
# 将文本及其嵌入存储在数据库中
self.database.append((text, embedding))
def similarity_search(self, query: str, k: int) -> List[str]:
query_embedding = openai_embedding(query)
# 计算数据库中所有文档与查询的相似性分数
similarities = [(text, cosine_similarity(query_embedding, embedding)) for text, embedding in self.database]
# 根据相似性分数降序排序文档
sorted_similarities = sorted(similarities, key=lambda x: x[1], reverse=True)
# 返回最相似的前 k 个文本
return [text for text, _ in sorted_similarities[:k]]
# 示例使用
if __name__ == "__main__":
# 使用一个虚拟的目录路径初始化向量数据库
vector_db = VectorDatabase("path/to/persist/directory")
# 向数据库添加一些文本
vector_db.add_text("敏捷的棕色狐狸跳过了懒惰的狗。")
vector_db.add_text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
vector_db.add_text("Python 是一种广泛用于数据科学的编程语言。")
# 执行相似性搜索
query = "Python 编程"
similar_texts = vector_db.similarity_search(query, 2)
print("相似性搜索结果:", similar_texts)
def compress_segment(segment: str, query: str) -> str:
# 占位符函数,根据查询压缩一个段落
# 应返回一个与查询相关的段落的较短版本
return segment[:len(segment) // 2] # 模拟实现
def compress_document(document: List[str], query: str) -> List[str]:
compressed_document = [compress_segment(segment, query) for segment in document]
return compressed_document
# 示例使用 compress_document
document = [
"第一章介绍了机器学习的概念。",
"机器学习技术各不相同,服务于不同的目的。",
"在数据分析的背景下,回归模型可以预测连续的结果。"
]
query = "机器学习"
compressed_doc = compress_document(document, query)
print("压缩后的文档段落:", compressed_doc)
def similarity(doc_id: str, query: str) -> float:
# 占位符函数,计算文档与查询之间的相似性
return 0.5 # 模拟实现
def diversity(doc_id1: str, doc_id2: str) -> float:
# 占位符函数,计算两个文档之间的多样性
return 0.5 # 模拟实现
def max_marginal_relevance(doc_ids: List[str], query: str, lambda_param: float, k: int) -> List[str]:
selected = []
remaining = doc_ids.copy()
while len(selected) < k and remaining:
mmr_scores = {doc_id: lambda_param * similarity(doc_id, query) -
(1 - lambda_param) * max([diversity(doc_id, sel) for sel in selected] or [0])
for doc_id in remaining}
next_selected = max(mmr_scores, key=mmr_scores.get)
selected.append(next_selected)
remaining.remove(next_selected)
return selected
# 示例使用 max_marginal_relevance
doc_ids = ["doc1", "doc2", "doc3"]
query = "数据分析"
selected_docs = max_marginal_relevance(doc_ids, query, 0.5, 2)
print("选定的文档:", selected_docs)
def initialize_vector_db():
# 初始化向量数据库
vector_db = VectorDatabase("path/to/persist/directory")
# 定义一些示例文本
texts = [
"敏捷的棕色狐狸跳过了懒惰的狗。",
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"Python 是一种广泛用于数据科学的编程语言。"
]
# 向数据库填充文本
for text in texts:
vector_db.add_text(text)
# 执行相似性搜索
query = "数据科学"
similar_texts = vector_db.similarity_search(query, 2)
print("相似性搜索结果:", similar_texts)
# 为了演示多样化搜索,这里重用了 similar_texts 并附带解释
# 在实际场景中,这会涉及到应用 MMR 或其他提高多样性的方法
# 这里只是为了展示如何在实现之后调用此类函数
print("多样化搜索结果 (模拟):", similar_texts)
# 运行演示
initialize_vector_db()