前端也能做AI Agent:Ollama + Qwen本地记忆系统实战
本文从零实现基于Ollama与Qwen3:0.6b的本地AI聊天机器人,完整讲解会话记忆机制、消息结构设计与MemoryManager封装,并逐步演进为工程化架构方案。适合前端开发者快速理解AI Agent核心原理,低成本掌握本地大模型开发与上下文管理实战能力。

一、前言
如今 AI Agent 正在快速成为应用开发的重要方向,越来越多熟悉 JavaScript / TypeScript 的前端开发者开始跨入大模型应用开发领域。但在实际开发中,第一个必须理解的核心能力并不是复杂框架,而是——会话记忆(Conversation Memory)。
大语言模型本身是无状态服务,每一次请求都是独立的计算过程,不会自动保留历史对话。因此,要实现“连续对话体验”,必须在应用层手动维护上下文信息。
本文基于本地运行工具 Ollama 与轻量模型 Qwen3:0.6b,从零构建一个具备记忆能力的本地聊天机器人,并逐步升级为工程化结构设计。整个过程无需云端 API,普通笔记本即可运行。
二、核心原理:会话记忆的本质
所谓“AI记忆”,本质上并不是模型内部能力,而是开发者在外部维护的一组结构化上下文数据。 典型结构如下:
messages = [
{"role": "user", "content": "我叫小明"},
{"role": "assistant", "content": "你好小明!"},
]
本质上,这就是一个持续增长的消息队列。
每次请求都会将完整历史上下文一起传入模型,让模型“看到过去”。
这一机制与前端状态管理非常相似,例如:
- React useState
- Vue 响应式数据
- Redux store
核心思想一致:通过状态持续累积,实现系统记忆能力。
本次实验使用 Qwen3:0.6b 模型,约 6 亿参数,支持 32768 tokens 上下文窗口,可以完成基础记忆对话任务。
三、环境准备
3.1 安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh
Windows 用户可直接安装桌面版。 拉取模型:
ollama pull qwen3:0.6b
3.2 安装 Python SDK
pip install ollama
四、基础实现:最小记忆聊天机器人
下面是一个最简实现版本(不足40行代码):
import ollama
MODEL = "qwen3:0.6b"
SYSTEM_PROMPT = """你是一个友好的AI助手:
1. 记住用户信息
2. 基于上下文回答
3. 不编造不存在的信息"""
messages = [{"role": "system", "content": SYSTEM_PROMPT}]
while True:
user_input = input("你: ")
if user_input == "/bye":
break
if user_input == "/clear":
messages = [{"role": "system", "content": SYSTEM_PROMPT}]
print("记忆已清空")
continue
messages.append({"role": "user", "content": user_input})
response = ollama.chat(model=MODEL, messages=messages)
assistant_msg = response["message"]["content"]
messages.append({"role": "assistant", "content": assistant_msg})
print("助手:", assistant_msg)
测试效果
你:我叫小明,我有一只猫叫花花
助手:你好小明,花花是个很可爱的名字
你:我的猫叫什么?
助手:你的猫叫花花
当前问题
虽然可以运行,但存在明显问题:
- messages 无限增长
- Token 消耗不可控
- 长对话性能下降
- 程序重启后记忆丢失
五、工程优化:MemoryManager 记忆管理器
为解决上述问题,引入 MemoryManager,实现“滑动窗口记忆控制”。
核心思想:只保留最近 N 轮对话
from typing import Optional
class MemoryManager:
def __init__(self, system_prompt: Optional[str] = None, max_turns: int = 20):
self.system_prompt = system_prompt
self.max_turns = max_turns
self.messages = []
if system_prompt:
self.messages.append({"role": "system", "content": system_prompt})
def add_user_message(self, content: str):
self.messages.append({"role": "user", "content": content})
def add_assistant_message(self, content: str):
self.messages.append({"role": "assistant", "content": content})
self._trim()
def _trim(self):
system_offset = 1 if self.system_prompt else 0
max_len = system_offset + self.max_turns * 2
if len(self.messages) > max_len:
if system_offset:
self.messages = [self.messages[0]] + self.messages[-(max_len - 1):]
else:
self.messages = self.messages[-max_len:]
def get_messages(self):
return self.messages
def clear(self):
self.messages = []
if self.system_prompt:
self.messages.append({"role": "system", "content": self.system_prompt})
调用示例
import ollama
from memory_manager import MemoryManager
MODEL = "qwen3:0.6b"
memory = MemoryManager(
system_prompt="你是一个简洁高效的AI助手",
max_turns=5
)
while True:
user_input = input("你: ")
if user_input == "/bye":
break
if user_input == "/clear":
memory.clear()
continue
memory.add_user_message(user_input)
response = ollama.chat(
model=MODEL,
messages=memory.get_messages()
)
assistant_msg = response["message"]["content"]
memory.add_assistant_message(assistant_msg)
print("助手:", assistant_msg)
六、工程扩展思路
在真实服务端架构中,会存在多用户并发访问问题。
因此需要对 API 多模型调用结构进行组织与管理:
在 API 多模型调用场景中,可以借助类似 koalaapi的树形结构组织方式,对不同模型调用入口进行结构化归类,使整体调用逻辑更加清晰易维护。
这种设计的核心价值在于:
- 不同模型调用入口统一管理
- 代码结构更清晰
- 易于扩展新模型能力
- 便于后续拆分为服务模块
本质上是一种工程结构组织方式,而不是运行时能力。
七、前端开发者视角(TypeScript等价实现)
interface Message {
role: "system" | "user" | "assistant";
content: string;
}
class MemoryManager {
private messages: Message[] = [];
constructor(private systemPrompt?: string, private maxTurns = 20) {
if (systemPrompt) {
this.messages.push({ role: "system", content: systemPrompt });
}
}
addUserMessage(content: string) {
this.messages.push({ role: "user", content });
}
addAssistantMessage(content: string) {
this.messages.push({ role: "assistant", content });
}
getMessages() {
return this.messages;
}
}
八、进阶方向
在完成基础版本后,可以继续升级为工程级系统:
- 对话摘要压缩(减少 Token 消耗)
- 本地持久化存储(SQLite / JSON)
- 多用户会话隔离机制
- 升级更大参数模型提升能力
九、总结
会话记忆的本质并不是模型能力,而是应用层的状态管理能力。
对于前端开发者来说,这一过程可以简单理解为:
从“管理UI状态” → “管理AI上下文状态”
整个系统可以拆解为三层结构:
- messages(状态容器)
- MemoryManager(状态控制器)
- LLM(推理引擎) 通过 Ollama + Qwen3,我们构建了一个完整的本地 AI Agent 雏形,并具备良好的工程扩展能力。 未来无论是扩展为多用户聊天系统,还是升级为完整 AI Agent 服务,这套结构都可以作为基础架构继续演进。

