实战案例 中级

实战:自动化周报生成器

用 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 还提供 AnalyzeDocumentChainrefine(迭代式精炼)两种变体。

📝 课后练习

quiz-1 Map-Reduce 汇总模式中 Map 阶段做的是?