AccessAI 开源项目更新:新界面、多模型、对话上下文、历史管理
hi,大家好!
上次跟大家分享了 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 兼容平台(比如 OpenRouter、硅基流动等)。
自建的模型服务。
只要 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 | 数据表 | 对话记录持久化存储 |
八、后续计划
这次更新基本解决了多模型和对话记忆的核心需求。后续还有几个方向在做:
如果你有其他需求或建议,欢迎在 GitHub 上提 Issue。
九、总结
这次更新的核心变化可以总结为四句话:
四大模型随意切 — 不再绑定单一模型,内置 DeepSeek、通义千问、文心一言、Kimi,还能自定义接入。
对话有了记忆 — 支持多轮对话,AI 能理解上下文,对话记录还能持久保存。
历史可以管理 — 浏览、加载、删除历史会话,全部自动化。
界面焕然一新 — 从传统 Access 样式升级为 DeepSeek / Gemini 风格的现代 UI。
AccessAI 想做的事情始终没变:让 Access 开发者能用最低的成本,把 AI 能力接入现有系统。
两个模块、一行命令、几分钟搞定。不需要重写系统,不需要学新框架,在你熟悉的 Access 环境里就能完成。
完整源码
项目已开源,欢迎 Star:
GitHub 地址:https://github.com/miaowei2/accessAI
包含:
下载后直接导入即可使用,无需任何额外配置。
参考资料
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 全部打包带上了。下一步还会继续迭代。
觉得有用?请帮忙点个「赞」和「在看」,转发给身边做 Access 开发的朋友,让更多人看到。
关注公众号「Access开发」,第一时间获取后续更新和更多 Access 实战内容。
需要培训或定制开发?找我们就对了
如果你的团队正在用 Access,或者计划用 Access 搭建业务系统,我们可以提供从培训到落地的全流程支持:
📚 技术培训
💼 定制开发
🔧 技术支持
无论是想让团队快速上手 Access 开发,还是需要把现有系统接上 AI,都可以直接联系我们聊聊方案。
联系方式: