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风格的现代用户界面。
AccessAI一直想做到的事从来都没改变,那就是,让Access开发者能够用上最低的成本,将AI能力接入到现有的系统当中。
分成两个模块,执行一行命令,只需几分钟便可搞定它。既不需要对系统进行重新编写,也不需要去学习新的框架,在你所熟悉的 Access 环境当中就能够将其完成。
完整源码
项目已开源,欢迎 Star:

相关标签: # AccessAI # 开源项目 # AI模型 # 对话上下文 # 历史管理