(搜索智能体)向量存储 (Vector Stores)
向量存储是LangChain中的一种特殊数据库,专门用于存储和检索向量嵌入(vector embeddings)。这些向量嵌入是文本或其他数据的数值表示,能够捕捉语义相似性,使得基于语义的搜索和检索成为可能。向量存储是构建强大知识检索系统的基础。
向量存储的工作原理
向量存储的核心功能是:
存储向量嵌入:将文档或文本转换为高维向量并存储
相似性搜索:基于向量之间的距离或相似度检索最相关的内容
常用向量存储
1. Chroma
Chroma是一个开源的向量数据库,专为AI应用程序设计,使用简单且功能强大。
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader
# 加载文档
loader = TextLoader("path/to/document.txt")
documents = loader.load()
# 将文档分割成块
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 创建Chroma向量存储
vector_store = Chroma.from_documents(docs, embeddings, persist_directory="./chroma_db")
# 执行相似性搜索
query = "人工智能的应用有哪些?"
results = vector_store.similarity_search(query, k=3) # 返回3个最相关的文档
2. FAISS
FAISS (Facebook AI Similarity Search) 是一个高效的向量相似性搜索库,特别适合处理大规模向量集合。
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
# 使用HuggingFace的嵌入模型
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
# 从文档创建FAISS向量存储
vector_store = FAISS.from_documents(docs, embeddings)
# 保存向量存储到磁盘
vector_store.save_local("faiss_index")
# 稍后加载向量存储
loaded_vector_store = FAISS.load_local("faiss_index", embeddings)
# 执行向量搜索
results = loaded_vector_store.similarity_search(query, k=5)
3. Pinecone
Pinecone是一个托管的向量数据库服务,提供高性能和可扩展性。
from langchain.vectorstores import Pinecone
import pinecone
# 初始化Pinecone
pinecone.init(api_key="your-api-key", environment="us-west1-gcp")
# 创建或连接到索引
index_name = "langchain-demo"
if index_name not in pinecone.list_indexes():
pinecone.create_index(index_name, dimension=1536) # OpenAI嵌入的维度
# 创建向量存储
vector_store = Pinecone.from_documents(docs, embeddings, index_name=index_name)
# 搜索相似内容
results = vector_store.similarity_search(query, k=3)
向量存储的高级功能
元数据过滤
大多数向量存储支持基于元数据的过滤,允许您结合语义搜索和结构化查询:
# 使用元数据过滤进行搜索
results = vector_store.similarity_search(
query,
k=5,
filter={"source": "internal_document", "date": {"$gte": "2023-01-01"}}
)
最大边际相关性(MMR)搜索
MMR搜索算法平衡相关性和多样性,防止冗余结果:
results = vector_store.max_marginal_relevance_search(
query,
k=5,
fetch_k=20, # 初始检索更多候选,然后应用MMR
lambda_mult=0.5 # 控制多样性与相关性的平衡
)
向量存储与其他LangChain组件的集成
与检索器(Retrievers)集成
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 创建检索器
retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 4})
# 创建问答链
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
# 使用问答链
response = qa_chain({"query": query})
与智能体集成
from langchain.agents import Tool, initialize_agent, AgentType
# 创建一个基于向量存储的工具
vector_store_tool = Tool(
name="DocumentSearch",
func=retriever.get_relevant_documents,
description="搜索与查询相关的内部文档和知识库。"
)
# 初始化智能体
agent = initialize_agent(
tools=[vector_store_tool],
llm=OpenAI(),
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 使用智能体
agent.run("关于我们公司的人工智能战略,有哪些重点?")
最佳实践
选择合适的嵌入模型:不同的嵌入模型有各自的优缺点,根据语言、领域和性能需求选择。
文档分块策略:合理的文档分块大小和重叠很重要,影响检索质量。
向量存储选择:根据规模、性能需求和预算选择合适的向量存储。
组合搜索策略:考虑结合全文搜索、向量搜索和元数据过滤。
评估和优化:定期评估检索质量,调整参数以优化性能。
向量存储是构建现代AI应用程序的基础组件,它使智能体能够有效地检索和利用大量结构化和非结构化信息,大大增强了智能体的能力和用户体验。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 数据·开英
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果