Source code for langchain.chains.retrieval
from __future__ import annotations
from typing import Any, Dict, Union
from langchain_core.retrievers import (
BaseRetriever,
RetrieverOutput,
)
from langchain_core.runnables import Runnable, RunnablePassthrough
[docs]def create_retrieval_chain(
retriever: Union[BaseRetriever, Runnable[dict, RetrieverOutput]],
combine_docs_chain: Runnable[Dict[str, Any], str],
) -> Runnable:
"""创建检索链,用于检索文档然后传递它们。
参数:
retriever: 类似Retriever的对象,返回文档列表。应该是BaseRetriever的子类或返回文档列表的可运行对象。如果是BaseRetriever的子类,则预期会传入一个`input`键 - 这将用于传递给检索器。如果这不是BaseRetriever的子类,则所有输入将被传递给此可运行对象,这意味着可运行对象应该接受一个字典作为输入。
combine_docs_chain: 接受输入并生成字符串输出的可运行对象。这将包括此链的任何原始输入,一个包含检索到的文档的新上下文键,以及chat_history(如果输入中不存在)的值为`[]`(以便轻松启用对话式检索)。
返回:
一个LCEL Runnable。Runnable返回一个包含至少`context`和`answer`键的字典。
示例:
.. code-block:: python
# pip install -U langchain langchain-community
from langchain_community.chat_models import ChatOpenAI
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
from langchain import hub
retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat")
llm = ChatOpenAI()
retriever = ...
combine_docs_chain = create_stuff_documents_chain(
llm, retrieval_qa_chat_prompt
)
retrieval_chain = create_retrieval_chain(retriever, combine_docs_chain)
chain.invoke({"input": "..."})
"""
if not isinstance(retriever, BaseRetriever):
retrieval_docs: Runnable[dict, RetrieverOutput] = retriever
else:
retrieval_docs = (lambda x: x["input"]) | retriever
retrieval_chain = (
RunnablePassthrough.assign(
context=retrieval_docs.with_config(run_name="retrieve_documents"),
).assign(answer=combine_docs_chain)
).with_config(run_name="retrieval_chain")
return retrieval_chain