LangChain--(2)
3 LangChain Expression Language(LCEL)
LCEL是LangChain用于构建和编排AI工作流的声明式编程语言,通过标准化接口简化了大型语言模型(LLM)应用的开发流程。LCEL的所有组件(模型、提示模板、解析器等)均实现Runnable
接口,支持一致的调用方法(invoke
、stream
、batch
等)。即Langchain提供了一个顶级父类,Runnable,只要是Runnable的子类都可以放入chain中。
==声明式编程:==用户描述“做什么”而非“如何做”。
3.1 串行条构建
单个链条的构建
def qwen_single_chain():os.environ.setdefault("DASHSCOPE_API_KEY", load_key("DASHSCOPE_API_KEY"))# 提示词模板from langchain_core.prompts import ChatPromptTemplateprompt_template = ChatPromptTemplate.from_messages([("system", "You are a helpful assistant that translates {input_language} to {output_language}."),("human", "{text}"),])# 模型调用llm = ChatQwen(model="qwen-plus", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")# 结果解析器from langchain_core.output_parsers import StrOutputParserparser = StrOutputParser()# chain链chain = prompt_template | llm | parserprint(chain.invoke({"input_language": "English", "output_language": "Chinese", "text": "I love programming."}))
------------------------------
我爱编程
注意事项:
串行链时,| 与 RunnableSequence不能直接替换。
# 等价关系
chain = prompt | llm | parser
# RunnableSequence本应等价于|,但 | 操作符会自动插入许多组件、类型转化,所以会抛出异常: TypeError: Expected str, got PromptValue
chain = RunnableSequence([prompt, llm, parser]) # 原因分析:
# prompt_template 输出的是 PromptValue 类型
# llm 期望接收 str 类型(需调用 .to_string() 转换)
# RunnableSequence 不会自动插入类型转换步骤
差异对比如下:
3.2 并行链条构建
def qwen_parallel_chain():os.environ.setdefault("DASHSCOPE_API_KEY", load_key("DASHSCOPE_API_KEY"))from langchain_core.prompts import ChatPromptTemplate# 模板1prompt_template_zh = ChatPromptTemplate.from_messages([("system", "You are a helpful assistant that translates English to Chinese."),("human", "{text}"),])# 模板2prompt_template_fr = ChatPromptTemplate.from_messages([("system", "You are a helpful assistant that translates English to French."),("human", "{text}"),])# 模型llm = ChatQwen(model="qwen-plus", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")# 结果解析器from langchain_core.output_parsers import StrOutputParserparser = StrOutputParser()# chain链chain_zh = prompt_template_zh | llm | parserchain_fr = prompt_template_fr | llm | parser# 并行执行两个链条(RunnableMap = RunnableParallel可以互相替换)from langchain_core.runnables import RunnableMap, RunnableLambdaparallel_chains = RunnableMap({"Chinese": chain_zh,"French": chain_fr})# 合并结果final_chain = parallel_chains | RunnableLambda(lambda x: "\n".join([f"{k}: {v}" for k, v in x.items()]))# 调用chainprint(final_chain.invoke({"text": "I love programming."}))
3.3 查看图形化链条
# 利用langgraph产看图形化链条
final_chain.get_graph().print_ascii()