当前位置: 首页 > article >正文

VectorStore 组件深入学习与检索方法

考虑到目前市面上的向量数据库众多,每个数据库的操作方式也无统一标准,但是仍然存在着一些公共特征,LangChain 基于这些通用的特征封装了 VectorStore 基类,在这个基类下,可以将方法划分成 6 种:

  • 相似性搜索
  • 最大边际相关性搜索
  • 通用搜索
  • 添加删除精确查找数据
  • 检索器
  • 创建数据库

类图如下:在这里插入图片描述

1. 带得分阈值的相似性搜索

LangChain 的相似性搜索中,无论结果多不匹配,只要向量数据库中存在数据,一定会查找出相应的结果,在 RAG 应用开发中,一般是将高相似文档插入到 Prompt 中,所以可以考虑添加一个 相似性得分阈值,超过该数值的部分才等同于有相似性。

资料推荐

  • 💡大模型中转API推荐
  • ✨中转使用教程
  • ✨模型优惠查询

similarity_search_with_relevance_scores() 函数中,可以传递 score_threshold 阈值参数,过滤低于该得分的文档。

例如没有添加阈值检索 我养了一只猫,叫笨笨,示例与输出如下:

import dotenv
from langchain_community.vectorstores import FAISS
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddingsdotenv.load_dotenv()embedding = OpenAIEmbeddings(model="text-embedding-3-small")documents = [Document(page_content="笨笨是一只很喜欢睡觉的猫咪", metadata={"page": 1}),Document(page_content="我喜欢在夜晚听音乐,这让我感到放松。", metadata={"page": 2}),Document(page_content="猫咪在窗台上打盹,看起来非常可爱。", metadata={"page": 3}),Document(page_content="学习新技能是每个人都应该追求的目标。", metadata={"page": 4}),Document(page_content="我最喜欢的食物是意大利面,尤其是番茄酱的那种。", metadata={"page": 5}),Document(page_content="昨晚我做了一个奇怪的梦,梦见自己在太空飞行。", metadata={"page": 6}),Document(page_content="我的手机突然关机了,让我有些焦虑。", metadata={"page": 7}),Document(page_content="阅读是我每天都会做的事情,我觉得很充实。", metadata={"page": 8}),Document(page_content="他们一起计划了一次周末的野餐,希望天气能好。", metadata={"page": 9}),Document(page_content="我的狗喜欢追逐球,看起来非常开心。", metadata={"page": 10}),
]
db = FAISS.from_documents(documents, embedding)print(db.similarity_search_with_relevance_scores("我养了一只猫,叫笨笨"))# 输出内容
[(Document(metadata={'page': 1}, page_content='笨笨是一只很喜欢睡觉的猫咪'), 0.4592331743070337), (Document(metadata={'page': 3}, page_content='猫咪在窗台上打盹,看起来非常可爱。'), 0.22960424668403867), (Document(metadata={'page': 10}, page_content='我的狗喜欢追逐球,看起来非常开心。'), 0.02157827632118159), (Document(metadata={'page': 7}, page_content='我的手机突然关机了,让我有些焦虑。'), -0.09838758604956)]

添加阈值 0.4,搜索输出示例如下:

print(db.similarity_search_with_relevance_scores("我养了一只猫,叫笨笨", score_threshold=0.4))# 输出[(Document(metadata={'page': 1}, page_content='笨笨是一只很喜欢睡觉的猫咪'), 0.45919389344422157)]

对于 score_threshold 的具体数值,要看相似性搜索方法使用的逻辑、计算相似性得分的逻辑进行设置,并没有统一的标准,并且与向量数据库的数据大小也存在间接关系,数据集越大,检索出来的准确度相比少量数据会更准确。

2. as_retriever() 检索器

LangChain 中,VectorStore 可以通过 as_retriever() 方法转换成检索器,在 as_retriever() 中可以传递一下参数:

search_type:搜索类型,支持 similarity(基础相似性搜索)、similarity_score_threshold(携带相似性得分+阈值判断的相似性搜索)、mmr(最大边际相关性搜索)。
search_kwargs:其他键值对搜索参数,类型为字典,例如:k、filter、score_thresholdfetch_k、lambda_mult 等,当搜索类型配置为 similarity_score_threshold 后,必须添加 score_threshold 配置选项,否则会报错,参数的具体信息要看 search_type 类型对应的函数配合使用。
并且由于检索器是 Runnable 可运行组件,所以可以使用 Runnable 组件的所有功能(组件替换、参数配置、重试、回退、并行等)。

例如将向量数据库转换成 携带得分+阈值判断的相似性搜索,并设置得分阈值为0.5,数据条数为10条,代码示例如下:

import dotenv
import weaviate
from langchain_community.document_loaders import UnstructuredMarkdownLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_weaviate import WeaviateVectorStore
from weaviate.auth import AuthApiKeydotenv.load_dotenv()# 1.构建加载器与分割器
loader = UnstructuredMarkdownLoader("./项目API文档.md")
text_splitter = RecursiveCharacterTextSplitter(separators=["\n\n", "\n", "。|!|?", "\.\s|\!\s|\?\s", ";|;\s", ",|,\s", " ", "", ],is_separator_regex=True,chunk_size=500,chunk_overlap=50,add_start_index=True,
)# 2.加载文档并分割
documents = loader.load()
chunks = text_splitter.split_documents(documents)# 3.将数据存储到向量数据库
db = WeaviateVectorStore(client=weaviate.connect_to_wcs(cluster_url="https://eftofnujtxqcsa0sn272jw.c0.us-west3.gcp.weaviate.cloud",auth_credentials=AuthApiKey("21pzYy0orl2dxH9xCoZG1O2b0euDeKJNEbB0"),),index_name="DatasetDemo",text_key="text",embedding=OpenAIEmbeddings(model="text-embedding-3-small"),
)# 4.转换检索器
retriever = db.as_retriever(search_type="similarity_score_threshold",search_kwargs={"k": 10, "score_threshold": 0.5},
)# 5.检索结果
documents = retriever.invoke("关于配置接口的信息有哪些")print(list(document.page_content[:50] for document in documents))
print(len(documents))

输出内容:

['接口说明:用于更新对应应用的调试长记忆内容,如果应用没有开启长记忆功能,则调用接口会发生报错。\n\n接', '如果接口需要授权,需要在 headers 中添加 Authorization ,并附加 access', '接口示例:\n\njson\n{\n    "code": "success",\n    "data": {', '接口信息:授权+POST:/apps/:app_id/debug\n\n接口参数:\n\n请求参数:\n\nap', '1.2 [todo]更新应用草稿配置信息\n\n接口说明:更新应用的草稿配置信息,涵盖:模型配置、长记忆', '请求参数:\n\napp_id -> uuid:路由参数,必填,需要获取的应用 id。\n\n响应参数:\n\n', 'memory_mode -> string:记忆类型,涵盖长记忆 long_term_memory ', '1.6 [todo]获取应用调试历史对话列表\n\n接口说明:用于获取应用调试历史对话列表信息,该接口支', 'LLMOps 项目 API 文档\n\n应用 API 接口统一以 JSON 格式返回,并且包含 3 个字', '响应参数:\n\nsummary -> str:该应用最新调试会话的长记忆内容。\n\n响应示例:\n\njso']
10

资料推荐

  • 💡大模型中转API推荐
  • ✨中转使用教程
  • ✨模型优惠查询
http://www.lryc.cn/news/2395779.html

相关文章:

  • HackMyVM-First
  • 30V/150A MOSFET 150N03在无人机驱动动力系统中的性能边界与热设计挑战
  • 数据共享交换平台之数据资源目录
  • 跨平台浏览器集成库JxBrowser 支持 Chrome 扩展程序,高效赋能 Java 桌面应用
  • WEBSTORM前端 —— 第3章:移动 Web —— 第3节:移动适配
  • 38.springboot使用rabbitmq
  • 弱光环境下如何手持相机拍摄静物:摄影曝光之等效曝光认知
  • Selenium Manager中文文档
  • WEB安全--SQL注入--MSSQL注入
  • 【HTML】基础学习【数据分析全栈攻略:爬虫+处理+可视化+报告】
  • SAP Business ByDesign:无锡哲讯科技赋能中大型企业云端数字化转型
  • 华为OD机考2025B卷 - 无向图染色(Java Python JS C++ C )
  • 计算机网络学习20250528
  • Next.js路由导航完全指南
  • 五、web安全--XSS漏洞(1)--XSS漏洞利用全过程
  • 【C++高级主题】命令空间(六):重载与命名空间
  • 利用 Python 爬虫获取淘宝商品详情
  • 动态拼接内容
  • Tomcat运行比较卡顿进行参数调优
  • java直接获取MyBatis将要执行的动态sql命令(不是拦截器方式)
  • C++四种类型转换方式
  • Canvas: trying to draw too large(256032000bytes) bitmap.
  • 【深度学习-pytorch篇】5. 卷积神经网络与LLaMA分类模型
  • matlab全息技术中的菲涅尔仿真成像
  • 基于对比学习的推荐系统开发方案,使用Python在PyCharm中实现
  • 网络协议之办公室网络是怎样的?
  • 鸿蒙OSUniApp PWA开发实践:打造跨平台渐进式应用#三方框架 #Uniapp
  • uni-data-picker级联选择器、fastadmin后端api
  • 8天Python从入门到精通【itheima】-62~63
  • 运维 pgsql 安装完后某次启动不了