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

ops/2024/10/21 6:20:57/

文章目录

    • 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.ppmy.cn/ops/125456.html

相关文章

AI对抗AI:如何应对自动化攻击新时代?

在当今这个生成式AI迅猛发展的时代,自动化攻击的威胁日益加剧。 在人工智能浪潮下,如何利用AI对抗AI,从而实现全方位的网络安全防护? 一、AI浪潮下,自动化攻击加剧 AI技术的发展既带来了前所未有的挑战,也…

Unix Standardization and Implementations

Unix标准化 在Unix未制定较为完备的标准时,各个平台的系统调用方式各异,所开发出的应用程序存在可移植性差的特点,因此人们呼吁指定一套Unix标准来规范接口,增加应用程序的可移植性。所谓Unix标准即适用于Unix环境下的一系列函数…

<<迷雾>> 第11章 全自动加法计算机(6)--一只开关取数 示例电路

用一只开关依次将数取出 info::操作说明 刚启动时, t01, t1t20, 此时只有 IAR1. 按下开关 K 不要松开, 地址寄存器 AR 收到一个上升沿信号, 保存住当前地址, 并提供给存储器(注: 第一个地址为 0, 所以电路中暂看不出什么变化) 松开开关 K, 循环移位计数器 RR 得到一个上升沿信…

Python中的HTTP高手:如何玩转requests模块

引言 在日常开发工作中,我们经常需要从远程服务器获取信息或向其发送数据。比如,当你要抓取网页内容时,或者在开发Web应用时需要调用第三方API接口等场景下,掌握如何高效地发送HTTP请求就显得尤为重要了。Requests模块正是为此而…

es6中函数新增扩展有哪些

在ES6中,函数新增了多个有用的扩展,极大增强了JavaScript的函数处理能力。以下是主要扩展及其使用场景: 1. 箭头函数 (Arrow Function) 简化函数定义,且不绑定自己的this。 const sum (a, b) > a b;使用场景:箭…

phpstorm+phpstudy 配置xdebug(无需开启浏览器扩展)

今天又被xdebug折磨了,忘记了以前咋配置了现在百度发现好多都是各种浏览器扩展而且也没有真正的用到项目上的都是测试的地址怎么样的 我就简单写一下自己实战吧 不支持workerman swoole hyperf等这种服务框架 如果你会请教教我 工具版本phpstudy8.1.xphpstorm2021.x…

技术周刊 | 用 AI 生成完整全栈应用这事儿终于有人做出来了

大家好,我是童欧巴。欢迎来到第 130 期周刊。 大厨推荐 StackBlitz 推出 bolt.new,一个由 AI 驱动的开发沙箱。允许你直接在浏览器通过提示词生成、运行、编辑和部署全栈应用程序,而无需本地设置。 与 Claude、v0 等不同的是,它…

常用Linux命令大全

前言 作为一名后端工程师,使用终端是一种常见的做法,也是你应该学习的技能。许多命令和实用程序可以帮助你在使用 Linux 时更有效地完成任务。 基本Linux命令 如果你想使用 Linux 操作系统,学习常用的命令将会大有帮助。本篇将为后端工程师…