掘金 人工智能 08月15日
13_LangChain向量管理高阶指南
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了向量数据库的底层原理及主流应用方法,涵盖向量存储概念、检索器机制、嵌入原理、Chroma、Weaviate、Qdrant和Milvus等数据库的使用,为开发者提供选择和优化向量管理解决方案的实用指导。

📊 向量存储是专门设计用于存储和检索向量嵌入的数据库系统,通过将非结构化数据转换为高维向量,在向量空间中进行相似性比较,实现语义搜索。其工作流程包括数据转换、存储、查询向量转换及相似向量检索。

🔍 向量存储与检索器是LangChain中不同概念:向量存储负责存储向量及执行搜索,检索器则基于向量存储或其他技术,接受字符串查询并返回文档列表,提供更通用的接口。

🧠 向量嵌入是将非结构化数据转换为高维数值向量的过程,通过AI模型生成,自动捕捉语义关系,克服传统数据库仅基于精确匹配的局限性,实现更智能的搜索体验。

🌈 向量可以理解为多维空间中的点,每个维度代表一个特征,语义相似的内容在空间中彼此靠近。高维空间能更精确地区分不同品种,为相似性搜索提供基础,通过计算向量距离(如欧氏距离、余弦相似度)实现。

🔧 Chroma是开源向量数据库,支持内存、持久化内存和容器模式,提供.add、.get、.update、.upsert、.delete、.peek、.query等基本操作,并支持OpenAI嵌入模型,具备带分数的相似性搜索和MMR检索功能。

引言

在人工智能和大语言模型应用中,向量数据库已成为构建智能应用的核心基础设施。本教程将深入探讨向量存储的底层原理,并详细介绍几种主流向量数据库的使用方法,帮助开发者选择和优化适合自己项目的向量管理解决方案。

1. 向量存储底层原理

向量存储基本概念

向量存储(Vector Stores)是一种专门设计用于存储和检索向量嵌入(Vector Embeddings)的数据库系统。在AI应用中,非结构化数据(如文本、图像、音频)通常会被转换为高维向量,这些向量可以在向量空间中进行相似性比较。

向量存储的基本工作流程如下:

    将非结构化数据转换为向量嵌入存储这些向量及其相关元数据在查询时,将查询内容同样转换为向量检索与查询向量"最相似"的存储向量

向量存储与检索器

在LangChain中,向量存储和检索器是两个相关但不同的概念:

检索器可以基于向量存储创建,但也可以基于其他技术(如Wikipedia搜索或Amazon Kendra)。检索器接受字符串查询作为输入,并返回文档列表作为输出。

# 向量存储转换为检索器的基本方式retriever = vector_store.as_retriever()

向量嵌入原理

向量嵌入(Vector Embeddings)是将非结构化数据转换为高维数值向量的过程。与传统数据库基于精确匹配的搜索不同,向量嵌入能够捕捉数据的语义关系。

传统数据库搜索的局限性:

例如,搜索"小狗"时,传统数据库无法返回"柯基"、"金毛"等相关结果,因为它们是不同的关键词。传统应用需要人工创建特征标签来关联这些词,这个过程被称为特征工程(Feature Engineering)。

向量嵌入解决了这个问题:

例如,使用OpenAI的text-embedding-ada-002模型将文本转换为1536维向量:

# 文本向量嵌入示例text = "Your text string goes here"embedding = openai.Embedding.create(    model="text-embedding-ada-002",    input=text)# 结果是1536维向量:[-0.006929283495992422, -0.005336422007530928, ... -0.024047505110502243]

特征和向量的关系

向量可以理解为多维空间中的点,每个维度代表一个特征。在这个空间中,语义相似的内容会彼此靠近。

以狗的分类为例:

    单一特征(如体型大小):可以在一维空间排列,但无法区分体型相似的不同品种两个特征(体型+毛发长度):形成二维空间,可以更好地区分不同品种三个及更多特征:形成高维空间,能够更精确地区分所有品种

在高维空间中,相似事物的向量会彼此靠近,这就是相似性搜索(Similarity Search)的基础。通过计算向量之间的距离(如欧氏距离、余弦相似度),我们可以找到语义上相似的内容。

2. Chroma向量管理

Chroma是一个开源的向量数据库,专注于开发者的生产力和体验。它使用Apache 2.0许可证,可以在多种模式下运行。

安装与基本设置

# 安装Chromapip install chromadb langchain-community

Chroma可以在以下模式运行:

基本操作

Chroma支持以下基本操作:

基本示例

下面是一个使用Chroma存储和检索文档的基本示例:

from langchain_community.document_loaders import TextLoaderfrom langchain.text_splitter import CharacterTextSplitterfrom langchain_openai import OpenAIEmbeddingsfrom langchain_community.vectorstores import Chroma# 1. 加载文档loader = TextLoader("./jobs_speech.txt")documents = loader.load()# 2. 分割文档text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)docs = text_splitter.split_documents(documents)# 3. 创建向量存储embedding_function = OpenAIEmbeddings()db = Chroma.from_documents(docs, embedding_function)# 4. 执行相似性搜索query = "乔布斯对创新的看法是什么?"docs = db.similarity_search(query)print(docs[0].page_content)

持久化存储

如果需要将数据保存到磁盘,可以指定持久化目录:

# 创建持久化的Chroma客户端db = Chroma.from_documents(    docs,     embedding_function,    persist_directory="./chroma_db")# 持久化数据db.persist()# 稍后加载数据db = Chroma(    persist_directory="./chroma_db",    embedding_function=embedding_function)

更新和删除

在实际应用中,我们经常需要更新和删除数据。Chroma要求提供唯一标识符(ids)来跟踪文档:

# 添加带有ID的文档db.add_documents(    documents=[doc1, doc2, doc3],    ids=["doc1", "doc2", "doc3"])# 更新文档db.update_document(    document_id="doc1",    document=updated_doc)# 删除文档db.delete_document(document_id="doc2")

使用OpenAI嵌入模型

许多开发者喜欢使用OpenAI的嵌入模型,以下是设置方法:

import osfrom langchain_openai import OpenAIEmbeddings# 设置API密钥os.environ["OPENAI_API_KEY"] = "你的OpenAI API密钥"# 创建嵌入模型embedding_model = OpenAIEmbeddings()# 使用嵌入模型创建向量存储db = Chroma.from_documents(docs, embedding_model)

高级检索选项

带分数的相似性搜索

可以返回相似度分数,帮助评估检索结果的质量:

# 带分数的相似性搜索docs_and_scores = db.similarity_search_with_score(query)for doc, score in docs_and_scores:    print(f"Score: {score}")    print(f"Content: {doc.page_content}\n")

最大边际相关性(MMR)检索

MMR算法在选择结果时平衡相关性和多样性,避免返回过于相似的文档:

# 使用MMR检索retriever = db.as_retriever(    search_type="mmr",    search_kwargs={"k": 5, "fetch_k": 10})docs = retriever.get_relevant_documents(query)

MMR的作用:

    提高结果的多样性,避免重复信息平衡相关性和新颖性减少冗余,提高信息利用效率

3. Weaviate向量云存储

Weaviate是一个开源的向量数据库,允许存储数据对象和向量嵌入,并能无缝扩展到数十亿个数据对象。

安装与基本设置

# 安装Weaviate客户端pip install weaviate-client langchain-weaviate

Weaviate可以通过多种方式部署:

连接到Weaviate

import weaviatefrom weaviate.embedded import EmbeddedOptions# 本地运行Weaviate(嵌入式模式)client = weaviate.Client(    embedded_options=EmbeddedOptions())# 或连接到远程Weaviate实例client = weaviate.Client(    url="http://localhost:8080")# 连接到Weaviate云服务client = weaviate.Client(    url="https://your-cluster-url.weaviate.cloud",    auth_client_secret=weaviate.auth.AuthApiKey(api_key="your-api-key"))

使用Weaviate与LangChain

以下是一个使用Weaviate存储和检索文档的完整示例:

import osfrom langchain_community.document_loaders import TextLoaderfrom langchain.text_splitter import CharacterTextSplitterfrom langchain_openai import OpenAIEmbeddingsfrom langchain_weaviate import Weaviateimport weaviate# 设置OpenAI API密钥os.environ["OPENAI_API_KEY"] = "你的OpenAI API密钥"# 连接到Weaviateclient = weaviate.Client(    url="http://localhost:8080")# 加载文档loader = TextLoader("./data.txt")documents = loader.load()# 分割文档text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)docs = text_splitter.split_documents(documents)# 创建嵌入模型embedding_model = OpenAIEmbeddings()# 创建Weaviate向量存储vectorstore = Weaviate.from_documents(    client=client,    documents=docs,    embedding=embedding_model,    by_text=False,    index_name="LangChain_Documents")# 执行相似性搜索query = "人工智能的应用场景"docs = vectorstore.similarity_search(query)print(docs[0].page_content)

量化结果相似性

可以检索相关性"分数",这是一个相对分数,表示特定搜索结果在搜索结果池中的好坏程度:

# 带分数的相似性搜索docs_and_scores = vectorstore.similarity_search_with_score(query)for doc, score in docs_and_scores:    print(f"Score: {score}")    print(f"Content: {doc.page_content}\n")

需要注意的是,这是相对分数,不应用于确定相关性的阈值,但可用于比较整个搜索结果集中不同搜索结果的相关性。

4. Qdrant相似性检索

Qdrant(读作:quadrant)是一个向量相似度搜索引擎,提供生产就绪的服务,具有方便的API来存储、搜索和管理向量数据。Qdrant专门支持扩展过滤功能,使其对各种神经网络或基于语义的匹配、分面搜索和其他应用非常有用。

安装与基本设置

# 安装Qdrant客户端pip install qdrant-client langchain-community

Qdrant有多种运行模式:

本地模式

Python客户端允许在本地模式下运行,无需Qdrant服务器,适合测试和调试:

from qdrant_client import QdrantClientfrom langchain_community.vectorstores import Qdrant# 内存中模式client = QdrantClient(":memory:")# 或持久化到磁盘client = QdrantClient(path="./qdrant_db")

使用Qdrant与LangChain

以下是一个使用Qdrant存储和检索文档的完整示例:

import osfrom langchain_community.document_loaders import TextLoaderfrom langchain.text_splitter import CharacterTextSplitterfrom langchain_openai import OpenAIEmbeddingsfrom langchain_community.vectorstores import Qdrantfrom qdrant_client import QdrantClient# 设置OpenAI API密钥os.environ["OPENAI_API_KEY"] = "你的OpenAI API密钥"# 创建Qdrant客户端client = QdrantClient(path="./qdrant_db")# 加载文档loader = TextLoader("./data.txt")documents = loader.load()# 分割文档text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)docs = text_splitter.split_documents(documents)# 创建嵌入模型embedding_model = OpenAIEmbeddings()# 创建Qdrant向量存储collection_name = "document_collection"vectorstore = Qdrant.from_documents(    docs,    embedding_model,    location=":memory:",  # 使用内存模式    collection_name=collection_name,)# 执行相似性搜索query = "量子计算的应用"docs = vectorstore.similarity_search(query)print(docs[0].page_content)

Qdrant云服务

如果不想管理基础设施,可以选择在Qdrant云上设置托管集群:

# 连接到Qdrant云client = QdrantClient(    url="https://your-cluster-url.qdrant.io",    api_key="your-api-key")# 使用云客户端创建向量存储vectorstore = Qdrant.from_documents(    docs,    embedding_model,    url="https://your-cluster-url.qdrant.io",    api_key="your-api-key",    collection_name=collection_name,)

5. Milvus向量检索

Milvus是一个专为嵌入相似性搜索和人工智能应用设计的向量数据库,用于存储、索引和管理由深度神经网络和其他机器学习模型生成的大规模嵌入向量。

安装与基本设置

# 安装Milvus客户端pip install pymilvus langchain-community

要使用Milvus,需要先启动一个Milvus实例

使用Milvus与LangChain

以下是一个使用Milvus存储和检索文档的完整示例:

import osfrom langchain_community.document_loaders import TextLoaderfrom langchain.text_splitter import CharacterTextSplitterfrom langchain_openai import OpenAIEmbeddingsfrom langchain_community.vectorstores import Milvus# 设置OpenAI API密钥os.environ["OPENAI_API_KEY"] = "你的OpenAI API密钥"# 加载文档loader = TextLoader("./data.txt")documents = loader.load()# 分割文档text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)docs = text_splitter.split_documents(documents)# 创建嵌入模型embedding_model = OpenAIEmbeddings()# 创建Milvus向量存储vectorstore = Milvus.from_documents(    docs,    embedding_model,    connection_args={"host": "localhost", "port": "19530"},    collection_name="document_collection")# 执行相似性搜索query = "深度学习在医疗领域的应用"docs = vectorstore.similarity_search(query)print(docs[0].page_content)

使用Zilliz云服务

Zilliz Cloud是Milvus的托管云服务:

# 设置Zilliz云环境变量os.environ["MILVUS_API_URL"] = "https://your-instance-url.zilliz.cloud"os.environ["MILVUS_API_KEY"] = "your-api-key"# 使用环境变量连接到Zilliz云vectorstore = Milvus.from_documents(    docs,    embedding_model,    collection_name="document_collection")

6. 向量数据库功能对比

以下是Chroma、Weaviate、Qdrant和Milvus四个向量数据库的功能对比:

功能/特性ChromaWeaviateQdrantMilvus
数据模型向量 + 元数据向量 + 元数据向量 + 元数据向量 + 元数据
支持的索引类型HNSWHNSW, IVF, FlatHNSWIVF, HNSW, ANNOY, Flat
扩展性
实时性实时更新实时更新实时更新实时更新
多样化查询向量相似性搜索向量相似性搜索 + 混合查询向量相似性搜索向量相似性搜索 + 混合查询
分布式架构
支持的语言Python, JavaScriptPython, Java, Go, TypeScriptPython, GoPython, Java, Go, Node.js
社区支持活跃活跃活跃活跃
开源许可证Apache 2.0BSD-3-ClauseApache 2.0Apache 2.0
部署选项本地, 云本地, 云本地, 云本地, 云
额外功能数据版本控制知识图谱集成, 模型管理集成向量处理工具数据管理工具, 集成分析工具

总结与最佳实践

选择向量数据库的考虑因素

    数据规模:如果处理的是小规模数据,Chroma的内存模式可能足够;对于大规模数据,Milvus或Weaviate可能更合适查询复杂度:如果需要复杂的混合查询,Weaviate或Milvus提供更强大的功能部署环境:考虑是本地部署还是云部署,以及团队的技术栈特殊需求:如知识图谱集成(Weaviate)或高级数据管理(Milvus)

向量管理最佳实践

    合理的文档分割

      太小的块会丢失上下文太大的块会降低检索精度根据应用场景调整chunk_size和chunk_overlap

    选择合适的嵌入模型

      通用场景:OpenAI的text-embedding-ada-002特定领域:考虑领域特定的嵌入模型本地部署:可考虑开源模型如BERT、Sentence-Transformers等

    优化检索策略

      使用MMR提高结果多样性结合关键词搜索和向量搜索实现混合检索策略

    定期更新和维护

      定期重新嵌入和更新向量监控检索性能根据用户反馈调整系统

通过深入理解向量存储的原理和各种向量数据库的特点,开发者可以为自己的AI应用选择最合适的向量管理解决方案,构建高效、准确的检索增强生成(RAG)系统。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

向量数据库 AI应用 语义搜索 嵌入技术
相关文章