大家好,我是经纬,正在学习 AI 相关知识,势必抓住本次信息革命!
欢迎大家关注,一起学习进步!
一、为什么要做这个
最近一直在使用各种 ai 工具,感觉以后还是 ai 的天下。
于是萌生一个想法,想要自学智能体,之后做智能体变现,claudeCode 办理个会员给我封号了,好容易把费用退回来了。codex 暂时也就不想付费搞了。
google 有渠道办理一年的会员,还不错,而且现在 google 的 agy 还接入了 claudeCode的模型,更好了。
于是通过 Obsidian 和 agy,对未来的智能体开发做了学习规划。

上周是第一周,看了 安德烈·卡帕西 的 ai 基础视频,只看到 2 个小时,大神语速太快 + 专业名词太多,基本都是 0.75 倍速看到。但是也学习到不少东西,并且有不少思考。晚点再说,今天说说上周的进度。
上周是多轮会话基础。
二、messages机制是什么
大模型的会话,是没有上下文的,就是你跟他说什么,本次会话的 message 就发送什么,所以如果想要 ai 对上下文有记忆,需要把之前的会话内容,拼接进去本次会话中。 比喻成打电话,每次会话,都是一通新的电话,第一次你和 ai 通电话,告诉它你是谁。第二天再次对话,实际上是再次打了一通电话。你需要把上次你告诉它你是谁的内容,重复给第二通电话才行。 多轮对话的记忆的时间,就是把历史会话,拼接到每次的会话中。结构是 [{role: system, ...}, {role: user, ...}, {role: assistant, ...}, ...]
三、写代码的过程
作业要求:
# 功能规格:# 1. 初始化时可设置 system prompt(默认:"你是一个专业助手")# 2. 主循环:用户输入 → API 调用 → 流式打印回复(stream=True)# 3. 每次请求自动携带完整历史 messages# 4. 自动截断:当历史超过 5 轮时,只保留最新 5 轮(保留 system 消息)# 5. 命令支持:# - 输入 /clear → 清除历史,重新开始# - 输入 /history → 打印当前 messages 数组(调试用)# - 输入 /token → 打印本轮消耗的 token 数# - 输入 /exit → 退出程序# 6. 每次 AI 回复后,在终端显示:[本轮token: xxx | 历史轮数: xxx]对于代码的编写,官方文档已经有详细的说明了,其实最难的反而是 python 代码的熟练度,很多方法知道要干什么,但是不知道如何通过代码实现。
例如关于保留最新的 5 次会话,肯定是需要进行数组/对象操作的。但是不知道怎么操作,花费了一些时间学习。弄明白之后,使用起来还是很方便的。
def_trim_history(self,max_round=5): max_message=max_round*2if len(self.message)>max_message+1: system_msg=self.message[0] recent_chats=self.message[-max_message:] self.message=[system_msg]+recent_chats print(f"超过最大{max_round}轮对话,历史对话已截断")下面是一些核心代码,都是手敲的,现在手上其实有些开发任务,ai 用习惯了,真是有段时间没有手敲代码了,但是只有手敲代码才会理解更深刻。(至于现在一直在说的黑盒代码,还有资讯提到的 128 万项目,报价 8.8 万,那是另外一个思考了,有机会可以分享一下)
defchat_loop(self):"""启动对话循环""" print(f"DeekSeek对话已启动(输入exit退出)")whileTrue:try: user_input=input("\n用户:").strip()ifnot user_input:continueif user_input.lower()=='/history': print(f"历史会话记录:{str(self.message)}")continueif user_input.lower()=='/token': self._show_token()continueif user_input.lower()=='/clear': self._clear()continueif user_input.lower()=='/exit':break self.message.append({"role":"user","content":user_input}) response=self.client.chat.completions.create( model="deepseek-v4-flash-vision-exp", messages=self.message, stream=False ) reply=response.choices[0].message.content usage=response.usage self.usage=usage self.message.append({"role":"assistant","content":reply}) print(f"助手:{reply}") self._trim_history(max_round=5) print(f"\n本轮token:{usage.prompt_tokens}|历史轮数:{self._get_current_round()}")except KeyboardInterrupt: print("检测到中断。正在退出...")breakexcept Exception as e: print(f"\n发生错误:{str(e)}")continue四、代码测试结果
实现多轮会话记忆
调出历史会话和清空
超过轮数自动截断

五、写在最后
整体代码难度不大,但是配合 安德烈 的视频,更好的理解了 ai 会话的机制。而且用API写AI工具和用产品用AI,差的不只是一行代码,还有对整个机制的理解。
十分欢迎关注我的公众号共同学习、共同进步!
最后感谢您的阅读和支持,期待在下一篇文章中与您再会!
夜雨聆风