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

news2024/11/15 11:10:12

这里写目录标题

  • 语义搜索:高级检索策略
    • 简介
    • 最大边际相关性 (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)

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

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

相关文章

基于YOLOv8-pose的手部关键点检测(3)- 实现实时手部关键点检测

目录 前言 1.扩大检测框区域 2.先检测手部,后检测手部关键点 3.正面视角检测 4.侧面视角检测 5.摄像头视角检测 6.遮挡视角检测 7.结论 前言 使用YOLOv8-m对图像进行手部检测,然后扩大检测框区域,并对该区域使用YOLOv8-s-pose使用关键…

达梦数据库版本介绍

达梦数据库根据不同用户的不同需求,提供了三种版本的数据库:DM Standard Edition 标准版、DM Enterprise Edition 企业版、DM Security Edition 安全版。那么这三种版本有什么区别,我们该如何选择合适的版本?下面先介绍三种版本各…

【笔记】泰山派环境配置遇到E: Unable to locate package repo

答案来自通义千问,解决了我的问题,做一些记录 你尝试在Ubuntu或Debian系统上使用apt命令安装repo工具,但是遇到了问题,因为repo不是直接在软件源中作为一个独立的包提供的。repo是Google的一个Git仓库管理工具,通常用…

【系统架构设计】系统性能评价(二)

【系统架构设计】系统性能评价(二) 性能指标性能计算性能设计阿姆达尔解决方案负载均衡 性能评估基准测试程序Web 服务器的性能评估 性能指标 性能计算 性能设计 阿姆达尔解决方案 阿姆达尔定律: 系统中对某部件采用某种更快的执行方式&a…

Centos8和stream 9防火墙基本使用

查发行版: [rootlocalhost nps-0.26.10]# cat /etc/redhat-releaseCentOS Stream release 9查看防火墙状态 systemctl status firewalld firewall-cmd --state开启/关闭/重启防火墙 systemctl start firewalld[rootlocalhost conf]# systemctl start firewalld …

Eureka原理与实践:深入探索微服务架构的核心组件

在微服务架构日益盛行的今天,服务之间的注册与发现成为了保证系统高可用性和灵活性的关键。Eureka,作为Netflix开源的服务注册与发现框架,凭借其简单、健壮的特性,在微服务领域占据了举足轻重的地位。本文将深入剖析Eureka的原理&…

ubuntu 24.04 安装 Nvidia 显卡驱动 + CUDA + cuDNN,配置 AI 深度学习训练环境,简单易懂,一看就会!

ubuntu 24.04 安装 Nvidia 显卡驱动 CUDA cuDNN,配置 AI 深度学习训练环境,简单易懂,一看就会! 1.查看本机显卡型号 lspci | grep -i nvidia输出如下: 01:00.0 3D controller: NVIDIA Corporation GM108M [GeForc…

焦虑迷雾中的幻觉挑战?专家教你如何拨云见日!

在这个快节奏、高压力的时代,焦虑症已成为许多人难以言说的秘密。它不仅让人心情沉重,更有可能在极端情况下引发幻觉,仿佛置身于一个光怪陆离、难以分辨真假的世界。面对这样的困境,我们该如何自救,如何找到那束穿透焦…

ansible【自动化配置】(thirty day)

回顾 1、mysql和python (1)不需要执行mysql_ssl_rsa_setup (2)Change_master_to.不需要get public key 2、可以使用pymysql非交互的管理mysql (1)connpymysql.connect(host,user,password,database,prot) …

OpenCV图像处理——积分图像计算(C++/Python)

概述 积分图像是一种高效的图像处理技术,最初由Crow在1984年提出,目的是为了提高多尺度透视投影的渲染速度。它通过构建一个积分图,使得图像中任意矩形区域的像素和能够在常数时间内快速计算出来,极大地减少了在图像模糊、边缘提…

WARNING: There was an error checking the latest version of pip. 解决方案

WARNING: There was an error checking the latest version of pip. 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开…

【单片机】51单片机入门教程(二):定时器的模式详解与中断应用实例

文章目录 51单片机定时器教程:模式详解与中断应用实例1. 介绍2. 51单片机定时器/计数器概述3. 定时器控制寄存器与中断入口4. 模式0:13位定时器/计数器5. 模式1:16位定时器/计数器6. 模式2:8位自动重装载定时器/计数器7. 模式3:分割两个独立的8位定时器/计数器8. 总结51单…

Vue.js入门系列(十):深入理解Vue指令及自定义指令的使用

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

【技术前沿】MetaGPT入门安装部署——用多个大语言模型解决任务!一键安装,只需填写OpenAI API

项目简介 MetaGPT 是一个多智能体框架,旨在构建全球首家 “AI 软件公司”。该项目通过为 GPT 分配不同的角色,模拟产品经理、架构师、工程师等职业,协同完成复杂的软件开发任务。MetaGPT 将一个简单的需求转化为完整的软件开发流程&#xff…

点接触导致Fluent Meshing网格划分出错的处理

问题概述 在CFD建模中,几何处理有时会出现两个面是单点接触的情形。 举例如下图所示,在球形计算域内部,存在分别用黄色和粉红色标记的内部悬浮面,两者接触区域为一个点,而非一条曲线。 上述几何模型可正确的导入Flue…

从零搭建xxl-job(四):xxljob进行一些性能优化

之前的代码这部分并没有补充完毕,假如调度中心如果判断有定时任务要执行了,该怎么远程通知给执行定时任务的程序呢?当定时任务要把自己的信息发送给调度中心时,是通过一个RegistryParam对象发送的。该对象内部封装了定时任务相关的…

鸿蒙自定义Tab,可居左显示

最近写鸿蒙项目时,需要用到类似Android的TabLayout控件,鸿蒙官方也有提供类似实现的组件Tabs。但是官方Tabs组件,实在有点鸡肋,首先 TabContent和 TabBar是绑定在一起的放在Tabs里面的,如果UI是TabBar的背景是一个整体…

可视化大屏入口界面,炫酷科技又不失简洁时尚。

可视化大屏界面,大家见到很多了,当可视化大屏是多个系统的融合,而且彼此又相互独立,就需要设计一个入口页面,便于分流客户,这次我给大家分享一批。 设计可视化大屏入口界面时,可以结合炫酷科技…

#laravel部署安装报错loadFactoriesFrom是undefined method #

场景: 在git上clone一个项目代码吗laravel版本是5.6 php的版本是7.1 但是运行的时候一直提示错误 Call to undefined method Eachdemo\Rbac\RbacServiceProvider::loadFactoriesFrom() 解决办法: 给RbacServiceProvider,手动添加方…

中国生态地理区划更新和优化

在机器学习或深度学习研究时,建立的模型用于不同地区或时间的数据进行泛化时,其泛化能力往往较差,所以目前在遥感领域用深度学习或机器学习建模时很多文献都是建立分区的模型,即在不同的地理分区内建立模型,泛化时针对…