你好,我是方可乐。
一个正在深耕AI编程的30+的AI应用开发工程师。
用AI编程开发过Web应用网站,浏览器插件,微信小程序,AI智能体,RAG系统。
关注公众号&添加微信:ThinkFun666
领取【AI编程资料包】
去年6月份,我做了一个连自己都觉得疯狂的决定:裸辞,All in AI。
现在已经换赛道成功,继续在工作中探索。
写周报是打工人绕不开的痛点。明明有在努力工作,但是写的时候不知道写什么,按照什么格式写合适,既然如此,今天给大家分享下:
如何用 LangChain 做一个 周报助手,
解决这个痛点。
下面内容完完全全的实战干货,看完这节课,你可以轻松做出很多智能体。
下面我们先进行核心技术选型
-
1. 窗口记忆:
用 LangChain 自带的ConversationBufferWindowMemory,只保留最近 20 轮。对于绝大多数不复杂的场景,这个记忆信息量足够用了。 -
2. 流式输出:
我们都知道,模型一次性给答案需要等待比较长的时间,体验很差,所以我们用了streaming=True和StreamingStdOutCallbackHandler()实现流式输出,让用户觉得AI“秒懂”,“秒反馈”,交互更自然。 -
3. 链式调用:
输入 → 记忆 → Prompt → LLM → 输出解析。整个流程像一条流水线,模块清晰,不用自己拼接逻辑,非常丝滑,易扩展,代码可读性强。
老规矩,下面我们上代码。
新建代码文件09_chain_memory_stream.py
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain.memory import ConversationBufferWindowMemory
from langchain_core.runnables import RunnablePassthrough
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
load_dotenv()
# 1. 初始化 LLM(开启流式输出)
llm = ChatOpenAI(
model="deepseek-chat",
base_url="https://api.deepseek.com/v1",
api_key=os.getenv("deepseek_api_key"),
streaming=True,
callbacks=[StreamingStdOutCallbackHandler()],
temperature=0.7
)
# 2. 定义窗口记忆(只保留最近 20 轮对话)
memory = ConversationBufferWindowMemory(
k=20,
memory_key="chat_history",
return_messages=True
)
# 3. 定义 Prompt
prompt = ChatPromptTemplate.from_template(
"""
你是一个周报助手。请基于以下历史对话和用户的新输入,给出简洁、直接可用的回复。
历史对话:
{chat_history}
用户的新输入:
{human_input}
"""
)
# 4. 把 memory 包装成可在 LCEL 管道里用的 Runnable
def load_memory(_):
return {"chat_history": memory.load_memory_variables({})["chat_history"]}
# 5. LCEL 链:输入 → 记忆 → Prompt → LLM → Parser
parser = StrOutputParser()
chain = (
{"human_input": RunnablePassthrough(), "chat_history": load_memory}
| prompt
| llm
| parser
)
print("=== 周报助手(链 + 窗口记忆(k=20) + 流式输出)===\n")
print("你可以输入多轮对话,比如:先写周报,再让它改短一点。输入 quit 退出。\n")
while True:
user_input = input("你:")
if user_input.lower() in ["quit", "exit", "退出"]:
print("退出。")
break
print("AI:", end="", flush=True)
result = chain.invoke(user_input)
print("\n") # 流式输出已经逐字打印,这里只补换行
# 更新记忆
memory.save_context({"human_input": user_input}, {"output": result})
代码其实很简单,做智能体也很简单。
把代码跑起来的同学应该能看到,这个周报助手,用起来体验和DeepSeek,豆包这类产品差不多。
思考的结果符合期望,也能够流式输出高效反馈。
那除了周报助手,还有其他好做又常见的智能体方向吗?
答案包有的。
其实,周报助手只是一个“模版”。换个 Prompt,你就能做出很多类似的小智能体,比如:
-
• PPT 制作助手 -
• 心理分析助手 -
• 爆款分析助手
本质上,你只需要在代码中做这些控制,就能轻松搞定简单的智能体开发:
-
1. 换 Prompt(定义它是什么角色), -
2. 调整记忆策略(窗口、摘要、全量), -
3. 是否要流式输出(决定体验感)。
对AI应用开发感兴趣的同学,欢迎加微信申请入群交流学习。
想要学习AI应用开发的同学,可以参照我的代码跑起来,举一反三,一天一个脚印的进步,我相信,会足够坚实。
接下来100天,我会记录从Java程序员到AI应用开发工程师的完整转型路:每一个困惑、每一次突破、每一个真实瞬间。
当前是27/100。
如果你也想了解AI应用开发到底是什么,如果你也在考虑转型但还在犹豫,那就跟着我的记录,一起探索。
继续折腾中,有问题随时交流 🤝
微信号:ThinkFun666
我的免费AI编程交流群,欢迎加入讨论AI编程玩法(加我微信,说明需求和来意,申请入群)
推荐阅读:
我就喜欢干这种傻事!为什么转型AI应用开发,我不建议你直接从看书开始学起?

