Vespa
Vespa 是一个功能齐全的搜索引擎和向量数据库。它支持向量搜索(ANN)、词汇搜索和结构化数据搜索,所有这些都可以在同一个查询中进行。
本笔记本展示了如何将 Vespa.ai
用作 LangChain 向量存储。
您需要使用 pip install -qU langchain-community
安装 langchain-community
才能使用此集成。
为了创建向量存储,我们使用
pyvespa 来创建一个
与 Vespa
服务的连接。
%pip install --upgrade --quiet pyvespa
使用 pyvespa
包,您可以连接到一个
Vespa Cloud 实例
或一个本地的
Docker 实例。
在这里,我们将创建一个新的 Vespa 应用程序并使用 Docker 部署它。
创建一个 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 应用程序,其中包含
两个字段:text
用于保存文档文本,embedding
用于保存
嵌入向量。text
字段设置为使用 BM25 索引
高效的文本检索,我们将看到如何使用这个和混合搜索
稍后会详细介绍。
embedding
字段设置为长度为 384 的向量,以保存
文本的嵌入表示。请参见
Vespa 的张量指南
了解更多关 于 Vespa 中张量的信息。
最后,我们添加一个 排名配置文件 来 指示 Vespa 如何排序文档。在这里,我们设置了一个 最近邻搜索。
现在我们可以在本地部署这个应用程序:
from vespa.deployment import VespaDocker
vespa_docker = VespaDocker()
vespa_app = vespa_docker.deploy(application_package=app_package)
这将部署并创建与 Vespa
服务的连接。如果您
已经有一个正在运行的 Vespa 应用程序,例如在云中,
请参考 PyVespa 应用程序以了解如何连接。
创建一个 Vespa 向量存储
现在,让我们加载一些文档:
<!--IMPORTS:[{"imported": "TextLoader", "source": "langchain_community.document_loaders", "docs": "https://python.langchain.com/api_reference/community/document_loaders/langchain_community.document_loaders.text.TextLoader.html", "title": "Vespa"}, {"imported": "CharacterTextSplitter", "source": "langchain_text_splitters", "docs": "https://python.langchain.com/api_reference/text_splitters/character/langchain_text_splitters.character.CharacterTextSplitter.html", "title": "Vespa"}, {"imported": "SentenceTransformerEmbeddings", "source": "langchain_community.embeddings.sentence_transformer", "docs": "https://python.langchain.com/api_reference/community/embeddings/langchain_community.embeddings.huggingface.SentenceTransformerEmbeddings.html", "title": "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")
在这里,我们还设置了本地句子嵌入器,将文本转换为嵌入
向量。也可以使用 OpenAI 嵌入,但向量长度需要
更新为 1536
以反映该嵌入的更大尺寸。
为了将这些提供给 Vespa,我们需要配置向量存储如何映射到 Vespa 应用程序中的字段。然后我们直接从中创建向量存储 这组文档:
<!--IMPORTS:[{"imported": "VespaStore", "source": "langchain_community.vectorstores", "docs": "https://python.langchain.com/api_reference/community/vectorstores/langchain_community.vectorstores.vespa.VespaStore.html", "title": "Vespa"}]-->
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)
这将创建一个Vespa向量存储,并将该组文档提供给Vespa。 向量存储负责为每个文档调用嵌入函数 并将它们插入数据库。
我们现在可以查询向量存储:
query = "What did the president say about Ketanji Brown Jackson"
results = db.similarity_search(query)
print(results[0].page_content)
这将使用上面给出的嵌入函数来创建一个表示
用于查询,并利用该表示搜索Vespa。请注意,这将使用
default
排名函数,我们在应用程序包中设置了该函数
您可以使用similarity_search
中的ranking
参数来
指定要使用的排名函数。
请参考pyvespa文档 以获取更多信息。
这涵盖了在LangChain中使用Vespa存储的基本用法。 现在您可以返回结果并继续在LangChain中使用这些结果。
更新文档
作为调用from_documents
的替代方案,您可以直接创建向量
存储并从中调用add_texts
。这也可以用于更新
文档:
query = "What did the president say about Ketanji Brown Jackson"
results = db.similarity_search(query)
result = results[0]
result.page_content = "UPDATED: " + result.page_content
db.add_texts([result.page_content], [result.metadata], result.metadata["id"])
results = db.similarity_search(query)
print(results[0].page_content)
然而,pyvespa
库包含用于操作
Vespa上内容的方法,您可以直接使用。