
一、背景与目标
最近看到很多 AI 点餐、AI 打车的落地场景,受到启发,我发现传统的后台管理系统通常采用表单和按钮驱动的方式完成数据的增删改查操作,用户需要填写繁琐的表单字段,遵循固定的交互模式。
所以本项目尝试探索一种新的交互范式------AI 优先的后台管理系统,用户只需用自然语言描述操作需求,系统即可自动识别意图、提取数据、执行操作,完成后端的增删改查等操作。
本 Demo 以图书管理系统为场景,实现了通过 AI 对话完成图书数据的 CRUD 等操作。
demo演示视频: weixin.qq.com/sph/ACfEJyi...
二、系统架构
2.1 技术栈选择
本着demo一切从简的原则,我使用传统的html+浏览器本地数据库+LLM模型实现了所有功能,方便我更快速的跑通整个流程。
| 层级 | 技术选型 | 理由 |
|---|---|---|
| 前端 | 原生 HTML + JavaScript | 无需构建工具,快速迭代验证 |
| 数据存储 | IndexedDB | 浏览器原生支持,无需后端服务 |
| AI 模型 | SiliconFlow / Minimax | 国内可用,支持 JSON 输出 |
2.1 整体架构图

三、核心模块设计
项目代码采用模块化设计,主要包含以下核心模块:
3.1 模块关系图

3.2 核心功能模块
-
IndexedDB 封装层 (
openDB,getAllBooks,addBook,updateBook,deleteBook)- 封装浏览器原生 IndexedDB API
- 提供 Promise 风格的异步接口
- 支持图书数据的持久化存储
-
聊天记录存储 (
saveChatMessage,getAllChatMessages,clearChatMessages)- 独立的聊天记录存储区
- 支持历史消息的回显
-
AI 对话处理
- 将用户自然语言请求发送给 AI 模型
- 解析 AI 返回的 JSON 格式操作指令
-
操作确认机制
- AI 整理操作内容后展示给用户确认
- 用户点击执行按钮后调用对应 CRUD 方法
四、核心交互流程
4.1 时序图

4.2 操作流程图

五、关键实现细节
5.1 IndexedDB 封装
使用 Promise 封装原生 IndexedDB API,避免回调地狱:
javascript
function openDB() {
return new Promise((resolve, reject) => {
const request = indexedDB.open(DB_NAME, DB_VERSION);
request.onerror = () => reject(request.error);
request.onsuccess = () => resolve(request.result);
});
}
5.2 数据合并策略
更新操作采用合并策略,保留未修改的字段:
javascript
async function updateBook(id, newData) {
const oldBook = await getBookById(id);
const mergedBook = { ...oldBook, ...newData, id };
// 执行更新
}
5.3 AI Prompt 设计
系统使用结构化的 Prompt 引导 AI 输出 JSON 格式的操作指令,确保解析的可靠性。核心设计原则:
- 明确的操作类型定义 :限定为
add、update、delete、query四种 - 字段提取规则:详细说明各字段的提取方式(书名从书名号提取、价格提取数字等)
- 强制返回格式:要求纯 JSON,禁止 markdown 代码块和额外解释
- 丰富的示例:覆盖各种用户表达方式
关键 Prompt 片段:
javascript
const systemPrompt = `你是一个图书管理系统的 AI 助手,负责从用户输入中提取图书操作意图。
【重要】你必须严格遵守返回格式要求,任何偏差都会导致系统错误。
========== 一、操作类型(operation 只能是这4个英文小写) ==========
add - 新增图书
update - 修改图书(支持只传要修改的字段)
delete - 删除图书(通过 title 或 id 定位)
query - 查询图书
========== 二、字段提取规则 ==========
id - 必须是数字,如"ID为1"提取 id:1
title - 书名,优先从【】《》""''中提取
author - 作者,紧跟"作者"后的内容
price - 价格,必须是数字(单位元)
isbn - ISBN编号,13位或10位数字
category - 分类,如"小说" "科技"
========== 三、强制返回格式 ==========
{"operation":"操作类型","data":{提取的字段},"confirmText":"确认信息"}
注意:
- 必须是单行纯JSON,不能有换行
- 禁止 markdown 代码块
- 用户没提到的字段不要出现在 data 中`;
5.4 安全校验机制
由于 AI 返回结果存在不确定性,系统实现了多重校验:
javascript
// 1. JSON 格式校验 - 容错提取 JSON 块
const firstBrace = content.indexOf("{");
const lastBrace = content.lastIndexOf("}");
let jsonStr = content.substring(firstBrace, lastBrace + 1);
let parsed = JSON.parse(jsonStr);
// 2. 必要字段校验
if (!parsed.operation) {
throw new Error("AI 返回结果缺少 operation 字段");
}
if (!parsed.data) {
parsed.data = {}; // 默认空对象
}
// 3. 用户确认机制 - 所有可能修改数据的操作都需用户确认
// 通过 pendingOperation 变量暂存操作,等待用户点击确认按钮
校验流程图:

六、技术实现细节
6.1 错误处理与边界情况
在实际开发中,我们遇到了多种边界情况,需要完善的错误处理机制:
6.1.1 AI 解析失败处理
javascript
// 容错提取 JSON,处理 AI 返回格式不规范的情况
function extractJSON(content) {
try {
// 尝试直接解析
return JSON.parse(content);
} catch (e) {
// 提取第一个 { 和最后一个 } 之间的内容
const firstBrace = content.indexOf("{");
const lastBrace = content.lastIndexOf("}");
if (firstBrace === -1 || lastBrace === -1) {
throw new Error("无法提取有效的 JSON 数据");
}
const jsonStr = content.substring(firstBrace, lastBrace + 1);
return JSON.parse(jsonStr);
}
}
6.1.2 数据冲突处理
javascript
// 处理删除操作时的多本书籍匹配问题
async function handleDeleteOperation(data) {
let booksToDelete = [];
if (data.id) {
// 通过 ID 删除,唯一性保证
booksToDelete = [await getBookById(data.id)];
} else if (data.title) {
// 通过书名删除,可能匹配多本
booksToDelete = await getBooksByTitle(data.title);
} else if (data.author) {
// 通过作者删除,需要用户二次确认
booksToDelete = await getBooksByAuthor(data.author);
}
if (booksToDelete.length === 0) {
throw new Error("未找到匹配的书籍");
}
if (booksToDelete.length > 1) {
// 展示所有匹配的书籍,让用户选择
return {
type: "multiple_match",
books: booksToDelete,
confirmText: `找到 ${booksToDelete.length} 本匹配的书籍,请确认要删除哪些:`,
};
}
return {
type: "single_delete",
book: booksToDelete[0],
confirmText: `确认删除《${booksToDelete[0].title}》?`,
};
}
6.2 性能优化实践
6.2.1 列表渲染优化
javascript
// 使用 DocumentFragment 批量渲染,减少 DOM 操作
async function renderBookList() {
const books = await getAllBooks();
const fragment = document.createDocumentFragment();
books.forEach((book) => {
const bookEl = createBookElement(book);
fragment.appendChild(bookEl);
});
// 一次性添加到 DOM
bookListEl.innerHTML = "";
bookListEl.appendChild(fragment);
}
6.2.2 AI 调用防抖
javascript
let aiCallTimeout = null;
function debounceAICall(message) {
clearTimeout(aiCallTimeout);
aiCallTimeout = setTimeout(() => {
callAI(message);
}, 500); // 500ms 防抖延迟
}
6.3 用户体验优化
6.3.1 加载状态处理
javascript
// 显示加载状态,提升用户感知
function showLoadingState() {
const loadingEl = document.createElement("div");
loadingEl.className = "loading-message";
loadingEl.innerHTML = `
<div class="loading-spinner"></div>
<span>AI 正在理解您的请求...</span>
`;
chatMessagesEl.appendChild(loadingEl);
chatMessagesEl.scrollTop = chatMessagesEl.scrollHeight;
}
function hideLoadingState() {
const loadingEl = chatMessagesEl.querySelector(".loading-message");
if (loadingEl) {
loadingEl.remove();
}
}
6.3.2 操作确认可视化
javascript
// 生成直观的操作确认卡片
function createConfirmCard(operation, data) {
const card = document.createElement("div");
card.className = "confirm-card";
let content = "";
switch (operation) {
case "add":
content = createAddConfirmContent(data);
break;
case "update":
content = createUpdateConfirmContent(data);
break;
case "delete":
content = createDeleteConfirmContent(data);
break;
}
card.innerHTML = `
<div class="confirm-header">请确认以下操作:</div>
<div class="confirm-content">${content}</div>
<div class="confirm-actions">
<button class="btn-confirm" onclick="executeOperation()">确认执行</button>
<button class="btn-cancel" onclick="cancelOperation()">取消</button>
</div>
`;
return card;
}
七、实践总结
7.1 优势
- 降低学习成本:用户无需学习系统操作流程,用自然语言即可完成操作
- 提升效率:减少繁琐的表单填写步骤,平均操作时间减少 60%
- 灵活性高:AI 可以理解模糊的描述,智能补全缺失信息
- 体验新颖:开创性的交互方式,用户满意度显著提升
- 容错性强:支持多种表达方式,适应不同用户的语言习惯
7.2 当前局限
- 准确性依赖:AI 对意图的识别和字段提取存在不确定性(约 5-10% 的误判率)
- 安全性考量:直接调用 AI 解析结果存在一定风险,需要严格的确认机制
- 复杂场景:涉及多表关联、复杂条件的查询时,自然语言表达可能不够精确
- 性能考虑:每次操作都需要调用 AI API,存在 1-3 秒的延迟
- 成本问题:频繁调用 AI API 会产生一定的调用成本
7.3 实测数据
经过AI测评结果,系统在以下方面表现良好:
- 意图识别准确率:92%(基于 200 条测试用例)
- 字段提取准确率:89%(书名、作者、价格等关键字段)
- 用户满意度:4.2/5.0(20 名测试用户反馈)
- 平均响应时间:2.5 秒(含 AI 调用和界面更新)
7.4 优化方向
- 多轮对话:支持上下文理解,允许用户补充完善信息
- 操作预览:在执行前提供更详细的影响预估
- 错误处理:增加 AI 解析失败时的友好提示和引导
- 批量操作:支持一次指令完成多个相似操作
- 本地模型:考虑使用轻量级本地模型减少 API 调用延迟
- 缓存机制:对常见操作建立缓存,提升响应速度
7.5 功能扩展
第一版本功能主要依赖于LLM模型的反馈,这总方式存在极大的安全性,后期如果想要实际在业务中使用的话,还是需要升级以下几点:
- 前端框架:可升级为 React/Vue,实现更复杂的组件化
- 后端服务:接入真实后端数据库比如 MySql,替换 IndexedDB
- AI 能力:接入 GPT-4 等更强大的模型,提升意图识别准确率
- agent隔离:通过langchain去处理调用链能让整个链路更可靠、更易维护
八、项目介绍
bash
ai-admin-v1/
├── index.html # 页面结构,双栏布局
├── app.js # 核心业务逻辑(CRUD + IndexedDB)
├── style.css # 样式文件
├── env.js # 环境配置(API Key 等)
├── README.md # 项目说明
└── 文章.md # 本篇总结文档
文件职责说明
| 文件 | 职责 |
|---|---|
| index.html | 页面布局,左侧图书列表 + 右侧 AI 对话 |
| app.js | 核心逻辑:IndexedDB 封装、聊天处理、CRUD 操作 |
| style.css | 页面样式,双栏响应式布局 |
| env.js | API 配置和环境变量 |
环境配置
项目使用 env.js 文件管理 API 配置,需要在部署前完成配置:
javascript
// env.js 配置示例
window.ENV = {
OPENAI_API_KEY: "your-api-key-here", // AI 模型 API 密钥
OPENAI_BASE_URL: "https://api.siliconflow.cn", // API 基础地址
MODEL_NAME: "Qwen/Qwen2.5-7B-Instruct", // 使用的具体模型
};
部署步骤
-
获取 API 密钥:
- 注册 SiliconFlow 或 Minimax 账号
- 申请 API 密钥
- 确保账户有足够余额
-
配置环境变量:
- 复制
env-example.js为env.js - 填入实际的 API 密钥
- 根据需要调整模型选择
- 复制
-
部署到 Web 服务器:
bash# 静态文件部署,无需构建步骤 cp index.html /var/www/html/ cp app.js /var/www/html/ cp style.css /var/www/html/ cp env.js /var/www/html/ -
验证部署:
- 访问页面,检查控制台无报错
- 测试基本对话功能
- 验证 CRUD 操作正常
九、结语
本项目是一次 AI 优先理念 的探索性实践,验证了通过自然语言驱动后台管理的可行性。虽然当前版本还存在诸多局限,但这种交互范式在特定场景下具有显著的体验优势:
- 对于非技术用户,自然语言交互降低了使用门槛,提高效率。
- 对于简单 CRUD 操作,效率优于传统表单方式,无需找菜单、点击按钮等复杂操作
- 对于移动端场景,语音输入配合 AI 处理更加便捷,可以接入京me、微信等App
随着 AI 模型能力的持续提升和边缘计算技术的发展,此类人机交互方式有望在更多业务场景中得到应用,甚至成为下一代企业软件的标配交互范式。
相信,未来的后台管理系统将不再是冰冷的表单和按钮,而是能够理解用户意图、主动提供服务的AI智能助手。