PART 01 预备知识
【LangChain中的链与LCEL】
Chain(链)是LangChain中最核心的概念之一(看名字就知道)。简单的说,就是把自然语言输入、关联知识检索、Prompt组装、可用Tools信息、大模型调用、输出格式化等这些LLM 应用中的常见动作,组装成一个可以运行的“链”式过程。链可以直接调用,也可以用来进一步构建更强大的Agent。
LCEL即LangChain Express Language,即LangChain表达语言。这是LangChain提供的一种简洁的、用于组装上述“链”的声明性方式。
我们看一个官方使用LCEL“组装”Chain的例子就明白:
prompt = ChatPromptTemplate.from_template("讲一个关于 {topic} 的笑话")
model = ChatOpenAI(model="gpt-4")
output_parser = StrOutputParser()
chain = prompt | model | output_parser
#调用chain
chain.invoke({"topic": "冰淇淋"})
这个官方的例子中,把提示(prompt)、大模型(model)、输出解析(output_parser)几个组件使用管道符号“|”链接在一起,上个组件的输出作为下一个组件的输入,一起形成了一个链。
对于最常见的RAG应用来说,使用LCEL也无非是在此之上增加一个检索相关文档的动作,类似:
chain = setup_and_retrieval | prompt | model | output_parser
这里很清晰地看到一个简单的RAG应用处理过程:检索关联文档 => 组装Prompt => 调用大模型 => 输出处理。
最后总结一下:LCEL就是LangChain提供用来组装Chain的一种简单表示方式。用这种方式组装链,可以自动获得诸如批量、流输出、并行、异步等一系列能力;而且链可以进一步通过LCEL组装成更复杂的链与Agent。
【LCEL构建与调度Agent】
那么如何用LCEL来创建一个AI Agent并调度运行呢?以最常见的React(推理&行动)范式的Agent来说,相对于Chain需要扩展的能力有:
- 增加工具使用能力。这体现在Prompt中需要注入可用工具信息,并能自动调用工具获得结果。
- 增加“循环”能力。Agent的运行通常需要多次Reason(推理)-Act(行动)的反复与循环,直到完成任务。
以LCEL来组装并创建运行一个Agent的简单过程如下:
""&