实战:自动化周报生成器
用 Map-Reduce 链汇总多条工作记录生成结构化周报,掌握"分而治之"处理批量内容。
需求
输入一周的零散工作记录(会议纪要、commit 信息、待办清单),输出结构化周报:本周进展 / 数据亮点 / 下周计划 / 风险。
Map-Reduce 策略
内容多到塞不进上下文时,分两步:Map(每条记录各自提炼要点)→ Reduce(汇总要点生成周报):
map_prompt = ChatPromptTemplate.from_template(
"从这条工作记录提取:完成事项、量化结果、遗留问题。\n记录:{log}")
map_chain = map_prompt | llm | StrOutputParser()
reduce_prompt = ChatPromptTemplate.from_template(
"把以下要点合并成周报,输出 Markdown,含四个板块:"
"本周进展 / 数据亮点 / 下周计划 / 风险求助。\n\n{points}")
reduce_chain = reduce_prompt | llm | StrOutputParser()
# 并发执行 Map,再 Reduce
points = map_chain.batch(
[{"log": log} for log in weekly_logs],
config={"max_concurrency": 5},
)
report = reduce_chain.invoke({"points": "\n\n".join(points)})
结构化输出更实用
如果要写入系统,让周报输出 JSON(配合 with_structured_output),字段:progress、metrics、plans、risks 各为数组。
可复用的模式
Map-Reduce 是处理"内容总量 > 上下文窗口"的通用模式:批量摘要、多文档对比、长文翻译都适用。LangChain 还提供 AnalyzeDocumentChain 与 refine(迭代式精炼)两种变体。
📝 课后练习
quiz-1 Map-Reduce 汇总模式中 Map 阶段做的是?