【大模型从入门到精通30】开源库框架LangChain 语义搜索:高级检索策略4


在这里插入图片描述

理论

最大边际相关性 (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()
  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水木流年追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值