AccessAI 开源升级:全新界面、多模型与历史管理
上次分享的 AccessAI 开源项目——用 VBA 给 Access 接上 AI 大模型——得到了不少反馈。那一版只支持 DeepSeek,做的是一次性问答,界面也确实比较朴素。
这次直接来了一轮大更新,从功能到界面全部重构。今天这篇文章主要聊聊更新了什么,为什么要这么做,以及背后的技术思路。
一、这次更新了什么
直接看对比就清楚了:
| 能力 | 上一版 | 新版本 |
|---|---|---|
| AI 模型 | 仅 DeepSeek | DeepSeek + 通义千问 + 文心一言 + Kimi,下拉框一键切换 |
| 自定义端点 | 不支持 | 支持任意 OpenAI 兼容 API,填写 URL、Key、模型名称即可 |
| 对话上下文 | 单次问答,无记忆 | 自动维护对话历史,AI 能记住之前的对话 |
| 历史持久化 | 无 | 对话自动保存到 Access 数据表,关掉数据库也不丢 |
| 历史管理 | 无 | 独立窗体浏览、加载、删除历史会话 |
| 界面风格 | 标准 Access 控件 | 参考 DeepSeek / Gemini 重新设计,现代简洁 |
| 流式输出 | ✅ 支持 | ✅ 支持(无变化) |
| 打字机降级 | ✅ 支持 | ✅ 支持(无变化) |
| Markdown 渲染 | ✅ 支持 | ✅ 支持(无变化) |
用一句话总结:这次更新让 AccessAI 从“能用的技术验证”真正变成了“可以投入实际使用的工具”。
二、多模型支持:不只是换个 URL 那么简单
上一版只支持 DeepSeek,后来不断有人问:能不能接通义千问?能不能接文心一言?其实每个人的偏好不同,有些团队已经采购了某个平台的 API。如果每次都要改代码里的常量,那门槛就太高了。
新版本内置了四家主流国产 AI 模型的配置:
' DeepSeek
Private Const DS_KEY As String = "你的-DeepSeek-Key"
Private Const DS_URL As String = "https://api.deepseek.com/chat/completions"
Private Const DS_MODEL As String = "deepseek-chat"
' 通义千问 (阿里云百炼)
Private Const QW_KEY As String = "你的-通义千问-Key"
Private Const QW_URL As String = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"
Private Const QW_MODEL As String = "qwen-plus"
' 文心一言 (百度千帆)
Private Const WX_KEY As String = "你的-文心一言-Key"
Private Const WX_URL As String = "https://qianfan.baidubce.com/v2/chat/completions"
Private Const WX_MODEL As String = "ernie-4.0-8k"
' Kimi (月之暗面)
Private Const KM_KEY As String = "你的-Kimi-Key"
Private Const KM_URL As String = "https://api.moonshot.cn/v1/chat/completions"
Private Const KM_MODEL As String = "moonshot-v1-8k"
窗体顶栏加了一个模型下拉框,选择后自动切换对应的 API 配置。核心切换逻辑统一放在 GetProviderConfig 函数里管理,结构清晰:
Private Sub GetProviderConfig(ByVal sProvider As String, _
ByRef sUrl As String, _
ByRef sKey As String, _
ByRef sModel As String)
Select Case sProvider
Case "通义千问"
sUrl = QW_URL: sKey = QW_KEY: sModel = QW_MODEL
Case "文心一言"
sUrl = WX_URL: sKey = WX_KEY: sModel = WX_MODEL
Case "Kimi"
sUrl = KM_URL: sKey = KM_KEY: sModel = KM_MODEL
Case "自定义"
' 从窗体读取用户填写的自定义配置
...
Case Else ' DeepSeek (默认)
sUrl = DS_URL: sKey = DS_KEY: sModel = DS_MODEL
End Select
End Sub
这种设计意味着你只需要配置一次 Key,之后在窗体里切换模型完全不需要改动代码。
自定义端点:接入任何 OpenAI 兼容 API
除了内置的四家,新版还支持“自定义”模式。在模型下拉框中选择「自定义」后,窗体会显示三个额外输入框:URL、Key、模型名称。
这可以覆盖几个现实场景:公司内部部署的私有化模型、其他 OpenAI 兼容平台、自建的模型服务。只要 API 格式兼容 OpenAI Chat Completions 标准,就能直接接入。
三、对话历史:AI 终于能“记住”你说过什么了
上一版的问题是单轮对话——你问一句,AI 答一句,互相之间没有关联。如果你说“帮我写一段 VBA 代码”,然后接着说“把它改成支持错误处理”,AI 并不知道“它”指的是什么。
新版引入了模块级变量 m_colHistory 来维护对话历史。每次提问时,所有历史消息都会一起发给 AI:
Private m_colHistory As Collection
Private m_sLastAnswer As String
Private m_sSessionId As String
每次提问的流程:
- 将用户消息追加到
m_colHistory。 - 把完整历史传入请求体,AI 就能理解上下文。
- AI 回复后,将助手消息也追加到历史。
点击「新对话」按钮,会重置整个历史集合,开启全新的会话。
数据库持久化:关掉 Access 也不丢
光有内存里的历史还不够。一旦关掉数据库,对话就全没了。
新版会自动创建 tblChatHistory 表,结构如下:
| 字段 | 类型 | 作用 |
|---|---|---|
| ID | 自增长 | 主键 |
| SessionID | 文本 | 会话标识,区分不同对话 |
| Provider | 文本 | 使用的 AI 模型 |
| Role | 文本 | user 或 assistant |
| Content | 备注 | 消息内容 |
| CreatedAt | 日期 | 创建时间 |
每次对话结束后,用户问题和 AI 回复都会自动写入这张表——不需要手动操作,也不需要额外配置。
表的创建也是全自动的。在首次运行 CreateAIForm 时,系统会检查表是否存在,不存在就自动建。用户完全不需要关心数据库结构。
历史会话管理窗体
有了持久化数据,自然需要查看和管理的入口。新增的 frmChatHistory 窗体通过主窗体顶栏的「历史记录」按钮打开,功能包括:
- 浏览会话:下拉框列出所有历史会话,按时间倒序排列,显示首条消息预览。
- 查看详情:选择某个会话后,在右侧区域以富文本格式展示完整对话内容。
- 加载对话:将历史会话加载回主窗体,继续之前的对话。
- 删除记录:删除不需要的历史会话。
这个窗体同样是程序自动生成的,运行 CreateHistoryForm 即可创建。
四、界面全面翻新:从“Access 味”到“AI 味”
上一版的界面是标准的 Access 窗体风格——灰色背景、默认按钮、传统控件布局。功能上问题不大,但打开的第一眼就能感觉到这是“传统 Access 窗体”。
既然是 AI 问答工具,界面体验也应该跟上。这次直接参考 DeepSeek 和 Gemini 的 Web 端设计,在 Access 窗体的能力范围内做了最大程度的还原。
具体改了什么
配色体系: 抛弃 Access 默认的灰色调,换成白色主背景 + 浅灰卡片 + 蓝紫色强调色 RGB(78, 108, 254)。整体观感干净清爽。
顶栏设计: 白色背景 + 极细分隔线,左侧放标题图标 ✦ AccessAI,中间放模型下拉框,右侧放「新对话」和「历史记录」按钮。布局参考了主流 AI 工具的顶栏。
回答区域: 大面积白色区域用于展示 AI 回复,极简边框,最大化阅读空间。
底部输入栏: 借鉴聊天界面的输入区设计,浅灰卡片包裹输入框,右侧是蓝紫色「发送」按钮。
自定义端点区: 选择「自定义」时,在顶栏下方展开一条浅色卡片,包含 URL、Key、模型三个输入框。不需要时完全隐藏,不影响正常使用。
整套配色常量在代码中统一定义:
cBg = RGB(255, 255, 255) ' 主背景 (纯白)
cSurface = RGB(247, 248, 250) ' 卡片/输入区
cBorder = RGB(228, 231, 236) ' 柔和边框
cText = RGB(29, 30, 32) ' 主要文字
cSubText = RGB(134, 142, 153) ' 次要文字
cAccent = RGB(78, 108, 254) ' 强调色 (紫蓝)
cAccentText = RGB(255, 255, 255) ' 强调色文字
虽然 Access 窗体的 UI 能力有限(没有圆角、没有阴影、没有动画),但通过合理的配色、间距和布局,依然可以做出不错的视觉效果。
五、技术要点回顾
这一轮更新涉及不少技术改动,挑几个值得讲一下的点。
1. 请求体如何携带完整历史
上一版的请求体只包含当前问题。新版需要把所有历史消息拼进去。实现方式是在 BuildRequestBody 中将 m_colHistory 集合遍历后写入 messages 数组:
Private Function BuildRequestBody(ByVal sQuestion As String, _
ByVal sModel As String, _
Optional ByVal bStream As Boolean = False, _
Optional colHist As Collection = Nothing) As String
如果传入了 colHist,就使用完整历史;否则回退单条消息。这样既支持多轮对话,也兼容单轮场景。
2. 会话 ID 的生成策略
每次开始新对话时,系统会生成一个唯一标识:
Private Function NewSessionId() As String
Randomize
NewSessionId = Format$(Now, "yyyymmdd_hhnnss") & "_" & CStr(Int(Rnd() * 10000))
End Function
用时间戳 + 随机数组合,确保在单机环境下不会重复。这个 SessionID 贯穿整个对话周期,也是数据库表中查询和删除的依据。
3. 历史记录表的自动创建
没有要求用户手动建表,而是在 CreateAIForm 中自动检测和创建。用 DAO 动态创建表定义、添加字段、建主键和索引。用户导入模块后直接运行 CreateAIForm 就能完成所有初始化工作,不需要碰数据库结构。
4. 窗体控件的动态显隐
自定义端点的三个输入框(URL、Key、模型名称)默认隐藏。当用户在下拉框选择「自定义」时,通过 cboProvider_AfterUpdate 事件动态控制可见性。这是 Access 窗体中常用的交互模式,但放在这里能显著提升用户体验——不选自定义时完全看不到多余的东西。
六、使用步骤(更新版)
第一步:导入模块
和上次一样,把两个 .bas 文件导入 Access 数据库:
JsonConverter.bas— JSON 解析库Module_Markdown.bas— 核心模块
第二步:添加引用
VBA 编辑器 → 工具 → 引用 → 勾选 Microsoft Scripting Runtime
第三步:配置 API Key
打开 Module_Markdown 模块,根据你要使用的模型,修改对应的常量。只需改你实际用的模型,其他保持默认:
' DeepSeek
Private Const DS_KEY As String = "你的-DeepSeek-Key"
' 通义千问
Private Const QW_KEY As String = "你的-通义千问-Key"
' 文心一言
Private Const WX_KEY As String = "你的-文心一言-Key"
' Kimi
Private Const KM_KEY As String = "你的-Kimi-Key"
第四步:创建窗体
在 VBA 立即窗口运行:
CreateAIForm
这条命令会自动创建 AI 问答窗体和历史记录数据表。完成后打开 frmAI,从顶栏下拉框选择模型,输入问题,点击「发送」即可。
七、项目文件说明
AccessAI/
├── AI.accdb # 示例 Access 数据库(含已导入的模块和窗体)
├── JsonConverter.bas # JSON 解析模块 (VBA-JSON v2.3.1)
├── Module_Markdown.bas # 核心模块:AI 调用 + Markdown 渲染 + 窗体生成 + 历史管理
└── README.md # 项目说明
运行后自动生成的对象:
| 对象 | 类型 | 说明 |
|---|---|---|
| frmAI | 窗体 | AI 问答主窗体 |
| frmChatHistory | 窗体 | 历史会话管理窗体 |
| tblChatHistory | 数据表 | 对话记录持久化存储 |
八、后续计划
这次更新基本解决了多模型和对话记忆的核心需求。后续还有几个方向在做:
- 系统提示词配置 — 让用户自定义 System Prompt,控制 AI 的角色和行为。
- 国外的大模型支持 — 内置国外系列模型的配置。
如果你有其他需求或建议,欢迎在 GitHub 上提 Issue。
九、总结
这次更新的核心变化可以总结为四句话:
- 四大模型随意切 — 不再绑定单一模型,内置 DeepSeek、通义千问、文心一言、Kimi,还能自定义接入。
- 对话有了记忆 — 支持多轮对话,AI 能理解上下文,对话记录还能持久保存。
- 历史可以管理 — 浏览、加载、删除历史会话,全部自动化。
- 界面焕然一新 — 从传统 Access 样式升级为 DeepSeek / Gemini 风格的现代 UI。
AccessAI 想做的事情始终没变:让 Access 开发者能用最低的成本,把 AI 能力接入现有系统。
两个模块、一行命令、几分钟搞定。不需要重写系统,不需要学新框架,在你熟悉的 Access 环境里就能完成。
完整源码
项目已开源,GitHub 地址:https://github.com/miaowei2/accessAI,包含:
Module_Markdown.bas— 核心模块(AI 调用 + Markdown 渲染 + 窗体生成 + 历史管理)JsonConverter.bas— JSON 解析模块AI.accdb— 示例数据库,导入即可体验
下载后直接导入即可使用,无需任何额外配置。
参考资料
- DeepSeek 平台:https://platform.deepseek.com/
- 通义千问(阿里云百炼):https://dashscope.console.aliyun.com/
- 文心一言(百度千帆):https://console.bce.baidu.com/qianfan/
- Kimi(月之暗面):https://platform.moonshot.cn/
- VBA-JSON:https://github.com/VBA-tools/VBA-JSON
写在最后
上一篇文章发出后,有不少朋友留言表示 Access 能接 AI 这件事本身就让人意外。确实,Access 在很多人眼里已经是“上一代工具”了。但现实是,大量企业的核心业务系统至今仍跑在 Access 上。
与其争论它是不是过时了,不如想办法让它跟上节奏。这次更新把多模型、对话记忆、持久化存储、现代 UI 全部打包带上了。下一步还会继续迭代。


