AccessAI 开源项目更新:新界面、多模型、对话上下文、历史管理

hi,大家好!

上次跟大家分享了 AccessAI 这个开源项目——用 VBA 给 Access 接上 AI 大模型。当时只支持 DeepSeek 一个模型,做的是单次对话,界面也比较朴素。

这次直接做了一轮大更新,从功能到界面全部升级。今天这篇文章就来聊聊更新了什么、怎么做的、以及为什么这么做。

一、这次更新了什么

先用一张表说清楚:

能力上一版新版本
AI 模型仅 DeepSeekDeepSeek + 通义千问 + 文心一言 + 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、模型名称。

这解决了几个实际场景:

  1. 公司内部部署的私有化模型。

  2. 其他 OpenAI 兼容平台(比如 OpenRouter、硅基流动等)。

  3. 自建的模型服务。

只要 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


每次你问一个问题:

  1. 将用户消息追加到 m_colHistory

  2. 把完整历史传入请求体,AI 就能理解上下文。

  3. AI 回复后,将助手消息也追加到历史。

点击「新对话」按钮,会重置整个历史集合,开始全新的会话。

数据库持久化:关掉 Access 也不丢

光有内存里的历史还不够。一旦关掉数据库,对话就全没了。

新版自动创建了 tblChatHistory 表,结构如下:

字段类型作用
ID自增长主键
SessionID文本会话标识,区分不同对话
Provider文本使用的 AI 模型
Role文本user 或 assistant
Content备注消息内容
CreatedAt日期创建时间

每次对话结束后,用户问题和 AI 回复都会自动写入这张表。不需要手动操作,也不需要额外配置。

表的创建也是全自动的——在首次运行 CreateAIForm 时,系统会检查表是否存在,不存在就自动建。

历史会话管理窗体

有了持久化数据,自然需要查看和管理的入口。

新版增加了 frmChatHistory 窗体,通过主窗体顶栏的「历史记录」按钮打开。功能包括:

  1. 浏览会话 — 下拉框列出所有历史会话,按时间倒序排列,显示首条消息预览。

  2. 查看详情 — 选择某个会话后,在右侧区域以富文本格式展示完整对话内容。

  3. 加载对话 — 将历史会话加载回主窗体,继续之前的对话。

  4. 删除记录 — 删除不需要的历史会话。

这个窗体同样是程序自动生成的,运行 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 数据库:

  1. JsonConverter.bas — JSON 解析库

  2. 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 的角色和行为。

  • OpenAI GPT 支持 — 内置 GPT 系列模型的配置。

如果你有其他需求或建议,欢迎在 GitHub 上提 Issue。

九、总结

这次更新的核心变化可以总结为四句话:

  1. 四大模型随意切 — 不再绑定单一模型,内置 DeepSeek、通义千问、文心一言、Kimi,还能自定义接入。

  2. 对话有了记忆 — 支持多轮对话,AI 能理解上下文,对话记录还能持久保存。

  3. 历史可以管理 — 浏览、加载、删除历史会话,全部自动化。

  4. 界面焕然一新 — 从传统 Access 样式升级为 DeepSeek / Gemini 风格的现代 UI。

AccessAI 想做的事情始终没变:让 Access 开发者能用最低的成本,把 AI 能力接入现有系统。

两个模块、一行命令、几分钟搞定。不需要重写系统,不需要学新框架,在你熟悉的 Access 环境里就能完成。


完整源码

项目已开源,欢迎 Star:

GitHub 地址:https://github.com/miaowei2/accessAI

包含:

  • Module_Markdown.bas — 核心模块(AI 调用 + Markdown 渲染 + 窗体生成 + 历史管理)

  • JsonConverter.bas — JSON 解析模块

  • AI.accdb — 示例数据库,导入即可体验

下载后直接导入即可使用,无需任何额外配置。


参考资料

  1. DeepSeek 平台:https://platform.deepseek.com/

  2. 通义千问(阿里云百炼):https://dashscope.console.aliyun.com/

  3. 文心一言(百度千帆):https://console.bce.baidu.com/qianfan/

  4. Kimi(月之暗面):https://platform.moonshot.cn/

  5. VBA-JSON:https://github.com/VBA-tools/VBA-JSON


写在最后

上一篇文章发出后,有不少朋友留言表示 Access 能接 AI 这件事本身就让人意外。确实,Access 在很多人眼里已经是"上一代工具"了。但现实是,大量企业的核心业务系统至今仍跑在 Access 上。

与其争论它是不是过时了,不如想办法让它跟上节奏。

这次更新把多模型、对话记忆、持久化存储、现代 UI 全部打包带上了。下一步还会继续迭代。

觉得有用?请帮忙点个「赞」和「在看」,转发给身边做 Access 开发的朋友,让更多人看到。

关注公众号「Access开发」,第一时间获取后续更新和更多 Access 实战内容。


需要培训或定制开发?找我们就对了

如果你的团队正在用 Access,或者计划用 Access 搭建业务系统,我们可以提供从培训到落地的全流程支持:

📚 技术培训

  • Access VBA 从入门到精通(线上/线下均可)

  • Access + SQL Server 企业级开发实战

  • Access 系统性能优化与架构设计

  • AI + Access 融合开发专题培训

💼 定制开发

  • 企业 ERP / CRM / 进销存 / WMS / MES 等系统开发

  • 旧 Access 系统升级、性能优化与架构重构

  • AI 能力集成到现有 Access 业务系统

🔧 技术支持

  • 代码审查与重构建议

  • 疑难问题远程诊断

  • 一对一技术辅导

无论是想让团队快速上手 Access 开发,还是需要把现有系统接上 AI,都可以直接联系我们聊聊方案。

联系方式: