40.RAG开发-27-VectorStores向量存储

Vector stores 向量存储

基于LangChain的向量存储,存储嵌入数据,并执行相似性搜索。

image.png

如图,这是一个典型的向量存储应用,也即是典型的RAG流程。

这部分开发主要涉及到:

  • 如何文本转向量
  • 创建向量存储,基于向量存储完成:
    ** 存入向量
    ** 删除向量
    ** 向量检索

内置向量存储的使用

from langchain_core.vectorstores import InMemoryVectorStore
from langchain_community.embeddings import DashScopeEmbeddings

vector_store = InMemoryVectorStore(embedding=DashScopeEmbeddings())
# 添加文档到向量存储,并指定id
vector_store.add_documents(documents=[doc1, doc2], ids=["id1", "id2"])
# 删除文档(通过指定的id删除)
vector_store.delete(ids=["id1"])
# 相似性搜索
similar_docs = vector_store.similarity_search("your query here", 4)

外部(Chroma)向量存储的使用

from langchain_community.embeddings import DashScopeEmbeddings
from langchain_chroma import Chroma

vector_store = Chroma(
    collection_name="example_collection",
    embedding_function=DashScopeEmbeddings(),
    persist_directory="./chroma_langchain_db",  # Where to save data locally, remove if not necessary
)

stu.csv

name,age,gender,hobby
王梓涵,25,男,"吃饭,rap"
刘若曦,22,女,"睡觉,rap"
陈俊宇,20,男,"吃饭,rap"
赵思瑶,28,女,"睡觉,rap"
黄浩然,15,男,"吃饭,rap"
林雨桐,20,女,"唱跳,rap"
周博文,20,男,"吃饭,rap"
吴诗琪,24,女,"吃饭,rap"
马子轩,22,男,"睡觉,rap"
孙悦然,27,女,"吃饭,rap"

内存向量存储

from langchain_core.vectorstores import InMemoryVectorStore
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.document_loaders import CSVLoader

vector_store = InMemoryVectorStore(
    embedding=DashScopeEmbeddings()
)

loader = CSVLoader(
    "data/stu.csv",  # CSV文件路径
    encoding="utf-8",  # 编码格式
    source_column="name"  # 文档来源列名
)

documents = loader.load()

# 向量存储的新增、删除、检索
vector_store.add_documents(
    documents = documents, # 被添加的文档,类型:list[Document]
    ids = ["id"+str(i) for i in range(1, len(documents)+1)] #给添加的文档提供id(字符串)list[str]
)

# 删除传入[id,id...]
vector_store.delete(["id1", "id2"])

# 检索传入查询字符串
results = vector_store.similarity_search(
    "周博文",
    k=3  # 返回的文档数量,默认值为1
)
print(results)


外部向量持久化存储

from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.document_loaders import CSVLoader
from langchain_chroma import Chroma

# Chroma向量数据库(轻量级的)
# 确保langchain-chroma和chromadb这两个库安装了最新版本
vector_store = Chroma(
    collection_name="test",  #当前向量存储起个名字,类似数据库的表名称
    embedding_function=DashScopeEmbeddings(),  # 向量嵌入模型
    persist_directory="./chroma_db"  # 持久化目录
)

loader = CSVLoader(
    "data/stu.csv",  # CSV文件路径
    encoding="utf-8",  # 编码格式
    source_column="name",  # 文档来源列名
    csv_args={"delimiter": ",", "quotechar": "\""}  # 明确指定分隔符和引号
)

documents = loader.load()

# 向量存储的新增、删除、检索
vector_store.add_documents(
    documents = documents, # 被添加的文档,类型:list[Document]
    ids = ["id"+str(i) for i in range(1, len(documents)+1)] #给添加的文档提供id(字符串)list[str]
)

# 删除传入[id,id...]
vector_store.delete(["id1", "id2"])

# 检索传入查询字符串
results = vector_store.similarity_search(
    "周博文",
    k=3   # 返回的文档数量,默认值为1
    # filter={"name": "周博文"}  # 过滤条件,类型:dict[str, str]
)
print(results)


(用 python3.14运行此代码会报错,不是代码的问题是3.14太新了,换python3.11就可以正常运行了,langchain 和 chromadb 及其底层依赖库 pydantic 目前尚未完全适配 Python 3.14(目前 Python 3.14 还处于早期开发/测试阶段,并非稳定版)。chromadb 内部使用了 pydantic 的旧版本特性(v1),而这些特性在 Python 3.14 中无法正常工作,导致类型推断失败。)

Langchain内提供向量存储功能,可以基于:

  • InMemoryVectorStore,完成内存向量存储
  • Chroma,外部数据库向量存储

向量存储类均提供3个通用API接口:

  • add_document,添加文档到向量存储
  • delete,从向量存储中删除文档
  • similarity_search:相似度搜索

整体向量存储使用流程如下(RAG流程):

image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容