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

news2025/1/11 20:50:01

这里写目录标题

    • 实现上下文压缩与 MMR 的文档检索
      • 设置基于压缩的检索器与 MMR
      • 探索替代文档检索方法
      • 加载和准备文档
      • 实现 TF-IDF 和 SVM 检索器
      • 最佳实践
      • 结论
      • 理论问题
      • 实践问题

在这里插入图片描述

实现上下文压缩与 MMR 的文档检索

设置基于压缩的检索器与 MMR

上下文压缩的目标是通过关注与查询最相关的段落来提炼文档的核心。当与 MMR 策略配对时,它在检索的文档中平衡了相关性和多样性,确保了对查询主题的更广泛视角。

# 初始化上下文压缩检索器,使用 MMR 进行多样性和相关文档检索
compression_based_retriever = ContextualCompressionRetriever(
    base_compressor=document_compressor,
    base_retriever=vector_database.as_retriever(search_type="mmr")
)

# 定义一个查询来测试联合方法
query_for_insights = "有关统计分析方法的见解有哪些?"

# 使用上下文压缩检索器检索压缩文档
compressed_documents = compression_based_retriever.get_relevant_documents(query_for_insights)

# 利用辅助函数打印检索到的、压缩过的文档内容
pretty_print_documents(compressed_documents)

这种方法通过确保结果不仅相关而且多样,避免了冗余,增强了用户对主题的理解。

探索替代文档检索方法

除了基于向量的检索方法之外,LangChain 库还支持多种其他文档检索策略,如 TF-IDF 和 SVM。这些方法根据应用程序的具体要求提供了不同的优势。

加载和准备文档

在实施替代检索策略之前,重要的是要适当地加载和分割文档文本。

# 使用 PyPDFLoader 加载文档
document_loader = PyPDFLoader("docs/cs229_lectures/MachineLearning-Lecture01.pdf")
document_pages = document_loader.load()

# 将所有页面文本合并成一个字符串以便处理
complete_document_text = " ".join([page.page_content for page in document_pages])

# 使用文本分割器将完整文档文本分割成可管理的块
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=150)
text_chunks = text_splitter.split_text(complete_document_text)

实现 TF-IDF 和 SVM 检索器

文档文本准备完毕后,我们现在可以利用 TF-IDF 和 SVM 基于检索器进行文档检索。

# 初始化基于 SVM 的检索器,从文本块
svm_based_retriever = SVMRetriever.from_texts(text_chunks, embedding_function)

# 同样地,从相同的文本块初始化基于 TF-IDF 的检索器
tfidf_based_retriever = TFIDFRetriever.from_texts(text_chunks)

# 使用 SVM 检索器针对特定查询执行文档检索
query_on_major_topics = "这门课的主要话题是什么?"
svm_retrieval_results = svm_based_retriever.get_relevant_documents(query_on_major_topics)

# 使用 TF-IDF 检索器针对不同查询执行另一轮检索
query_on_specific_tool = "他们提到了哪些统计软件?"
tfidf_retrieval_results = tfidf_based_retriever.get_relevant_documents(query_on_specific_tool)

# 打印检索结果中的第一个文档作为示例
print(svm_retrieval_results[0])
print(tfidf_retrieval_results[0])

最佳实践

  • MMR 的平衡使用:在使用最大边际相关性 (MMR) 时,找到相关性和多样性的平衡至关重要。这确保了检索到的文档提供了查询主题的全面视图,同时不牺牲相关性。
  • 有效利用元数据:元数据可以显著提升搜索结果的特定性。设计并实施周密的元数据模式可以实现更有针对性的搜索,尤其是与自我查询检索技术相结合时。
  • 上下文压缩的优化:虽然上下文压缩提供了一组聚焦的信息,但它需要额外的处理。重要的是要优化这一步骤,以平衡计算成本与增加特定性和相关性的益处。
  • 文档准备的战略:对于像 TF-IDF 和 SVM 这样的替代检索方法,文档的准备和处理方式(例如,文本分块)会对结果产生重大影响。根据您的具体用途定制这些过程可以带来更高效和更准确的检索。
  • 模型和方法的选择:语言模型和检索技术的选择应根据您的数据性质和应用程序的具体需求来决定。随着新的模型和方法的出现,定期审查和更新这些选择是必要的。

结论

本章探讨了旨在增强语义搜索系统性能的各种高级检索技术。通过解决与多样性、特定性和信息相关性相关的限制,这些方法为更智能和高效的检索系统提供了一条途径。通过实际应用 MMR、自我查询检索、上下文压缩以及替代文档检索方法,开发者可以构建不仅能理解查询的语义内容,还能提供丰富、多样和有针对性的响应的系统。

遵循实施这些技术的最佳实践确保了检索系统的有效性和效率。随着自然语言处理领域的持续发展,了解最新进展在保持语义搜索能力方面的领先地位将是关键。

理论问题

  • 描述最大边际相关性 (MMR) 的原理及其在改进信息检索中的作用。
  • 自我查询检索如何应对结合了语义和元数据成分的查询挑战?
  • 解释上下文压缩在文档检索中的概念及其重要性。
  • 详细说明使用 OpenAI 的 API 和 langchain 库设置高级检索技术环境的步骤。
  • 向量数据库的初始化如何有助于有效的语义相似性搜索?
  • 描述向量数据库的填充和使用,以进行相似性和多样化搜索的目的。
  • 在高级文档检索中,使用 MMR 处理搜索结果的多样性有什么优势?
  • 如何利用元数据来增强文档检索系统中搜索结果的特定性?
  • 讨论自我查询检索器在语义搜索中的优点和实施挑战。
  • 解释上下文压缩在减少计算负载和提高检索系统响应质量方面的作用。
  • 实施高级检索技术在语义搜索系统中的主要最佳实践是什么?
  • 比较和对比基于向量的检索方法与 TF-IDF 和 SVM 等替代策略在文档检索中的有效性。
  • 集成高级检索技术如何改善语义搜索系统的性能和用户体验?
  • 讨论不断发展的自然语言处理技术对未来高级检索技术在语义搜索发展中可能产生的影响。

实践问题

  • 实现一个 Python 类 VectorDatabase,包含以下方法:
    • __init__(self, persist_directory: str):构造函数,使用持久化目录初始化向量数据库。
    • add_text(self, text: str):使用 OpenAI 的嵌入将给定文本嵌入到高维向量中,并将其存储在数据库中。假设您有权访问一个函数 openai_embedding(text: str) -> List[float],它返回嵌入向量。
    • similarity_search(self, query: str, k: int) -> List[str]:针对查询执行相似性搜索,返回数据库中与查询最相似的前 k 个文本。使用占位符相似性函数进行实现。
  • 创建一个函数 compress_document,接受一个字符串列表(文档)和一个查询字符串作为输入,并返回一个字符串列表,其中每个字符串都是文档的一个压缩段落,与查询相关。假设有一个外部实用程序函数 compress_segment(segment: str, query: str) -> str,可以根据查询压缩单个文档段落。
  • 开发一个函数 max_marginal_relevance,接受一个文档 ID 列表、一个查询和两个参数 lambda 和 k,然后返回一个基于最大边际相关性 (MMR) 选择的 k 个文档 ID 的列表。假设您有权访问一个相似性函数 similarity(doc_id: str, query: str) -> float,用于测量文档与查询之间的相似性,以及一个多样性函数 diversity(doc_id1: str, doc_id2: str) -> float,用于测量两个文档之间的多样性。
  • 编写一个函数 initialize_vector_db,演示如何使用一组预定义文本填充向量数据库,然后执行相似性搜索和多样化搜索。该函数应该输出两种搜索的结果。使用您在任务 2 中实现的 VectorDatabase 类作为向量数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tomcat的初实现与memcache

文章目录 1. tomcat实现多虚拟机2. tomcat定制访问日志格式3. tomcat实现MSM集群4. JVM垃圾回收算法和分代5. memcache使用,安装和MSM原理 1. tomcat实现多虚拟机 一键安装tomcat并启动,使用openjdk #!/bin/bash version10.1.28 usertomcat grouptomcat…

【C++初阶】:C++入门篇(一)

文章目录 前言一、C命名空间1.1 命名空间的定义1.2 命名空间的使用 二、C的输入和输出2.1 cin和cout的使用 三、缺省参数3.1 缺省参数的分类 四、函数重载4.1 函数重载概念及其条件4.2 C支持函数重载原理 -- 名字修饰 前言 C是在C语言的基础之上,增加了一些面向对象…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector

1.杨辉三角 . - 力扣&#xff08;LeetCode&#xff09; 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> arr;int i 0;int j 0;for (i…

Git入门 -- 区域详解

Git入门 – 区域详解 1.Git 1.1 Git与SVN的区别 Git不仅仅是版本控制系统&#xff0c;同时也是内容管理系统。以下是Git与SVN的区别&#xff1a; 分布式&#xff1a;Git是分布式但SVN不是&#xff0c;这是Git与其他系统的核心区别。存储方式为元数据&#xff1a;Git在存储数…

Python 如何使用正则表达式进行复杂文本处理

正则表达式&#xff08;Regular Expressions&#xff0c;简称 regex 或 RE&#xff09;是一种强大的工具&#xff0c;用于在文本中执行模式匹配和搜索操作。通过正则表达式&#xff0c;你可以轻松地查找、替换和提取文本中的特定模式。Python 提供了一个内置的 re 模块&#xf…

数据结构--树(笔记)

文章目录 1. 含义及术语2. 应用3. 常见二叉树种类① 二叉树(Binary tree)一般树和二叉树的区别 ② 完美二叉树(Perfect Binary tree)③ 完全二叉树(Complete Binary tree)④ 满二叉树(Full Binary tree)完美二叉树、完全二叉树和满二叉树 ⑤ 平衡二叉树(Balanced Binary tree)二…

基于STM32开发的智能门锁系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化密码输入与验证门锁控制与状态指示Wi-Fi通信与远程监控应用场景 家庭智能门锁办公室智能门禁系统常见问题及解决方案 常见问题解决方案结论 1. 引言 智能门锁系统通过集成键盘模块…

自学编程从哪个语言入手比较好?

自学编程时选择哪个语言作为起点&#xff0c;仍然取决于你的个人兴趣、学习目标和职业规划。希望以下建议可以帮到你。 Python&#xff1a; 如果你对数据分析、机器学习、人工智能、Web 开发或自动化脚本编写等领域感兴趣&#xff0c;Python 是一个非常好的起点。它的语法简洁…

java如何通过jdbc操作数据库

1. 安装JDBC 官网地址&#xff1a;官网地址选择 下载后&#xff0c;解压缩&#xff0c;然后将mysql-connector-j-9.0.0.jar文件放到项目目录下 编写操作数据库代码 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql…

20240819 每日AI必读资讯

&#x1f4da;AI爆料人遭全网封禁&#xff01;OpenAI等25个机构祭大招&#xff0c;一眼辨别AI机器人 - 最近半个月&#xff0c;全网被OpenAI的「AI爆料人」「草莓哥」iruletheworldmo愚弄。所有人没有等他预测的GPT-4o large模型&#xff0c;反被AI初创MultiOn创始人揭穿身份—…

Squid:概念、代理案例

目录 Squid 缓存代理 Web代理的工作机制 代理类型 传统代理 透明代理 使用代理的好处 示例和案例 Squid安装示例 使用源码包安装Squid 一些其他的安装参数&#xff08;安装用时较长&#xff09; 为什么异步io要指定线程数&#xff1f; 配置和初始化Squid 运行测试…

大咖齐聚!2024深圳eVTOL展首批发言嘉宾阵容亮相!

大咖齐聚&#xff01;2024深圳eVTOL展首批发言嘉宾阵容亮相&#xff01; 由上海市航空学会、广东省航空航天学会主办的2024深圳eVTOL产业发展大会暨低空经济展览会将于9月23-25日在深圳坪山燕子湖国际会展中心盛大召开。 2024深圳eVTOL产业发展大会由主论坛与低空经济、航电系…

一年秀一次!稚晖君的人形机器人上新了,还有开源、免费彩蛋

一年一秀&#xff0c;稚晖君的第二代人形机器人来了。 灵巧小手&#xff0c;正在麻将桌上叱咤风云&#xff1a; 不对不对&#xff0c;让我们先看看整体气质&#xff1a; 然后是常规家务&#xff0c;能看出来也是非常熟练&#xff1a; 在大模型风靡的 2024 年&#xff0c;如果说…

FreeRtos----------- 同步互斥

一、同步的缺陷&#xff1a;全局变量协同两个任务 1.建立两个任务&#xff1a;CalcTask 、LcdPrintTask xTaskCreate(CalcTask, "task1", 128, NULL, osPriorityNormal, NULL);xTaskCreate(LcdPrintTask, "task2", 128, &g_Task2Info, osPriorityNorm…

详解Element-UI el-table表格中勾选checkbox(selection)多选删除

本节讲解的是关于组件库中el-table组件多选删除功能的实现。 1.Vue文件内的引用 2.页面数据 3.存储多选数据 4. 处理多选数据 这里通过循环的方式找到数据并对数据删除&#xff0c;这种方式易于理解&#xff0c;但不一定是最优方案

springboot的自动配置和怎么做自动配置

目录 一、Condition 1、Condition的具体实现 2、Condition小结 &#xff08;1&#xff09;自定义条件 &#xff08;2&#xff09;SpringBoot 提供的常用条件注解 二、Enable注解 三、EnableAutoConfiguration 注解和自动配置 1、EnableAutoConfiguration的三个注解属性…

LLama 3 跨各种 GPU 类型的基准测试

2024 年 4 月 18 日&#xff0c;AI 社区对 Llama 3 70B 的发布表示欢迎&#xff0c;这是一款最先进的大型语言模型 &#xff08;LLM&#xff09;。该型号是 Llama 系列的下一代产品&#xff0c;支持广泛的用例。该模型 istelf 在广泛的行业平台上表现良好&#xff0c;并提供了新…

Eclipse的使用配置教程:必要设置、创建工程及可能遇到的问题(很详细,很全面,能解决90%的问题)

Eclipse的使用配置&#xff1a; Ⅰ、Eclipse 的必要配置&#xff1a;1、Eclipse 的安装&#xff1a;其一、将 Eclipse 解压或安装到没有中文且没有空格的路径下。其二、拿到 eclipse.exe 文件&#xff0c;傻瓜式安装即可; 2、设置工作空间(workspace)&#xff1a;其一、首次启动…

源头分析: 网络安全的分布式方法

部署网络可见性和网络检测和响应 (NDR) 解决方案来收集、查看和分析网络活动&#xff0c;以检测网络上的可疑和恶意活动。 这些解决方案中的大多数都是为了将数据从收集点 (或传感器) 移动到中央存储库进行分析而构建的。 这种方法有几个缺点&#xff0c;包括规模、性能、成本…

乌龟对对碰在线版

爆肝两天使用vue开发了一个在线版的乌龟对对碰小游戏之幸运对对碰。没有找到合适的乌龟素材&#xff0c;现在使用小兔子代替。 体验地址&#xff1a;幸运对对碰 | 乌龟对对碰小游戏 之前的python版本的乌龟对对碰&#xff1a;写文章-CSDN博客 乌龟对对碰-幸运对对碰