LangChain LCEL 起步(二)
RAG 案例
下一个例子,我们将构建一个检索增强生成(RAG)链,以便在回答问题时添加一些上下文。
1 | # 在运行前,需要安装以下包: |
在上例中,是这样组合这个链的:
1 | chain = setup_and_retrieval | prompt | model | output_parser |
下面,解释一下这种用法,首先我们来看看这个提示词模版,它有两个参数 context、question 需要被替换。在构建这个提示词模版之前,我们需要先检索相关文档,把他们作为上下文包含进来。
作为测试案例,我们这里使用了一个可提供查询检索的内存存储工具作为检索器,这个检索器同时也是一个可运行的组件,可以与其他组件链接运行,也可以单独运行:
1 | retriever.invoke("where did harrison work?") |
然后,我们使用 RunnableParallel 来对 prompt 模版中的参数进行组合,该对象将作为 prompt 的输入参数,它接收一个文档检索器来进行文档搜索,以及一个 RunnablePassthrough 来传递用户的原始问题。
1 | setup_and_retrieval = RunnableParallel( |
最后,完整的链是这样的:
1 | chain = setup_and_retrieval | prompt | model | output_parser |
整体流程如下:
- 首先,创建一个 RunnableParallel 对象,它接收一个包含两个条目的字典。条目一 context 包含检索器检索到的文档结果。条目 二 question 包含用户的原始问题。为了传递原始问题(在后续invoke传入),需要使用 RunnablePassthrough 来复制该条目。
- 将上一步的字典传递给 prompt 组件。这样,它即可将用户输入(即 question)以及检索到的文档(即 context)用于构建提示词,并输出 PromptValue。
- model 组件接收生成的提示词,并将其传递给 OpenAI LLM 模型进行评估推理。然后生成一个 ChatMessage 对象输出。
- 最后,output_parser 组件接收 ChatMessage,将其转换成 Python 字符串,并从 后续的 invoke 方法调用返回。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 AGI Explained!
评论