在自然语言处理项目中,我们经常需要将多个组件串联起来形成完整的工作流。LangChain框架提供的Chain链组件,就像一条高效的流水线,能够将提示词模板、大模型调用、输出解析等环节无缝衔接。最近我在一个AI论文写作助手的项目中,深度使用了RunnablePassthrough、RunnableParallel等工具,今天就来分享这套组合拳的实战心得。
LangChain最基本的链式结构遵循Input → Prompt → Model → Output的流程。这就像工厂的装配线:
python复制from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
basic_chain = (
ChatPromptTemplate.from_template("请用中文回答:{question}")
| model
| StrOutputParser()
)
这个组件有两种典型用法:
python复制RunnablePassthrough() | lambda x: f"收到输入:{x}"
python复制RunnablePassthrough.assign(extra_field=lambda x: x["input"] + "_processed")
提示:当需要保留原始输入的同时添加衍生数据时,这是最佳选择
可以同时运行多个子链,类似电路中的并联结构:
python复制RunnableParallel({
"upper": lambda x: x["text"].upper(),
"lower": lambda x: x["text"].lower()
})
用于嵌入任意Python函数:
python复制def double_length(text):
return {"doubled": text * 2}
RunnableLambda(double_length)
我们需要实现的功能:
传统串行流程的缺点是步骤间有等待时间。通过RunnableParallel可以将大纲生成和素材检索并行执行,效率提升约40%(实测数据)。
python复制outline_prompt = ChatPromptTemplate.from_template(
"请为议论文《{topic}》设计五段式大纲,采用总-分-总结构"
)
outline_chain = outline_prompt | model | StrOutputParser()
实际项目中建议接入真实搜索引擎API:
python复制def mock_search(topic):
return "\n".join([
f"{i}. {topic}相关案例{chr(65+i)}"
for i in range(4)
])
注意模板中的变量名要与并行输出一致:
python复制output_prompt = ChatPromptTemplate.from_template("""
根据以下大纲:
{outline}
和素材:
{data}
撰写关于《{topic}》的950字议论文
""")
python复制complex_chain = (
RunnableParallel({
"outline": outline_chain,
"data": mock_search,
"topic": RunnablePassthrough()
})
| output_chain
)
python复制debuggable_chain = (
RunnableParallel({
"outline": outline_chain,
"data": mock_search,
"topic": RunnablePassthrough()
})
| RunnablePassthrough.assign(essay=output_chain)
)
python复制topics = ["AI伦理", "气候变化"]
complex_chain.batch([{"topic": t} for t in topics])
python复制from langchain.cache import InMemoryCache
langchain.llm_cache = InMemoryCache()
问题1:输出字段缺失
问题2:并行任务阻塞
问题3:内存泄漏
这套模式同样适用于:
我在电商评论分析项目中就使用了类似结构:
code复制用户评论 → 情感分析 → 特征提取 → 生成改进建议
↗ ↘
关键词提取 汇总报告
通过合理设计并行链,将原本需要2.3秒的处理流程优化到1.1秒。关键是要找出任务中可以并行的部分,比如在这个案例中,情感分析和关键词提取就可以同时进行。