当前位置: 首页 > news >正文

LangChain源码分析(九)- 向量存储

LangChain向量存储(Vectorstores)全面指南

什么是向量存储?

向量存储(Vectorstores)是现代AI应用的核心组件,专门用于存储和检索高维向量数据。简单来说,它就像一个智能图书馆,能够快速找到与你查询内容"意思相近"的信息,而不仅仅是"字面相同"的信息。

假如你正在教一个不懂中文的外国朋友什么是"汽车"。传统搜索就像给他一本字典,让他查找"汽车"这两个字;而向量存储则像给他看了一千张汽车图片后,他能立刻认出"车辆"、“轿车”、"机动车"等相似概念。

在LangChain中,向量存储主要负责:

  • 存储文档的向量表示(通过嵌入模型生成)
  • 执行高效相似性搜索
  • 提供检索接口给下游应用

为什么需要向量存储?

1. 语义理解的突破

传统关键词搜索存在严重局限性。比如,搜索"人工智能"时,包含"机器学习"、“深度学习”、"AI"的文档可能同样相关,但传统搜索无法找到它们。向量存储通过向量化表示,能够理解语义相似性,解决了这一痛点。

2. RAG系统的基石

检索增强生成(RAG)系统依赖向量存储来从海量知识库中检索相关信息,然后结合LLM生成更准确、更相关的回答。没有高效的向量存储,RAG系统就失去了"记忆"能力。

3. 高效处理非结构化数据

文本、图像等非结构化数据无法直接存储在传统数据库中进行相似性搜索。向量存储将这些数据转换为向量后,可以高效地进行相似性计算和检索。

核心技术模块

1. VectorStore 抽象基类

定义了向量存储的标准接口,包括:

  • add_texts(): 添加文本到向量存储
  • similarity_search(): 相似性搜索
  • max_marginal_relevance_search(): MMR搜索
  • delete(): 删除文档

2. VectorStoreRetriever

继承自BaseRetriever,提供检索功能,支持:

  • 相似性搜索
  • MMR搜索
  • 分数阈值搜索

3. InMemoryVectorStore

内存向量存储的具体实现,使用字典存储向量和文档的映射关系。

4. 向量搜索算法

  • 相似性搜索(similarity search)
  • 最大边际相关性搜索(MMR)
  • 基于分数阈值的搜索

5. 工具函数

  • 余弦相似度计算
  • 最大边际相关性算法

技术架构

类图

«abstract»
VectorStore
+add_texts(texts, metadatas, ids)
+add_documents(documents)
+similarity_search(query, k)
+similarity_search_with_score(query, k)
+max_marginal_relevance_search(query, k, fetch_k, lambda_mult)
+delete(ids)
+as_retriever()
+_select_relevance_score_fn()
InMemoryVectorStore
-store: dict[str, dict[str, Any]]
-embedding: Embeddings
+add_documents(documents, ids)
+similarity_search(query, k)
+similarity_search_with_score(query, k)
+max_marginal_relevance_search(query, k, fetch_k, lambda_mult)
+delete(ids)
VectorStoreRetriever
-vectorstore: VectorStore
-search_type: str
-search_kwargs: dict
+_get_relevant_documents(query)
+_aget_relevant_documents(query)
«interface»
Embeddings
+embed_documents(texts)
+embed_query(text)
Document
+page_content: str
+metadata: dict
+id: str

工作流程

开始添加文档
准备Document列表
提取文本内容
使用Embeddings生成向量
创建ID映射
存储到向量数据库
返回ID列表
结束

搜索时序

查询者VectorStoreEmbeddings相似性算法Documentsimilarity_search(query, k)embed_query(query)query_vector计算相似度相似文档列表返回k个最相似的Document使用返回的Document查询者VectorStoreEmbeddings相似性算法Document

核心实现原理

存储结构

# InMemoryVectorStore使用字典存储结构
self.store: dict[str, dict[str, Any]] = {}
# 每个条目包含:id、vector、text、metadata

相似性搜索

使用余弦相似度计算向量间的相似度,返回最相似的k个文档。

MMR算法

最大边际相关性算法平衡了相关性和多样性,通过lambda_mult参数控制平衡权重。

设计思想

  1. 抽象与实现分离:使用抽象基类定义统一接口
  2. 组合优于继承:VectorStoreRetriever通过组合VectorStore
  3. 统一的API设计:提供同步和异步两套API
  4. 关注点分离:存储、嵌入、检索职责分明

实际应用示例

from langchain_core.vectorstores import InMemoryVectorStore
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings# 1. 初始化嵌入模型
embeddings = OpenAIEmbeddings()# 2. 创建向量存储
vector_store = InMemoryVectorStore(embedding=embeddings)# 3. 准备文档
document_1 = Document(id="1", page_content="人工智能是计算机科学的一个分支", metadata={"category": "AI"})
document_2 = Document(id="2", page_content="机器学习是人工智能的子领域", metadata={"category": "ML"})
document_3 = Document(id="3", page_content="深度学习使用神经网络进行学习", metadata={"category": "DeepLearning"})documents = [document_1, document_2, document_3]# 4. 添加文档到向量存储
ids = vector_store.add_documents(documents=documents)
print(f"添加文档的ID: {ids}")# 5. 执行相似性搜索
results = vector_store.similarity_search(query="神经网络", k=2)
for doc in results:print(f"内容: {doc.page_content}, 元数据: {doc.metadata}")# 6. 使用检索器
retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 1})
retrieved_docs = retriever.invoke("人工智能")
print(f"检索到的文档: {retrieved_docs}")# 7. 执行MMR搜索(最大边际相关性)
mmr_results = vector_store.max_marginal_relevance_search(query="AI技术", k=2, fetch_k=5)
print(f"MMR搜索结果: {mmr_results}")

总结

向量存储是现代AI应用的重要基础设施,通过将非结构化数据转换为向量表示,实现了语义级别的搜索和检索。LangChain的向量存储模块通过抽象设计和统一接口,为开发者提供了灵活、高效的向量存储解决方案,是构建RAG系统和其他AI应用不可或缺的组件。

http://www.dtcms.com/a/438858.html

相关文章:

  • 鸿蒙NEXT系列之探索鸿蒙PC
  • 大岭山镇网站建设公司酷家乐线下培训班
  • 【C++实战(66)】从0到1:C++图形化编程实战之Qt基础入门
  • LeetCode199
  • 潍坊网站建设小程序制作深圳活动策划设计机构
  • 《SaaS网关多租户治理:从串流到稳控的实践》
  • 网站后台登录地址修改大诚设计网站建设
  • 官方网站开发制作公司做亚马逊跨境电商赚钱吗
  • 【读书笔记】VC++软件快捷键
  • AT_abc328_g Cut and Reorder 题解
  • 怎样把自己的网站进行推广国际国内时事新闻
  • 为什么isis比ospf更具有扩展性
  • Windows 10系统编程——进程专题:枚举我们进程的状态
  • 【开题答辩实录分享】以《基于协同过滤算法的经济型酒店推荐系统》为例进行答辩实录分享
  • 湘潭网站建设 都来磐石网络wordpress首页设计
  • labelme 创建AI多边形功能
  • 生物信息 R语言和 cytoscape 相互沟通的组件RCy3,构建cytoscape网络表 节点类型表 链接边的表,并推送到cytoscape
  • 你们需要网站建设怎么注销公司法人身份
  • 序列化和反序列化(redis为例)
  • 之江汇学校网站建设wordpress 不显示评论
  • 洛谷 - 背包题目详解(超详细版)
  • 自主进化的AI大模型架构设想(解决大模型时效性问题):知识网络的拓扑设计
  • 网站建设所需费用明细应不应该购买老域名建设新网站
  • 突破传统!基于SAM架构的双模态图像分割:让AI“看见“红外与可见光的完美融合
  • Agentic Schemas:构建未来多智能体协作架构的实践蓝图
  • 血玥珏-MIDI音符合理性筛选处理器 v1.0.0.6 使用说明
  • 网站建设维诺之星抖音seo排名源码
  • 深入理解:Rust 的内存模型
  • 深圳建站公司推荐宣传片制作费用报价表
  • Zig 语言通用代码生成器:逻辑冒烟测试版五,数据库自动反射功能