Langchain的向量存储 - Document高级运用之metadata

文章目录

  • 前言
  • 一、元数据可以增强搜索和后处理的效果
    • 1. 提高搜索的准确性和相关性
    • 2. 提供更丰富的搜索结果展示
    • 3. 支持多种检索模式
  • 二、 示例分析
    • 1. 示例
    • 2. 结果分析
  • 三、高级用法
    • 1. 示例改进:基于元数据的过滤
    • 2. 高级搜索与排序
    • 3. 布尔检索与混合搜索
    • 4. 多字段排序
  • 总结


前言

前几篇文章中,我们在代码示例里看见Document的组成部分里有metadata
在 LangChain 的向量存储和检索过程中,metadata 可以在多个方面发挥重要作用。虽然在简单的相似性搜索中,主要是通过文本内容的向量进行匹配,但元数据在多个方面可以增强搜索和后处理的效果。

一、元数据可以增强搜索和后处理的效果

1. 提高搜索的准确性和相关性

在一些高级检索场景中,除了使用文本内容的向量表示进行相似性搜索,还可以将元数据作为辅助信息进行加权或筛选。例如:

  • 加权搜索:可以对文档的不同元数据赋予权重,例如标题、作者、发布日期等。通过这种方式,搜索结果不仅仅依赖于内容相似度,还会考虑元数据的匹配程度。
  • 筛选和过滤:在搜索结果中,可以根据元数据进行过滤,比如只返回特定作者的文章或某一日期之后的文档。这种方法在需要精确搜索时非常有用。

2. 提供更丰富的搜索结果展示

在展示搜索结果时,元数据可以用于提供更丰富和有用的信息,使用户更容易理解和选择合适的结果。例如:

  • 显示文档标题和作者:用户在查看搜索结果时,可以看到每篇文档的标题、作者和发布日期等信息,而不仅仅是文档内容的片段。
  • 分类和排序:搜索结果可以根据元数据进行分类和排序,例如按日期排序或按作者分类展示。

3. 支持多种检索模式

元数据可以支持多种检索模式,如混合搜索(hybrid search),即结合向量相似度搜索和基于元数据的布尔搜索。例如:

  • 布尔检索:用户可以指定一些元数据条件,如“查找所有2024年发布的机器学习相关文档”。
  • 混合检索:结合文本内容和元数据进行检索,提高搜索结果的多样性和准确性。

二、 示例分析

我们以之前的 Document 类示例为基础,展示元数据在搜索过程中的实际应用。

1. 示例

from langchain_core.documents import Document
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS# 创建一些文档对象
docs = [Document(page_content="Machine learning is a method of data analysis that automates analytical model building.",metadata={"title": "Introduction to Machine Learning", "author": "John Doe", "date": "2024-06-06"}),Document(page_content="LangChain is a powerful framework for building applications with large language models.",metadata={"title": "LangChain Overview", "author": "Jane Doe", "date": "2024-06-05"})
]# 初始化嵌入模型
embeddings = OpenAIEmbeddings()# 将文档内容转换为向量
vectors = [embeddings.embed(doc.page_content) for doc in docs]# 使用 FAISS 存储向量
vector_store = FAISS()
for vector, doc in zip(vectors, docs):vector_store.add_vector(vector, doc)# 查询相似文档
query_text = "Data analysis automation"
query_vector = embeddings.embed(query_text)
results = vector_store.similarity_search(query_vector)# 展示搜索结果,包含元数据
for result in results:print("Content:", result.page_content)print("Title:", result.metadata["title"])print("Author:", result.metadata["author"])print("Date:", result.metadata["date"])print("------")

2. 结果分析

在上面的示例中,通过将 Document 类中的元数据与搜索结果一起展示,用户可以更直观地了解每个文档的相关信息。

三、高级用法

我们还可以基于元数据进行更高级的操作,如:

  • 基于元数据的筛选

    • 可以仅返回特定作者的文档。
    • 可以过滤掉发布日期早于某一时间的文档。
  • 结果排序

    • 可以按照发布日期排序,确保最新的内容优先展示。
    • 可以按照文档标题或其他元数据字段排序。

1. 示例改进:基于元数据的过滤

假设我们希望在搜索结果中只返回 John Doe 的文档,我们可以这样做:

# 查询相似文档
query_text = "Data analysis automation"
query_vector = embeddings.embed(query_text)
results = vector_store.similarity_search(query_vector)# 过滤结果
filtered_results = [result for result in results if result.metadata["author"] == "John Doe"]# 展示过滤后的搜索结果
for result in filtered_results:print("Content:", result.page_content)print("Title:", result.metadata["title"])print("Author:", result.metadata["author"])print("Date:", result.metadata["date"])print("------")

很高兴你喜欢这个思路!为了进一步强化这个概念,我们可以再扩展一些实际应用中的具体示例,以便更好地理解如何利用元数据进行高级搜索和处理。

2. 高级搜索与排序

假设我们有一个文档库,包含大量技术文档和研究论文,我们希望用户能够根据作者、发布日期、关键词等进行高级搜索和排序。

# 创建文档对象列表
docs = [Document(page_content="Machine learning is a method of data analysis that automates analytical model building.",metadata={"title": "Introduction to Machine Learning", "author": "John Doe", "date": "2024-06-06"}),Document(page_content="LangChain is a powerful framework for building applications with large language models.",metadata={"title": "LangChain Overview", "author": "Jane Doe", "date": "2024-06-05"}),Document(page_content="Deep learning extends machine learning by introducing neural networks with multiple layers.",metadata={"title": "Deep Learning Basics", "author": "John Doe", "date": "2024-05-10"})
]# 初始化嵌入模型
embeddings = OpenAIEmbeddings()# 将文档内容转换为向量
vectors = [embeddings.embed(doc.page_content) for doc in docs]# 使用 FAISS 存储向量
vector_store = FAISS()
for vector, doc in zip(vectors, docs):vector_store.add_vector(vector, doc)# 查询相似文档
query_text = "Neural networks"
query_vector = embeddings.embed(query_text)
results = vector_store.similarity_search(query_vector)# 过滤和排序结果:只返回 John Doe 的文档,并按日期排序
filtered_results = [result for result in results if result.metadata["author"] == "John Doe"]
sorted_results = sorted(filtered_results, key=lambda x: x.metadata["date"], reverse=True)# 展示过滤和排序后的搜索结果
for result in sorted_results:print("Content:", result.page_content)print("Title:", result.metadata["title"])print("Author:", result.metadata["author"])print("Date:", result.metadata["date"])print("------")

3. 布尔检索与混合搜索

我们希望用户可以进行布尔检索,比如查找所有包含特定关键词并且在特定日期之后发布的文档。

# 布尔检索和混合搜索
query_text = "machine learning"
query_vector = embeddings.embed(query_text)# 假设我们希望查找2024年6月1日之后的文档
date_threshold = "2024-06-01"# 相似性搜索并基于元数据进行过滤
results = vector_store.similarity_search(query_vector)
filtered_results = [result for result in results if result.metadata["date"] > date_threshold]# 展示过滤后的搜索结果
for result in filtered_results:print("Content:", result.page_content)print("Title:", result.metadata["title"])print("Author:", result.metadata["author"])print("Date:", result.metadata["date"])print("------")

4. 多字段排序

用户可能希望对搜索结果进行多字段排序,例如先按作者排序,再按发布日期排序。

# 多字段排序:先按作者排序,再按日期排序
query_text = "machine learning"
query_vector = embeddings.embed(query_text)
results = vector_store.similarity_search(query_vector)# 多字段排序
sorted_results = sorted(results, key=lambda x: (x.metadata["author"], x.metadata["date"]), reverse=True)# 展示排序后的搜索结果
for result in sorted_results:print("Content:", result.page_content)print("Title:", result.metadata["title"])print("Author:", result.metadata["author"])print("Date:", result.metadata["date"])print("------")

总结

元数据在 LangChain 的向量存储和检索过程中具有重要作用,能够显著提高搜索的准确性和相关性,提供更丰富的搜索结果展示,并支持多种检索模式。通过合理利用元数据,可以构建更智能、更高效的搜索和推荐系统。

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

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

相关文章

一维信号循环平移小波降噪方法(MATLAB R2021b)

循环平移算法由Coifman和Donoho最先提出,其基本原理是将信号进行循环平移,将平移后的信号降噪后再做逆循环平移,改变平移位数,多次重复上述运算,将获得的所有结果求平均,得到最后的结果。 在理想情况下&am…

Java面试八股之什么是自动装箱和自动拆箱

什么是自动装箱和自动拆箱 在Java中,自动装箱(Autoboxing)和自动拆箱(Auto-unboxing)是两个与基本数据类型和它们对应的包装类之间的转换相关的特性。这两个概念自Java 5(也称为Java SE 5或JDK 5&#xff…

【CS.CN】深入探讨下HTTP的Connection头:通过keep-alive实现高效网络连接

文章目录 0 序言0.1 由来0.2 使用场景0.3 现在还需要吗? 1 Connection: keep-alive的机制2 语法 && 通过设置Connection: keep-alive优化性能3 验证与性能提升4 总结References 0 序言 0.1 由来 Connection头部字段在HTTP/1.1中被引入,主要用于…

老旧机子装linux——Xubuntu

目录 前言 正文 下载系统 ​编辑 制作系统盘: 安装界面 Xubuntu ​编辑 lubuntu 后语 前言 有两台电脑,一台装了Ubuntu22,一台装了debuntu。虽然debuntu界面与乌班图大体一样,但是编译器好像有点区别。由于机子为10年前的老…

React的useState的基础使用

import {useState} from react // 1.调用useState添加状态变量 // count 是新增的状态变量 // setCount 修改状态变量的方法 // 2.添加点击事件回调 // userState实现计数实例import {useState} from react// 使用组件 function App() {// 1.调用useState添加状态变量// coun…

TCP和UDP的Java实现代码

在Java中,我们通常使用java.net包下的Socket类(对于TCP)和DatagramSocket类(对于UDP)来实现TCP和UDP的通信。以下是简单的示例代码。 TCP客户端 java import java.io.*; import java.net.*; public class TCPClie…

2024年AI大模型训练数据白皮书作用

2024年AI大模型训练数据白皮书 在人工智能迅猛发展的今天,AI大模型的训练数据质量和管理成为影响其性能和应用效果的关键因素。《2024年AI大模型训练数据白皮书》为业内人士提供了一份详尽的指南,揭示了当前AI大模型训练数据的最新趋势、最佳实践以及未…

Go微服务: 基于rocketmq:server和rocketmq:broker搭建RocketMQ环境,以及生产消息和延迟消费消息的实现

RocketMQ 的搭建 1 ) 配置 docker-compose.yaml 文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:servercontainer_name: rmqnamesrvports:- 9876:9876volumes:- ./logs:/opt/logs- ./store:/opt/storenetworks:rmq:aliases:- rmqnamesrvrmqbroker:image: fo…

【词法分析概要】

文章目录 一、什么是词法分析?1.1 定义1.2 作用 二、词法分析的实现方法2.1 手动实现2.2 使用词法分析器生成器 三、词法分析器的工作流程3.1 输入源代码3.2 扫描并识别词法单元3.3 生成令牌序列3.4 输出令牌序列 四、常见问题及解决方法4.1 歧义词法单元的处理4.2 …

[HGAME 2023 week4]shellcode

看题目,将base64解密,然后dump下来,再拉进ida里,发现为tea加密 在tea加密中得到key 密文就是另外的一个文件 exp import re from ctypes import *import libnumdef decrypt(v, k):v0, v1 c_uint32(v[0]), c_uint32(v[1])delta…

Java面试题:解释面向对象中封装的重要性,并给出在Java中实现封装的实践技巧

封装(Encapsulation)是面向对象编程(OOP)的四大基本原则之一,它指的是将数据(属性)和与数据操作有关的方法组合在一起,形成一个单独的单元,通常称为类(Class&…

【设计模式】行为型设计模式之 策略模式学习实践

介绍 策略模式(Strategy),就是⼀个问题有多种解决⽅案,选择其中的⼀种使⽤,这种情况下我们 使⽤策略模式来实现灵活地选择,也能够⽅便地增加新的解决⽅案。⽐如做数学题,⼀个问题的 解法可能有…

源码编译OpenCV 启用cuda 加速

源码编译OpenCV 启用cuda 加速 系统:ubuntu22.04 x86_64 显卡:nvidia 4070tisuper 16G NVIDIA-SMI 550.67 Driver Version: 550.67 CUDA Version: 12.4 clone github源码:https://github.com/opencv/opencv.git git clone https://github.com/opencv/…

如何拼接全景图?PTGui Pro macOS安装包

PTGui Pro是一款功能强大的全景图像拼接软件,特别适合专业摄影师和设计师使用。它能够将多张照片拼接成高质量的全景图,支持普通、圆柱和球形等多种全景模式。软件提供了自动图像拼接和手动模式,用户可根据需求灵活选择。同时,PTG…

在家AIAA(美国航空航天学会)文献如何查找下载

今天有位同学的求助文献来自AIAA(美国航空航天学会),下面就讲一下不用求助他人自己就可搞定文献下载的途径并实例操作演示。 首先我们先对AIAA(美国航空航天学会)数据库做个简单的了解: 美国航空航天学会…

使用汇编和proteus实现仿真数码管显示电路

proteus介绍: proteus是一个十分便捷的用于电路仿真的软件,可以用于实现电路的设计、仿真、调试等。并且可以在对应的代码编辑区域,使用代码实现电路功能的仿真。 汇编语言介绍: 百度百科介绍如下: 汇编语言是培养…

php常用数据库操作

文章目录 PHP操作1. mysqli_connect() 连接数据库2. mysqli_close() 关闭数据库3. mysqli_num_rows 查询结果集中的行数4. mysqli_select_db 选择数据库的函数5. mysqli_query 常规的插入查找等6. header( )7.防止 sql 注入 PHP操作 1. mysqli_connect() 连接数据库 2. mysql…

Windows UAC权限详解以及因为权限不对等引发的若干问题排查

目录 1、什么是UAC? 2、微软为什么要设计UAC? 3、标准用户权限与管理员权限 4、程序到底以哪种权限运行?与哪些因素有关? 4.1、给程序设置以管理员权限运行的属性 4.2、当前登录用户的类型 5、案例1 - 无法在企业微信聊天框…

API测试工具

apifox 微信扫描登录 不推荐: Download Postman

CorelDraw安装时界面显示不全的解决方案

问题原因:安装包权限 解决方案: 1、安装包解压后,找到Setup文件,复制粘贴到当前文件夹并重命名为Getup后,右击Getup文件,选择“以管理员身份运行” 说明:除了命名Gsetup。还可以命名为其他的…