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

文章目录

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

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

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

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

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

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

2. CRUD操作详解

2.1 向量数据库-新增数据

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

python 复制代码
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的键,其值为要插入的文本内容,同时可以添加其他元数据用于后续查询或过滤。

示例代码:
python 复制代码
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列表作为参数。

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

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

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

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

2.3 向量数据库-更新数据

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

python 复制代码
# 删除id为2的doc对象
vector.delete('2')

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

2.4 向量数据库-查询数据

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

2.4.1 相似度查询

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

python 复制代码
# 查询与"语义检索"最相似的doc对象
docs = vector.similarity_search("语义检索")

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

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

python 复制代码
# 查询与"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


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

相关推荐
像风一样!13 分钟前
MySQL数据库如何实现主从复制
数据库·mysql
大白的编程日记.17 分钟前
【MySQL】数据库表的CURD(二)
android·数据库·mysql
友善的鸡蛋38 分钟前
项目中执行SQL报错oracle.jdbc.OracleDatabaseException: ORA-00942: 表或视图不存在
数据库·sql·oracle
The best are water41 分钟前
jeesite mybatis添加拦截器,推送指定表的变更数据到其他数据库
数据库·mybatis
api_180079054601 小时前
异步数据采集实践:用 Python/Node.js 构建高并发淘宝商品 API 调用引擎
大数据·开发语言·数据库·数据挖掘·node.js
怕什么真理无穷1 小时前
mysql server 9.4 windows安装教程(sqlyog 下载)
数据库
Olrookie1 小时前
MySQL运维常用SQL
运维·数据库·sql·mysql·dba
数据库生产实战1 小时前
ORACLE 19C ADG环境 如何快速删除1.8TB的分区表?有哪些注意事项?
数据库·oracle
blackorbird2 小时前
使用 Overpass Turbo 查找监控摄像头
运维·服务器·数据库·windows
IT永勇2 小时前
SQLite数据库基本操作
数据库·sqlite·嵌入式开发·增删改查·关系型数据库