考虑到目前市面上的向量数据库众多,每个数据库的操作方式也无统一标准,但是仍然存在着一些公共特征,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.pswp.cn/pingmian/83164.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/83164.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/83164.shtml

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

相关文章

【PyQt5】从零开始的PyQt5 - QLabel篇

从零开始的PyQt5 - QLabel篇 引言一、简述二、例程2.1 显示到QWidget窗口上2.2 重新设置Label大小和对齐方式2.3 添加内容,设置边框2.4 显示富文本 三、参考 引言 QLabel主要用于显示文本或图像,不提供用户交互功能。本文主要简述PyQt5中的QLabel以及展…

论文略读:Uncertainty-Aware Graph Structure Learning

WWW 2025 1 intro 传统GNN忽视了图结构自身存在的缺陷: 图结构常常会出现错误边和缺失边等数据问题,从而限制模型的效果 —>为了解决上述问题,产生了图结构学习算法(GSL) 目的在于优化结点连接和边权重来生成新的邻接矩阵主流…

HCIE-STP复习

文章目录 STP STP 🏡作者主页:点击! 🤖Datacom专栏:点击! ⏰️创作时间:2025年05月31日13点17STP通过三要素选举消除环路: 根桥(BID最小,建议设优先级为0&…

leetcode17.电话号码的字母组合:字符串映射与回溯的巧妙联动

一、题目深度解析与字符映射逻辑 题目描述 给定一个仅包含数字 2-9 的字符串 digits,返回所有它能表示的字母组合。数字与字母的映射关系如下(与电话按键相同): 2: "abc", 3: "def", 4: "ghi", …

【Unity】模型渐变技术 BlendShapes变形

模型fbx拖拽到场景并赋予脚本上SkinnedMeshRenderer参数 按下空格即可演示渐变 可去到3DsMax 或 Blender等软件制作 这种带有BlendShapes的模型 (Sphere002)是另一个模型,3DsMax叫变形器。 可参考:【技术美术百人计划】美术 3.5 BlendShape基础_哔哩哔哩…

CTFHub-RCE 命令注入-无过滤

观察源代码 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 127.0.0.1|ls 发现除了index.php文件外,还存在一个可疑的文件 打开flag文件 我们尝试打开这个文件 127.0.0.1|cat 19492844826916.php 可是发现 文本内容显示不出来&…

DrissionPage ChromiumPage模式:浏览器自动化的高效利器

引言 在Python自动化领域,Selenium与Requests是开发者耳熟能详的工具,但二者在功能侧重上存在明显割裂。DrissionPage的出现打破了这一局面,其创新的ChromiumPage模式通过整合浏览器自动化与HTTP请求能力,为网页操作提供了全新解…

uniapp分包配置,uniapp设置subPackages

在使用uniapp开发过程中,由于项目比较大,无法直接上传,需要分包后才可以上传。 步骤: 1、在pages同级目录下创建分包的目录(pages_second),把要分包的文件放到该目录下; 2、在pag…

零基础一站式端游内存辅助编写教程(无密)

目录如下: 基础理论篇 内存基础概念(如内存地址、数据类型、读写原理)端游内存机制简介(游戏进程与内存分配) 工具与环境搭建 常用内存分析工具介绍(如 Cheat Engine、x64dbg 等)开发环境配…

汽车售后诊断数据流详细分析

一、引言 随着汽车电子化程度的不断提升,电控系统已成为车辆运行的核心支撑。据罗兰贝格 2025 年智能汽车白皮书数据显示,中央计算 区域控制架构(Zonal EEA)的普及率已突破 58%,推动整车线束成本下降 41%12。与此同时…

智能守护电网安全:探秘输电线路测温装置的科技力量

在现代电力网络的庞大版图中,输电线路如同一条条 “电力血管”,日夜不息地输送着能量。然而,随着电网负荷不断增加,长期暴露在户外的线路,其线夹与导线在电流热效应影响下,极易出现温度异常。每年因线路过热…

设计模式——单例设计模式(创建型)

摘要 本文详细介绍了单例设计模式,包括其定义、结构、实现方法及适用场景。单例模式是一种创建型设计模式,确保一个类只有一个实例并提供全局访问点。其要点包括唯一性、私有构造函数、全局访问点和线程安全。文章还展示了单例设计模式的类图和时序图&a…

Lyra学习笔记 Experience流程梳理

目录 前言1 创建2 加载3 Deactivate4 总结与图示 前言 这篇主要将视角放在Experience的流程,所以不会涉及一些更深的东西 之后ULyraExperienceManagerComponent简称为EMC 1 创建 完事开头难,首先找到了管理Experience的组件,那么它的初始化…

Ubuntu下编译mininim游戏全攻略

目录 一、安装mininim 软件所依赖的库(重点是allegro游戏引擎库)二、编译mininim 软件三、将mininim打包给另一个Ubuntu系统使用四、安卓手机运行mininim 一、安装mininim 软件所依赖的库(重点是allegro游戏引擎库) 1. 用apt-get…

SMT贴片制造流程关键环节解析

内容概要 现代电子制造领域中,SMT(表面贴装技术)作为核心工艺,其流程的精密性与稳定性直接决定产品性能与生产良率。本文以SMT贴片制造流程为主线,系统解析焊膏印刷、元器件贴装、回流焊接三大核心工艺的技术要点。其…

HTTP/2与HTTP/3特性详解:为你的Nginx/Apache服务器开启下一代Web协议

更多服务器知识,尽在hostol.com 嘿,各位站长和服务器管理员朋友们!咱们天天跟网站打交道,都希望自己的网站能像火箭一样快,用户体验“嗖嗖”的。但你知道吗?除了服务器硬件配置、代码优化、CDN加速这些“常…

pytest 常见问题解答 (FAQ)

pytest 常见问题解答 (FAQ) 1. 基础问题 Q1: 如何让 pytest 发现我的测试文件? 测试文件命名需符合 test_*.py 或 *_test.py 模式测试函数/方法需以 test_ 开头测试类需以 Test 开头(且不能有__init__方法) Q2: 如何运行特定测试? pytest path/to/t…

【前端】SPA v.s. MPA

链接:页面结构 误区 页面结构管理有两种常见方式:路由形式 和 组件形式。路由形式 对应MPA ,组件形式对应SPA ❌ 误区 1:路由形式 MPA❌ 路由是 SPA 和 MPA 共有的概念,区别在于路由映射的对象: MPA 的…

Matlab数据类型

本篇介绍我在南农matlab课程上的所学,我对老师ppt上的内容重新进行了整理并且给出代码案例。主要内容在矩阵。如果真的想学matlab,我不认为有任何文档能够超过官方文档,请移步至官网,本篇说实话只是写出来给自己和学弟学妹作期末复…

代码随想录算法训练营 Day58 图论Ⅷ 拓扑排序 Dijkstra

图论 题目 117. 软件构建 拓扑排序:给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。 当然拓扑排序也要检测这个有向图是否有环,即存在循环依赖的情况,因为这种情况是不能做线性排序的。所以拓扑排序也是图论中判断有向…