LangChain 38 深入理解LangChain 表达式语言三 实现RAG检索增强生成 LangChain Expression Language (LCEL)

文章介绍了如何在LangChain中使用RAG技术,结合检索、模型和输出解析器,实现在回答问题时增加上下文的示例。涉及到的组件如RunnableParallel、DocArray和ChatModel等在示例中发挥了关键作用。
摘要由CSDN通过智能技术生成

LangChain系列文章

  1. LangChain 实现给动物取名字
  2. LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
  3. LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
  4. LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
  5. LangChain 5易速鲜花内部问答系统
  6. LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
  7. LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
  8. LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
  9. LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
  10. LangChain 10思维链Chain of Thought一步一步的思考 think step by step
  11. LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain
  12. LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
  13. LangChain 13输出解析Output Parsers 自动修复解析器
  14. LangChain 14 SequencialChain链接不同的组件
  15. LangChain 15根据问题自动路由Router Chain确定用户的意图
  16. LangChain 16 通过Memory记住历史对话的内容
  17. LangChain 17 LangSmith调试、测试、评估和监视基于任何LLM框架构建的链和智能代理
  18. LangChain 18 LangSmith监控评估Agent并创建对应的数据库
  19. LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷
  20. LangChain 20 Agents调用google搜索API搜索市场价格 Reason Action:在语言模型中协同推理和行动
  21. LangChain 21 Agents自问自答与搜索 Self-ask with search
  22. LangChain 22 LangServe用于一键部署LangChain应用程序
  23. LangChain 23 Agents中的Tools用于增强和扩展智能代理agent的功能
  24. LangChain 24 对本地文档的搜索RAG检索增强生成Retrieval-augmented generation
  25. LangChain 25: SQL Agent通过自然语言查询数据库sqlite
  26. LangChain 26: 回调函数callbacks打印prompt verbose调用
  27. LangChain 27 AI Agents角色扮演多轮对话解决问题CAMEL
  28. LangChain 28 BabyAGI编写旧金山的天气预报
  29. LangChain 29 调试Debugging 详细信息verbose
  30. LangChain 30 ChatGPT LLM将字符串作为输入并返回字符串Chat Model将消息列表作为输入并返回消息
  31. LangChain 31 模块复用Prompt templates 提示词模板
  32. LangChain 32 输出解析器Output parsers
  33. LangChain 33: LangChain表达语言LangChain Expression Language (LCEL)
  34. LangChain 34: 一站式部署LLMs使用LangServe
  35. LangChain 35: 安全最佳实践深度防御Security
  36. LangChain 36 深入理解LangChain 表达式语言优势一 LangChain Expression Language (LCEL)
  37. LangChain 37 深入理解LangChain 表达式语言二 实现prompt+model+output parser LangChain Expression Language (LCEL)

在这里插入图片描述

1. RAG 检索增强生成链 搜索示例

对于我们的下一个示例,我们希望运行一个RAG retrieval-augmented generation检索增强生成链,以在回答问题时添加一些上下文。
在这里插入图片描述

# Requires:
# pip install langchain docarray tiktoken

from langchain.chat_models import ChatOpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import ChatPromptTemplate
from langchain.vectorstores import DocArrayInMemorySearch
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel, RunnablePassthrough

from dotenv import load_dotenv  
load_dotenv()  

vectorstore = DocArrayInMemorySearch.from_texts(
    ["harrison worked at kensho", "bears like to eat honey"],
    embedding=OpenAIEmbeddings(),
)

retriever = vectorstore.as_retriever()

template = """Answer the question based only on the following context:
{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()
output_parser = StrOutputParser()

setup_and_retrieval = RunnableParallel(
    {"context": retriever, "question": RunnablePassthrough()}
)
chain = setup_and_retrieval | prompt | model | output_parser

result = chain.invoke("where did harrison work?")
print('result >> ', result)

运行报错

pydantic_self.pydantic_validator.validate_python(data, self_instance=pydantic_self)
pydantic_core._pydantic_core.ValidationError: 2 validation errors for DocArrayDoc
text
Field required [type=missing, input_value={'embedding': [-0.0192381..., 0.010137099064823456]}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.5/v/missing
metadata
Field required [type=missing, input_value={'embedding': [-0.0192381..., 0.010137099064823456]}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.5/v/missing

The issue seems to be a conflict in the version of pydantic that gets installed. You want a 1.10.x version, not 2.x. See #12916

In the meantime, I was able to work around this locally with
解决方案
pip install pydantic==1.10.8

正确输出

(develop)⚡ % python LCEL/rag.py                                                                          ~/Workspace/LLM/langchain-llm-app
result >>  Harrison worked at Kensho.

在这种情况下,组成的链条是:

chain = setup_and_retrieval | prompt | model | output_parser

为了解释这一点,我们首先可以看到上面的提示模板接受context上下文和question问题作为要替换的值。在构建提示模板之前,我们希望检索相关文档以及将它们作为上下文的一部分包括进来。

作为初步步骤,我们已经设置了检索器,它使用内存存储,可以根据查询检索文档。这也是一个可运行的组件,可以与其他组件链接在一起,但您也可以尝试单独运行它:

retriever_response = retriever.invoke("where did harrison work?")
print('retriever_response >> ', retriever_response)

输出

retriever_response >>  [Document(page_content='harrison worked at kensho'), Document(page_content='bears like to eat honey')]

然后我们使用RunnableParallel来准备预期的输入,通过使用检索到的文档条目和原始用户问题,使用文档检索器进行文档搜索,并使用RunnablePassthrough来传递用户的问题:

setup_and_retrieval = RunnableParallel(
    {"context": retriever, "question": RunnablePassthrough()}
)

回顾一下,完整的链条是:

setup_and_retrieval = RunnableParallel(
    {"context": retriever, "question": RunnablePassthrough()}
)
chain = setup_and_retrieval | prompt | model | output_parser

通过以下步骤:

  1. 首先创建一个包含两个条目的RunnableParallel对象。第一个条目,上下文将包括检索器获取的文档结果。第二个条目,问题将包含用户的原始问题。为了传递问题,我们使用RunnablePassthrough来复制这个条目。
  2. 将上面步骤中的字典提供给提示组件。然后它获取用户输入,即问题,以及检索到的文档,即上下文,构建提示并输出一个PromptValue
  3. 模型组件获取生成的提示,并传递给OpenAI LLM模型进行评估。模型生成的输出是一个ChatMessage对象。
  4. 最后,output_parser组件接收一个ChatMessage,并将其转换为Python字符串,然后从invoke方法中返回。

代码

https://github.com/zgpeace/pets-name-langchain/tree/develop

参考

  • https://github.com/langchain-ai/langchain/issues/14585
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值