教程2026年6月15日8,523 浏览约 4 分钟阅读

前端也能做AI Agent:Ollama + Qwen本地记忆系统实战

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

前端也能做AI Agent:Ollama + Qwen本地记忆系统实战

一、前言

如今 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;
  }
}

八、进阶方向

在完成基础版本后,可以继续升级为工程级系统:

  1. 对话摘要压缩(减少 Token 消耗)
  2. 本地持久化存储(SQLite / JSON)
  3. 多用户会话隔离机制
  4. 升级更大参数模型提升能力

九、总结

会话记忆的本质并不是模型能力,而是应用层的状态管理能力。

对于前端开发者来说,这一过程可以简单理解为:

从“管理UI状态” → “管理AI上下文状态”

整个系统可以拆解为三层结构:

  • messages(状态容器)
  • MemoryManager(状态控制器)
  • LLM(推理引擎) 通过 Ollama + Qwen3,我们构建了一个完整的本地 AI Agent 雏形,并具备良好的工程扩展能力。 未来无论是扩展为多用户聊天系统,还是升级为完整 AI Agent 服务,这套结构都可以作为基础架构继续演进。
标签本地大模型LLM应用大模型工程化AI开发
Koala API · 一站式大模型 API 中转

把博客读到的,落地到你的下一个项目

国内直连 · 兼容 OpenAI SDK · GPT / Claude / Gemini 等主流模型聚合

延伸阅读

免费注册