如何使用LangChain LCEL聚合两条Chain的输出结果?
LCEL串联Chain并聚合双输出解决方案
我有两条Chain:一条用于生成文档,另一条用于生成该文档的简短摘要。我希望将二者串联,把第一条Chain的输出作为第二条的输入,同时要求最终结果包含两条Chain的输出。在使用LCEL之前,我可以通过LLMChain的output_key参数实现这个功能,但在LCEL中,虽然知道有RunnablePassthrough类,却不清楚如何用它来聚合输出。我的代码示例如下:
generate_document_chain = generate_document_prompt | llm | StrOutputParser() resume_document_chain = resume_document_prompt | llm | StrOutputParser() aggregated_chain = generate_document_chain | resume_document_chain content = aggregated_chain.invoke({"topic": topic})
直接用RunnablePassthrough.assign就能实现双输出的聚合,核心思路是先执行文档生成Chain,把结果保留下来,再用这个结果作为输入调用摘要Chain,最后把两个结果打包进同一个字典里。
修改后的代码示例
from langchain_core.runnables import RunnablePassthrough # 生成文档的Chain,输入topic输出完整文档 generate_document_chain = generate_document_prompt | llm | StrOutputParser() # 生成摘要的Chain,注意prompt要包含{document}变量来接收输入 resume_document_chain = resume_document_prompt | llm | StrOutputParser() # 串联并聚合输出 aggregated_chain = ( # 先执行文档生成,把结果存入document字段 {"document": generate_document_chain} # 基于document字段生成摘要,并存入summary字段 | RunnablePassthrough.assign( summary=lambda data: resume_document_chain.invoke({"document": data["document"]}) ) ) # 调用后得到包含document和summary的字典 content = aggregated_chain.invoke({"topic": topic}) # 按需获取结果 print("完整文档:", content["document"]) print("文档摘要:", content["summary"])
更简洁的写法
如果不需要保留原始topic参数,也可以直接把文档生成的结果作为输入传递:
aggregated_chain = ( generate_document_chain | RunnablePassthrough.assign( summary=lambda doc_content: resume_document_chain.invoke({"document": doc_content}) ) # 把输入的文档内容和生成的摘要整理成字典 | lambda result: {"document": result["input"], "summary": result["summary"]} )
关键说明
RunnablePassthrough.assign的作用是在当前的数据上下文里新增字段,这里我们用它把摘要结果附加到已有的文档结果中。- 最终输出是一个包含两条Chain结果的字典,完全满足你同时保留双输出的需求。
内容的提问来源于stack exchange,提问作者Igor Deruga
相关产品推荐
相关产品推荐

