【LangChain】(一)掌握向量数据库的CRUD操作与语义检索技巧

news2024/11/29 20:30:32

文章目录

    • 1. 向量数据库的基础知识
      • 1.1 为什么选择向量数据库?
    • 2. CRUD操作详解
      • 2.1 向量数据库-新增数据
        • 示例代码:
      • 2.2 向量数据库-删除数据
        • 示例代码:
      • 2.3 向量数据库-更新数据
      • 2.4 向量数据库-查询数据
        • 2.4.1 相似度查询
        • 2.4.2 最大边际相关性查询
    • 3. 语义检索的进阶技巧
    • 结语

在当今数据驱动的时代,RAG(Retrieval-Augmented Generation)正成为大语言模型从工具走向生产力实践的热门方式。RAG能够从海量文本数据中检索相关信息,并用于生成高质量的文本输出。而在实现RAG的过程中,向量数据库作为基础设施,扮演着不可或缺的角色。今天,我将带领大家以CRUD(创建、读取、更新、删除)操作为切入点,深入探讨向量数据库的使用方法。🌟

1. 向量数据库的基础知识

向量数据库是一种专门用于存储和检索高维向量数据的数据库。与传统的关系型数据库不同,向量数据库能够处理复杂的数据结构,如文本、图像和音频等。这使得它们在机器学习和深度学习应用中,尤其是在自然语言处理(NLP)和计算机视觉(CV)领域,得到了广泛的应用。
在这里插入图片描述

1.1 为什么选择向量数据库?

  • 高效检索:向量数据库能够快速找到与查询向量相似的向量,适合大规模数据集。
  • 灵活性:支持多种数据类型,适合多种应用场景。
  • 扩展性:可以轻松扩展以处理更多数据和更复杂的查询。

2. CRUD操作详解

2.1 向量数据库-新增数据

要向向量数据库中新增数据,首先需要创建一个VectorStore对象,并配置embedding function,用于将原始数据转换为向量。以下是具体步骤:

from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma

# 创建embedding_function
embeddings = HuggingFaceEmbeddings(model_name='your_model_name')

# 创建Chroma对象
vector = Chroma(collection_name='cname', embedding_function=embeddings, persist_directory='/vs')

创建好VectorStore对象后,我们可以使用insert方法向向量数据库中插入数据。insert方法接受一个doc对象作为参数,doc对象可以是字符串或字典。如果是字典,必须包含一个名为text的键,其值为要插入的文本内容,同时可以添加其他元数据用于后续查询或过滤。

示例代码:
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 加载文本并拆分
loader = TextLoader(url, autodetect_encoding=True)
docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)

# 插入向量数据库
vector.add_documents(documents=splits)

add_documents方法会返回一个id列表,这个id是doc的索引,用于唯一标识插入的doc对象。一般来说,一个文件对应多个doc,例如,将一个长文本拆分为多个段落,然后将每个段落作为一个doc插入到向量数据库中,这样可以提高检索的效率和精度。
在这里插入图片描述

2.2 向量数据库-删除数据

要从向量数据库中删除数据,可以使用delete方法。该方法接受一个id或id列表作为参数。

示例代码:
# 删除id为1的doc对象
vector.delete('1')

如果不知道要删除的doc对象的id,但知道它的一些元数据,可以先使用metadata中的字段查询到id,然后再使用delete方法批量删除。

# 根据file_id条件查询
result = vector.get(where={"file_id": file_id})

# 批量删除
if result['ids']:
    vector.delete(result['ids'])

2.3 向量数据库-更新数据

更新一个doc对象相当于先删除它,然后再插入一个新的doc对象。以下是更新的示例代码:

# 删除id为2的doc对象
vector.delete('2')

# 插入新的doc对象
vector.add_documents(new_doc)

在这里插入图片描述

2.4 向量数据库-查询数据

VectorStore类提供了多种查询方法,主要分为两种类型:相似度查询和最大边际相关性(MMR)查询。

2.4.1 相似度查询

相似度查询是最基本的查询方法,它接受一个字符串作为查询,并返回最相似的doc对象。

# 查询与“语义检索”最相似的doc对象
docs = vector.similarity_search("语义检索")

# 打印查询结果
for doc in docs:
    print(doc)
2.4.2 最大边际相关性查询

MMR查询是一种用于检索或摘要的方法,它既考虑了查询和文档之间的相似度,又考虑了文档之间的多样性。

# 查询与“LangChain”相关的但不相似的doc对象
docs = vector.max_marginal_relevance_search("LangChain")

# 打印查询结果
for doc in docs:
    print(doc)

3. 语义检索的进阶技巧

CRUD操作只是使用向量数据库的基础手段。要充分利用RAG,我们还需要掌握语义检索的相关原理。例如,在文档拆分时,需按语义尽可能拆分为小的单元;在召回时,则需基于召回的单元尽可能补充完整的上下文。这些都需要在CRUD的基础上执行一些额外操作。

结语

通过本文的学习,你应该对向量数据库的CRUD操作有了清晰的认识。希望你能在实际项目中灵活运用这些知识,提升你的数据处理能力。💪

如果你对向量数据库或语义检索有任何疑问,欢迎在评论区留言讨论!同时,别忘了关注我的CSDN账号,获取更多技术干货和实用教程!感谢你的阅读,我们下次再见!😊


🔥codemoss_能用AI

【无限GPT4.omini】
【拒绝爬梯】
【上百种AI工作流落地场景】
【主流大模型集聚地:GPT-4o-Mini、GPT-3.5 Turbo、GPT-4 Turbo、GPT-4o、GPT-o1、Claude-3.5-Sonnet、Gemini Pro、月之暗面、文心一言 4.0、通易千问 Plus等众多模型】

🔥传送门:https://www.nyai.chat/chat?invite=nyai_1141439&fromChannel=csdn

在这里插入图片描述


希望这篇文章能帮助你在向量数据库的学习中更进一步!

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

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

相关文章

React(二) JSX中的this绑定问题;事件对象参数传递;条件渲染;列表渲染;JSX本质;购物车案例

文章目录 一、jsx事件绑定1. 回顾this的绑定方式2. jsx中的this绑定问题(1) 方式一:bind绑定(2) 方式二:使用 ES6 class fields 语法(3) 方式三:直接传入一个箭头函数(重要) 3.事件参数传递(1) 传递事件对象event(2) 传递其他参数 4. 事件绑定…

DeepBook V3和DEEP token正式上线

10月14日,DeepBook V3版本正式在主网上线,同时发布了DEEP token,标志着其发展历程中的一个重要里程碑。通过这次升级,用户和做市商将受益于精细调控的激励措施,为通过社区驱动的治理实现更大的去中心化奠定了基础。 D…

【大模型问答测试】大模型问答测试脚本实现(第一版)

背景 公司已经做了一段时间的大模型,每次测试或者回归的时候都需要针对问答进行测试回归,耗费大量的时间与精力,因此结合产品特点,开发自动化脚本替代人工的操作,提升测试回归效率 设计 使用pythonrequestExcel进行…

python+大数据+基于Spark的共享单车数据存储系统【内含源码+文档+部署教程】

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

【jQuery】 jQuery基础及选择器介绍(基本选择器 层次选择器 属性选择器 过滤选择器)

文章目录 jQuery基础1. 优势2. 版本3. 基本语法4. 选择器基本选择器层次选择器属性选择器过滤选择器基本过滤选择器可见性过滤选择器 注意事项 jQuery基础 jQuery 是一个功能强大且易于使用的 JavaScript 库,它极大地简化了前端开发的工作。无论是 DOM 操作、事件处…

简单概述Ton链开发路径

区块链开发领域发展迅速,各种平台为开发人员提供不同的生态系统。其中一个更有趣且越来越相关的区块链是TON(开放网络)区块链。TON 区块链最初由 Telegram 构思,旨在提供快速、安全且可扩展的去中心化应用程序 (dApp)。凭借其独特…

加盟模式如何运营?有哪些好的技巧和方法!

对于很多品牌方来说,生意发展到一定程度,就考虑通过加盟的方式扩大市场份额。 本篇文章,将从3个角度来为大家分享,运营加盟模式的好方法和技巧! 一、加盟前的准备 1、明确品牌定位与核心竞争力 确定你的企业在市场…

暖水毯/取暖毯语音识别控制芯片IC方案

暖水毯、取暖毯作为现代家居生活的温暖伴侣,其智能化升级已是大势所趋。在暖水毯与取暖毯中融入语音识别控制芯片IC方案,为用户的冬日取暖体验带来了革命性的变革。 一、暖水毯/取暖毯增加语音识别控制芯片方案,让产品能通过对话来调节&…

【笔记】vue课堂小作业之书籍购物车列表的增删改查小记

(一)reduce作迭代器 1. reduce 函数的基本用法 array.reduce((accumulator, currentValue) > { ... }, initialValue); accumulator: 累积器,表示当前累积的值,通常在第一次时为 initialValue。(总数sum&#x…

OpenCV高级图形用户界面(8)在指定的窗口中显示一幅图像函数imshow()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在指定的窗口中显示一幅图像。 函数 imshow 在指定的窗口中显示一幅图像。如果窗口是以 cv::WINDOW_AUTOSIZE 标志创建的,图像将以原…

遵循国药准字,确保益安宁丸疗效与安全

益安宁丸真品辨别唯一标准 益安宁丸为同溢堂药业有限公司所独家生产的一款中成药,在内地市场和港澳地区均有上市。 益安宁丸真品的唯一标准:无论港版还是内地版,包装盒必然有国药准字Z20063087标识,但凡没有国药准字标识的必为假…

性价比最高的开放式耳机,五大热门品牌开放式耳机

在当今快节奏的生活环境中,开放式耳机以其独特的开放式设计,既能让用户享受高质量的音乐,又能保持对外界环境的感知,逐渐成为市场上的新宠。然而,面对众多品牌和型号,如何选择一款性价比高的开放式耳机成为…

IDEA 编译报错 “java: 常量字符串过长” 的解决办法

目录 一、问题描述二、问题原因2.1 理论角度2.2 源码角度 三、解决方案解决方案①:StringBuilder 拼接解决方案②:读取文件内容 四、方案验证 在线文本换行工具: https://lzltool.cn/Toolkit/WrapWordsInText 一、问题描述 今天在开发过程中…

JavaScript全面指南(五)

​🌈个人主页:前端青山 🔥系列专栏:JavaScript篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript全面指南 目录 81、ES6 class关键字原理跟function什么区别 82、如何检…

Vue(3) 组件

文章目录 对组件的理解单文件组件非单文件组件基本使用几个注意点组件的嵌套VueComponent构造函数一个重要的内置关系 组件的自定义事件全局事件总线安装全局事件总线使用事件总线解绑事件消息订阅与发布简介使用步骤范例 $nextTick插槽1.默认插槽2.具名插槽作用域插槽 对组件的…

某市驾驶培训监管服务平台 GreatSQL 数据库适配之旅

某市驾驶培训监管服务平台 GreatSQL 数据库适配之旅 一、项目背景 某市驾培系统主要为社会公众提供驾培单位查询和学车报名,为相关合作单位提供某市驾培监管、某市驾培考核等功能。业务信息教练车培训过程视频信息、包括培训机构基本信息、教练员基本信息和学员个…

从零创建苹果App应用,不知道怎么申请证书的可以先去看我的上一篇文章

用大家自己的开发者账户,登录进入App Store Connect ,注册自己的应用 进入之后,点击增加 填写相关的信息 一切顺利的话,就可以来到这个页面

【Java】画心形图形

开始看到的是这个爱心图形,挺好看的(感谢这些前端巨佬): HTML流光爱心_爱心代码html-CSDN博客 本来想着自己看下这个源代码能不能实现,看了下源代码其实非常复杂。 在看代码的过程中发现,源代码里边给出…

5: Euclid‘s Game

题意分析:给定数列(A,B)(A>B),任取两数之差,若不含于数列(A,B)则添加得(A.B,C)重复任取两数之差且不重复得(A,B,C,...)…

【汇编语言】寄存器(内存访问)(二)—— DS和[address]

前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优…