1. VectorStoreRetriever 检索器
VectorStoreRetriever
是 BaseRetriever
的子类,这是一个专门针对向量数据库的基础检索器,在 VectorStoreRetriever
的内部实现了 _get_relevant_documents()
方法,还定义了单独的属性:
vectorstore
:检索器归属的向量数据库。
search_type
:搜索类型。
search_kwargs
:搜索参数。
这些参数均来源于 as_retriever()
或者在实例化类时传递的参数,由于该组件是一个 Runnable
可运行组件,所以可以使用 .configurable_fields()
来修改类内部的参数。
资料推荐
- 💡大模型中转API推荐
- ✨中转使用教程
- ✨模型优惠查询
例如实现在运行时传递 search_type
与 search_kwargs
,修改成 mmr
方法进行检索,并且返回 4 条数据, 代码示例:
import dotenv
import weaviate
from langchain_core.runnables import ConfigurableField
from langchain_openai import OpenAIEmbeddings
from langchain_weaviate import WeaviateVectorStore
from weaviate.auth import AuthApiKeydotenv.load_dotenv()# 1.构建向量数据库
db = WeaviateVectorStore(client=weaviate.connect_to_wcs(cluster_url="https://eftofnujtxqcsa0sn272jw.c0.us-west3.gcp.weaviate.cloud",auth_credentials=AuthApiKey("21pzYy0orl2dxH9xCoZG1O2b0euDeKJNEbB0"),),index_name="DatasetDemo",text_key="text",embedding=OpenAIEmbeddings(model="text-embedding-3-small"),
)# 2.转换检索器
retriever = db.as_retriever(search_type="similarity_score_threshold",search_kwargs={"k": 10, "score_threshold": 0.5},
).configurable_fields(search_type=ConfigurableField(id="search_type"),search_kwargs=ConfigurableField(id="search_kwargs"),
)# 3.执行基础相似性搜索,并返回4条数据
similarity_documents = retriever.with_config(configurable={"search_type": "mmr","search_kwargs": {"k": 10},
}).invoke("关于应用配置的接口有哪些?")
print("相似性搜索: ", similarity_documents)
print("内容长度:", len(similarity_documents))
输出内容:
相似性搜索: [...]
内容长度: 10
除了使用 .with_config()
传递运行时配置,也可以在执行 .invoke()
函数时传递 config
,效果是一模一样的。
similarity_documents = retriever.invoke("关于应用配置的接口有哪些?", config={"configurable": {"search_type": "mmr","search_kwargs": {"k": 8},}}
)
在 LCEL
表达式构建的链应用中,.with_config()
可以通过链一起传递,或者是调用 .invoke()
函数是传递 config+configurable
属性完成对配置信息的替换,所以在 RAG
应用开发中,可以对检索器配置好相应的选项,如果需要特定信息时传递运行配置即可,否则会运行默认配置信息。
为 聊天机器人架构运行流程图 添加上 动态配置 选项,更新后如下:
除此之外,Runnable
可运行组件的其他配置也可以轻松配置使用:
使用 .configurable_alternatives()
来实现对 向量数据库检索器 的替换;
使用 .with_retry()
来实现对出现错误的重试;
使用 .with_fallbacks()
来实现对出现错误时的回退;
使用 .with_listeners()
来实现对执行生命周期的监听;
使用 .bind()
来实现动态传递绑定时参数(不过对于 weaviate
向量数据库来说,目前没有效果)。
.bind()
函数会将相应的数据传递给 .invoke()
的 kwargs
参数,但是在 weaviate
的 invoke()
中并没有用到 kwargs
参数,所以 .bind()
函数不会起到效果,要想传递搜索参数给 weaviate
的 .invoke()
方法只能通过 search_kwargs
进行传递。
核心代码:
def _get_relevant_documents(self, query: str, *, run_manager: CallbackManagerForRetrieverRun
) -> List[Document]:if self.search_type == "similarity":docs = self.vectorstore.similarity_search(query, **self.search_kwargs)elif self.search_type == "similarity_score_threshold":docs_and_similarities = (self.vectorstore.similarity_search_with_relevance_scores(query, **self.search_kwargs))docs = [doc for doc, _ in docs_and_similarities]elif self.search_type == "mmr":docs = self.vectorstore.max_marginal_relevance_search(query, **self.search_kwargs)else:raise ValueError(f"search_type of {self.search_type} not allowed.")return docs
资料推荐
- 💡大模型中转API推荐
- ✨中转使用教程
- ✨模型优惠查询