该项目使用AI进行开发,以下是部分作者本人注释 一.关于软件 本软件支持llm语言模型和vlm视觉模型以及屏幕实时识别 二.关于记忆 本软件使用多llm模型并发进行记忆整理,ai会自动按设置整理并回顾记忆 再记忆整理的模块中,记忆被分割成了条目,每个条目都有关于时间和关于复杂程度的两个参数来注释 两个参数通过线性组合合并成新的参数,使用该参数作为记忆压缩与删除的依据(详见后续的说明) 三.关于使用 本软件有许多可调节的参数,但是用户只需要自备apikey即可使用预设的参数快速开始 四.关于更新 1.将加入tts语音识别与实时对话功能 2.将使用随机梯度下降算法以优化对于数量较多的记忆进行权重的整理 欢迎大家提出想要的功能 五.联系作者 xinghuangjun@gmail.com
以下是详细说明
方式 A:双击 start.bat
方式 B:命令行运行
python D:\a\llm_chat.py要求:Python 3.8+(自带 tkinter)。Windows 官方安装包默认已包含;Linux 如缺失可 sudo apt install python3-tk。
第一次打开会进入「连接你的大模型」设置页,顶部有一排常见服务按钮(OpenAI / DeepSeek / Kimi / 通义千问 / 智谱 / 硅基流动 / Ollama / LM Studio),点一下就会自动填好地址和示例模型名, 你只需补上自己的 API Key:
| 步骤 | 填什么 | 例子 |
|---|---|---|
| ① | 接口地址 Base URL | https://api.deepseek.com/v1、https://api.openai.com/v1 |
| ② | API Key(本地模型可留空) | 你自己的密钥 |
| ③ | 模型名称 | deepseek-chat、gpt-4o-mini、qwen-plus |
辅助按钮:
- 测试连接:立刻验证地址和 Key 是否正确;成功时会把服务端返回的模型列表灌进下拉框。
- 🔄 获取可用模型:调用
/models列出所有可用模型,点下拉箭头即可选择。 - 保存并关闭设置(页面最下方):校验并写入本机配置文件,然后进入对话页。 保存过一次之后,下次打开会跳过设置页,直接进入对话界面。
- 退出设置 ✕(页面右上角):放弃本次填写、不保存,直接离开设置界面。 已经配置过时立刻就退出(表单内容会还原成上次保存的配置);还没配置过会先问一句,因为退出后没有可用的接口。
对话页操作:
- 输入框里按 Enter 发送,Shift+Enter 换行。
- 停止:随时中断生成,已经吐出来的内容会保留。
- 设置 / 清空对话 / 导出对话:改配置、重置上下文、导出 Markdown。
- 回复里的灰色
💭 思考中…是推理模型(如deepseek-reasoner)的思维链,灰色小字展示,不混进正文。
设置页有两张可折叠的接口信息卡片(手风琴:展开一张会自动收起另一张):
| 大类 | 用途 | 默认状态 |
|---|---|---|
| 语言模型(LLM)接口信息 | 平时聊天用的模型 | 展开 |
| 视觉模型(VLM)接口信息 | 收到图片时先用它识别图片内容 | 收起 |
两张卡片的内容与格式完全一致:常见服务快捷标签、① 接口地址 Base URL、② API Key、③ 模型名称、 「获取可用模型」,以及各自的「测试连接」。不同点只有预设列表和按钮:
- 视觉模型的预设里没有 DeepSeek(它目前没有视觉模型),其余为
OpenAI
gpt-4o-mini、Kimimoonshot-v1-8k-vision-preview、通义千问qwen-vl-plus、 智谱glm-4v-flash、硅基流动Qwen/Qwen2.5-VL-7B-Instruct、Ollamallava:7b、LM Studio。 - 视觉模型卡片多了两个按钮:「测试连接」和「用 test.jpeg 试识别」
—— 后者会把程序目录下的
test.jpeg真正发给视觉模型,并把返回的描述弹窗显示出来, 一眼就能确认 VLM 到底能不能看图。 - 视觉模型是可选的:不配置时程序照常聊天,只是发图片会提示你先去配置。
在对话页的输入框左上角有一个 **「+ 图片」**按钮:
- 点它可以一次选多张图片(支持 jpg / jpeg / png / webp / gif / bmp);选中的图片会以标签形式列在
输入框上方,点标签上的
✕可以移除。 - 也可以把图片文件直接拖进输入框(Windows 原生拖放,用 ctypes 实现,不需要装任何库); 拖入非图片文件会被忽略并提示。
- 图片格式按文件头自动识别(不看后缀),例如
test.jpeg就是标准 JPEG; 即使把 WebP 命名成.jpg也能正确按image/webp发送,不会被服务端拒收。 - 单张图片上限 15 MB,超过会提示压缩;图片会以 base64 data URL 发送,只在本次请求中使用。
发送时的流程:
你在输入框里放了 2 张图 + 文字「这是什么?」
↓ 点发送
图片 1 → 视觉模型 → 描述 A
图片 2 → 视觉模型 → 描述 B (每张图一次请求)
↓
发给语言模型的内容 = "用户刚刚发送了一张(描述 A)的图片,用户刚刚发送了一张(描述 B)的图片,这是什么?"
↓
语言模型正常回答
- 每次发送后自动清空已上传的图片;想再发就重新选或拖。
- 可以只发图片不写字,也可以只发文字;两者都没有时点发送不会有反应。
- 对话里会显示一行
📎 已附加 N 张图片:…,以及灰色小字👁 xxx.jpg 识别结果:…, 方便你核对视觉模型到底看到了什么;本轮结束时状态栏会显示👁 已识别 N 张图片。 - 若没有配置视觉模型就发图片:不会发出任何请求,图片会保留在输入框,并在对话里提示你去配置。
- 若视觉模型调用失败(网络/额度/模型不支持看图):只在对话里提示失败原因,图片会自动放回输入框,改好设置后可重发。
设置页里有一个 「对话总结」 栏目,三个输入框都可以自己填写(留空或没填过就用默认值):
| 输入框 | 含义 | 默认值 | 允许范围 |
|---|---|---|---|
| 最多同时存在的总结文件(个) | userdata/record/ 里最多保留多少份 .md |
10 | 1 ~ 9999 |
| 单个总结文件的字数(字) | 每份 .md 的正文字数上限(只统计条目;文件头的生成时间/覆盖/说明不算) |
2000 | 200 ~ 200000 |
| 每(轮)对话后生成一次总结文件 | 多少轮对话触发一次总结 | 10 | 1 ~ 9999 |
| 每(次)聊天后对 AI 进行之前的对话内容复习 | 多少次聊天让模型先回顾一次历史总结 | 10 | 1 ~ 9999 |
- 点 「保存并关闭设置」 后立即生效,并写入配置文件(
review_rounds/summary_rounds/summary_max_files/summary_max_chars),下次打开自动读回。 - 填了非整数或超出范围时会拦下保存,并在页面下方给出提示(例如「「对话总结」里的「单个总结文件的字数」请填 200 ~ 200000 之间的整数。」)。
- 修改这三个值不会影响已有的
.md文件,只影响之后新生成的总结。
除了生成总结,程序还能让模型定期回看历史总结:
- 每聊满 M 次(M = 上面「每(次)聊天后对 AI 进行之前的对话内容复习」里填的值,默认 10), 本次提问会额外带上目前累积的全部记忆条目,并附一句说明:这是以前对话的总结、请先回顾、再回答用户的问题。
- 按原序号从小到大复习:复习时按条目的原序号升序(
1. → 2. → 3. …)列给模型, 与.md文件里「按 W 排序」的显示顺序无关 —— 序号是固定的,排序只影响文件里的排列。 提示词里也明确要求模型按原序号从小到大回顾一遍。 - 实现方式是往请求里插一条
system消息(在系统提示词之后、对话历史之前),不会污染多轮上下文, 也不会让模型在回答里复述这份总结(提示词里明确要求不要提到它)。 - 界面提示有两个地方:
- 聊天区在回答之前插一行浅色小字:
📖 已让模型回顾以前的记忆(按原序号 1~7 共 7 条、320 字); - 本轮结束时底部状态栏再显示
… · 📖 已复习历史总结 320 字。
- 聊天区在回答之前插一行浅色小字:
- 如果到达该次数时还没有任何
.md总结(例如复习次数比总结轮数小),本次自动跳过, 并在状态栏提示一行说明,不影响正常对话。 - 若某一轮同时满足「生成总结」和「复习」,会先写盘新总结,再用刚写好的这份去复习。
程序会在每满 N 轮对话时,自动调用你配置的这个模型,把最近 N 轮内容总结成一份 Markdown 文件。 这里的 N、单份字数、文件份数都由 「设置 → 对话总结」 里你自己填的数值决定(默认 10 轮 / 2000 字 / 10 份):
-
保存位置:程序主目录下的
userdata/record/(即D:\a\userdata\record\,目录不存在会自动创建)。 -
文件命名:以生成时间命名,例如
2026-10-12_21-11-16.md。若同一秒内重复生成会自动加_2后缀。 -
按条整理 + 序号 + 三个参数:正文每条一行,格式是
序号. 内容 T(x),L(y),W(z),例如:2. 用户要求把总结按条整理 T(0.33),L(0.48),W(0.41) 1. 用户在开发一个桌面聊天程序 T(1.00),L(0.52),W(0.76) 3. 用户现在要求每条带序号和 T、L、W 参数 T(0.00),L(1.00),W(0.50)t= 该条距最新一条消息的天数(保留 1 位小数、四舍五入;不足 1 天按 1 天计,这样最大 t 至少是 1,除数不会为 0);T = t ÷ 所有条目里最大的 tl= 该条的字数(含标点);L = l ÷ 所有条目里最大的 lW = k·T + (1-k)·L,k是「记忆优化」里的时间权重(0~1,默认 0.5)。 文件里的条目按 W 从小到大排列显示,但序号保持原样不变(上面例子就是排过序的样子: 显示顺序是 W 最小的第 2 条打头,序号仍然是 2 → 1 → 3)。 末尾带,D表示这条已经被精简过。- 三个数值都按 2 位小数显示,且 W 是用显示出来的 T、L 算的,手工核对能对上。
-
条目内容一旦生成就不再改动:每次总结只把新增内容整理成新条目追加在后面, 旧的条目原文一字不改,只重算它们的 T、L(所以时间越久,旧条目的 T 越大)。 相似合并只发生在同一批新增内容内部(不会去改旧条目)。
-
条目清单会随总结一起存成
xxx.items.json(和.md同目录、同名), 用来记住每条的时间与序号,重开程序后继续累加,新条目接着最大序号往后排。 若该文件被删掉,程序会退化成从.md正文里重新解析条目 (序号沿用正文里的编号,时间用文件时间近似)。 -
超出字数上限时,先走「记忆优化」(调用你配的精简模型,见下面「九点七」); 精简模型没配或调用失败时,才退化为丢弃 W 最大的几条兜底,并在文件头注明。新条目永远保留。
-
单份文件不超过你设定的字数(提示词里按该值的 90% 要求模型精简,超出按上面的规则处理)。
-
目录里最多同时存在你设定的份数:只有当写入时已达该份数,才会先删掉最早生成的那一份,再写新的。
-
第二份起:新总结会把这 10 轮 + 上一份 .md 的内容合并成一份连贯的新总结。
-
旧的
.md文件一律保留(不再删除),总结会逐份累积在userdata/record/里; 只有触发上面的「满 10 份」规则时,才会清理掉最早的那一份。 合并时参考的是最近生成的那一份(即紧邻的上一次总结),不是把目录里所有文件都拼起来。
生成时机(按你的要求实现):
- 到达设定的轮数时,先把 .md 文件写盘,再输出本次回复(总结发生在回复之前,所以本次回复不会出现在本份总结里)。
- 写盘与结果只在页面最下面的状态栏提示(聊天区不会插入任何总结提示行):
- 生成过程中:
正在总结最近 N 轮对话… - 本轮结束时:
✅ 完成 · 首字 0.02s · 总耗时 1.3s · 输出 56 字 · 📄 已生成总结 2026-10-12_21-11-16.md - 失败时:
⚠️ 对话总结生成失败:…(不影响继续对话),详细原因同时打印在启动程序的命令行窗口里。
- 生成过程中:
- 这份「边界回复」不会进本份总结,而是顺延到下一份总结,并放在下一批第 1 轮内容之前。
- 总结内容严格取「最近 N 轮」(N = 你在设置里填的轮数),不会越攒越多:
输入顺序为
上一批顺延的回复→最近 N 轮对话(含本轮提问)→已有历史总结。 中途改小轮数时,下一次触发就按新的 N 轮内容来总结。
其它细节:
- 总结是额外的一次模型请求(非流式、温度 0.3),会额外消耗一点额度;总结内容不会进入对话上下文。
- 总结期间状态栏显示「正在总结最近十轮对话…」,此时仍可点「停止」跳过本次回复(已生成的总结文件会保留)。
- 总结失败(网络/额度/模型不支持)只在界面提示一行,不影响继续对话,并会在 10 轮后自动重试。
- 点「清空对话」会重置轮次计数并删掉对话存档;关闭程序再打开会接着上次的轮次计数继续算,
也会自动读取
userdata/record/里最新的一份总结继续合并(详见下面「二点五、关闭程序不丢对话」)。
在「设置 → 可选设置」里有 「过滤模型的思考内容」 复选框,两种模式:
| 开关 | 界面表现 |
|---|---|
| 不勾选(默认) | 先用更浅更细的灰色小字输出思考内容(带 💭 思考中… 标题),再输出正式回复 |
| 勾选「过滤模型的思考内容」 | 思考内容完全不显示,只显示正式回复。思考期间状态栏提示「模型正在深度思考…(思考内容已按设置过滤)」,完成后显示「已过滤思考 N 字」 |
要点:
- 两种模式都会把思考内容从正文里剔除,所以它永远不会被回传给模型(不污染多轮上下文)。
- 不勾选时思考内容会记录在历史里,**「导出对话」**会以引用块(
>)形式一并写出;勾选后不记录,导出只有正式回复。 - 对话页顶栏会显示当前状态(
显示思考/已过滤思考),一眼能看出开关是否生效。 - 能识别的思考来源:① 服务端单独的
reasoning_content/reasoning字段(DeepSeek-R1 官方 API 等); ② 直接写在正文里的think/thinking/thought/reasoning/reason/cot/analysis/reflection标签(含 DeepSeek 模板里的\think\转义写法)。标签被流式分片切断(先来<thi再来nk>)也能正确识别; 正文里普通的<(例如「5 < 6」)不会被误判。
默认行为:关掉程序再打开,对话页面和 AI 的上下文都还在,接着聊就行,不需要重新粘贴历史。
- 存档位置:程序主目录下的
userdata/ui_state.json(打包版就是 exe 同目录)。 只存对话内容(你的消息、模型的回复、聊天区的样式),不存接口地址、也不存 API Key。 - 保存时机:每轮对话结束时和关闭窗口时各存一次(原子写入,写一半不会毁掉旧存档), 所以就算用任务管理器强杀,也最多丢最后一轮。
- 打开时自动接上:聊天区原样还原(含「你 / 助手 / 思考内容」的各种样式),
AI 上下文里的历史消息一起还原,底部状态栏提示
🕘 已恢复上次的对话(共 12 条消息);点「清空对话」才会清除。 - 只有你手动点「清空对话」才会清掉(会同时删掉存档文件并重置轮次计数)。
- 轮次计数也一起续上:比如设置是「每 5 轮生成一份总结」,聊了 3 轮后关掉再打开, 再聊 2 轮就会正常触发第 5 轮的总结(不会因为重开而重新从第 1 轮数起)。 同理,「每 M 次聊天复习一次」的次数也接着算。
- 想彻底重来:点一次「清空对话」(聊天区回到欢迎页,存档被删除)。
| 现象 | 原因与办法 |
|---|---|
| HTTP 404 | 地址写错,多数服务要求以 /v1 结尾;程序会自动重试「补 /v1」的地址,仍失败就用「测试连接」看具体报错。 |
| HTTP 401 | API Key 不对、已过期或没填。 |
| HTTP 429 | 请求太频繁或余额不足,稍后重试。 |
| 连不上服务器 | 检查网络、代理,或本地服务(Ollama / LM Studio)是否已启动。 |
| 模型名不对 | 点「🔄 获取可用模型」选一个真实存在的模型名。 |
| 看不到模型的思考过程 | 多半是在「设置」里勾选了「过滤模型的思考内容」,取消勾选即可。 |
| 提示「本轮模型只输出了思考内容」 | 模型把输出预算花在思考上就被截断了;取消过滤能看到它想了什么。 |
userdata/record/ 里没有文件 |
还没满「设置 → 对话总结」里填的轮数;或者总结请求失败了(状态栏会给出一行提示,下一轮到点会自动重试)。 |
| 总结文件会不会越攒越多 | 会逐份累积在 userdata/record/,最多保留你在设置里填的份数(默认 10);再生成新总结时才会先删掉最早的那一份。 |
| 关掉程序后对话没了 / 想换个话题重开 | 正常情况下关掉再开对话还在(见「二点五、关闭程序不丢对话」);想清空就点对话页右上角的「清空对话」。 |
| 感觉 AI 没有复习以前的总结 | 先确认 userdata/record/ 里确实有 .md 总结(没有就静默跳过,状态栏会提示);有的话聊天区会出现 📖 已让模型回顾以前的记忆(按原序号 …) 一行。 |
| 觉得总结多花了钱 | 每 N 轮只多一次请求;把「设置 → 对话总结」里的轮数调大(或目录 userdata/record/ 清空)即可。 |
| 三个输入框填错了 | 填非整数或超出范围(份数 1 |
本地模型示例(无需联网、无需 Key):
- Ollama:先执行
ollama pull qwen2.5:7b,地址填http://localhost:11434/v1,模型填qwen2.5:7b - LM Studio:地址填
http://localhost:1234/v1,模型填界面上显示的名称
- 配置文件位置看运行方式:
- 打包版 exe(便携模式):就在 exe 同目录的
llm_chat_config.json, 不写系统用户目录,换台电脑插上就能用,也不会读取/覆盖那台电脑上已有的设置; - 源码运行:默认仍在
C:\Users\<你的用户名>\.llm_gui_chat.json; 若想在源码运行时也便携,只需在程序目录放一个空的portable.txt,配置文件便改为同目录的llm_chat_config.json。 里面会记一个configured: true,表示「已经配置完成」——再次打开程序时会据此跳过设置页,直接进入对话界面。
- 打包版 exe(便携模式):就在 exe 同目录的
- 只有点击 「保存并关闭设置」 才会写入文件:点「退出设置 ✕」或直接关闭窗口都不会保存表单里的修改。 想改配置时,在对话页点右上角「设置」即可(改完还是要点一次「保存并关闭设置」)。
- 里面包含你的 API Key(明文),只在你自己电脑上;程序不会把它发到你填写的接口之外的任何地方。 公用电脑上建议不要保存,或使用后删除该文件。
- 对话内容只发给你填写的那个接口;程序本身不联网、无遥测。
- 本地落盘的数据一共四处,都只在你自己电脑上:
- 配置文件(含 API Key,明文);
userdata/record/里的对话总结.md与配套的.items.json(总结内容明文保存);userdata/ui_state.json—— 对话存档,只有对话内容,没有任何地址与 Key(见「二点五」);temppicture/—— 屏幕识别截下来的图片(只在用该功能时才有)。
python D:\a\llm_chat.py --selftest会在本机启动一个模拟 OpenAI 服务,自动验证:地址规范化、/models 拉取、非流式对话、SSE 流式逐字输出、
停止生成、错误提示文案。全部通过会打印「全部通过」。
- 对话本身是文本的(图片走「先 VLM 识图、再把文字交给 LLM」的路子);不支持语音、函数/工具调用。
- 「过滤思考」只影响界面显示与导出,不会改变模型本身的行为(想减少思考,请改用非推理型模型)。
- 思考标签是按常见命名识别的;若某个服务用了自定义标签,可用「设置 → 可选设置」取消过滤,
正文里会原样显示该标签(在
THINK_TAG_NAMES常量里加一个名字即可支持新标签)。 - Azure OpenAI 需要特殊的 URL 结构和
api-version参数,未完整支持(one-api / new-api 等中转站基本可用)。 - 只有单一会话上下文(没有多会话列表);点「清空对话」即可重置上下文。
- 「停止」是通过断开连接实现的,服务端可能已经开始计费。
本程序是从零原创实现,未复制任何第三方项目的代码;以下为它遵循的接口规范与资料来源, 所有名称、商标与许可归各自所有者。
- OpenAI Chat Completions API:请求/响应字段、
data: {...}加data: [DONE]的流式约定 https://platform.openai.com/docs/api-reference/chat 参考实现 openai-python(Apache-2.0 许可):https://github.com/openai/openai-python - Server-Sent Events 事件流格式:WHATWG HTML Living Standard 的 Server-sent events 章节 https://html.spec.whatwg.org/multipage/server-sent-events.html
- 思维链(思考内容)的返回约定:DeepSeek 官方文档的推理模型章节(
reasoning_content字段) https://api-docs.deepseek.com/guides/reasoning_model;正文内嵌...标签是 DeepSeek-R1 / Qwen3 等推理模型模板与各家中转站、vLLM / SGLang / Ollama 等推理后端的常见约定, 参见 Qwen3 官方仓库(Apache-2.0)https://github.com/QwenLM/Qwen3。\think\转义写法见 DeepSeek-R1 的 HuggingFace 聊天模板。
tkinter(图形界面)、urllib.request(HTTP)、json、threading、queue、zlib 均属 Python 标准库,
由 Python Software Foundation 发布(PSF License):https://docs.python.org/3/library/tkinter.html
视觉模型(VLM)预设(在语言模型预设基础上,去掉没有视觉能力的 DeepSeek):
- OpenAI 视觉输入(
gpt-4o-mini支持图片):https://platform.openai.com/docs/guides/vision - 月之暗面 Kimi 视觉模型
moonshot-v1-8k-vision-preview:https://platform.moonshot.cn/docs - 阿里云百炼通义千问 VL(
qwen-vl-plus,OpenAI 兼容模式):https://help.aliyun.com/zh/model-studio/developer-reference/compatibility-of-openai-with-dashscope - 智谱 GLM-4V(
glm-4v-flash):https://open.bigmodel.cn/dev/api - 硅基流动
Qwen/Qwen2.5-VL-7B-Instruct:https://docs.siliconflow.cn - Ollama 视觉模型(
llava:7b等):https://github.com/ollama/ollama- 消息格式沿用 OpenAI 的
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,…"}}: https://platform.openai.com/docs/api-reference/chat - 图片真实格式识别依据各容器格式的头部定义(JPEG
FF D8 FF、PNG89 50 4E 47、 WebPRIFF….WEBP、GIFGIF8、BMPBM)。 - 文件拖放用 Windows 的
WM_DROPFILES/DragAcceptFiles/DragQueryFile消息实现: https://learn.microsoft.com/windows/win32/shell/dragacceptfiles
- 消息格式沿用 OpenAI 的
语言模型(LLM)预设:
- DeepSeek:https://api-docs.deepseek.com(
deepseek-chat/deepseek-reasoner,https://api.deepseek.com/v1) - 月之暗面 Kimi:https://platform.moonshot.cn/docs
- 阿里云百炼通义千问 OpenAI 兼容模式:https://help.aliyun.com/zh/model-studio/developer-reference/compatibility-of-openai-with-dashscope
- 智谱 GLM:https://open.bigmodel.cn/dev/api
- 硅基流动 SiliconFlow:https://docs.siliconflow.cn
- Ollama 的 OpenAI 兼容接口(Ollama 项目为 MIT 许可):https://github.com/ollama/ollama/blob/main/docs/openai.md
- LM Studio OpenAI 兼容接口:https://lmstudio.ai/docs/api/openai-api
- LiteLLM(MIT):把上百家模型统一成 OpenAI 格式的成熟做法 https://github.com/BerriAI/litellm
- one-api / new-api(MIT):中转站的地址与鉴权兼容策略 https://github.com/songquanpeng/one-api
- Textual、Rich(均 MIT):更漂亮的终端界面方案,本程序为保持零依赖未采用 https://github.com/Textualize/textual、https://github.com/Textualize/rich
- 官方 SDK:
pip install openai(Apache-2.0)——同一套base_url+api_key可直接替换本程序中的chat_completion();若你需要图片输入、工具调用、自动重试等完整能力,推荐换成它: https://github.com/openai/openai-python requests(Apache-2.0):本程序用标准库urllib完成 HTTP,故不依赖它。
python llm_chat.py --selftest 在 127.0.0.1 起模拟 OpenAI 服务做端到端自测;
界面部分另用「控件几何审计 + 进程内窗口截图」校验排版(脚本仅开发时使用,不随程序发布)。
- 打包版 exe 默认就是便携模式:配置写在 exe 同目录的
llm_chat_config.json, 对话总结写在 exe 同目录的userdata\record\,日志写在 exe 同目录的llm_chat.log。 - 好处:
- 整个文件夹可以整体拷到 U 盘或别的电脑,设置与总结一起跟走;
- 不写系统用户目录,不会读取、也不会覆盖别的电脑上已有的设置,彼此完全隔离;
- 「卸载」= 删掉文件夹,不留残留。
- 注意:便携版要求 exe 所在目录可写(别放
C:\Program Files)。 - 源码运行时若也想要便携:在程序目录放一个空的
portable.txt即可。 - 自测报告里的「运行模式 / 配置目录」两行可直接看出当前用的是哪种模式。
聊天页输入框上方有一个 「📷 屏幕识别:开 / 关」 按钮,按下后会每隔 N 秒自动截一次屏幕, 并像你自己上传图片一样把它放进待发送图片里 —— 之后走的就是现成的「图片 → 视觉模型 → 语言模型」管线。
设置页里也有对应的 「屏幕识别」 折叠大类,可配置:
| 设置项 | 说明 |
|---|---|
| 启用屏幕识别 | 功能总开关(等于输入框上方那个按钮,两处联动;勾选后保存即生效) |
| 每隔 __ 秒截取一次 | 最小 3 秒,最大 3600 秒(默认 30) |
| 截取目标 | 整个屏幕,或点「选择窗口…」挑一个特定窗口只截它;还有「立即截一张」用来试效果 |
| 截图宽高减半 | 默认开启:文件更小、视觉 token 更省(关掉则是原始分辨率) |
截图只会上传,不会自动发送:每次截到的图片放进输入框的待发送图片里, 你按发送(或在输入框里打字后回车)时才会真正发给视觉模型 + 语言模型。
- 自动截图最多只有一张:每次截到新图,会先把上一张自动截图从待发送列表里移除, 所以你手动挑的图片还在,自动截图永远只有最新那一张。
- 截图存在程序主目录的
temppicture/(第一次使用时自动创建),文件名形如screen_20261014_175219.png;最多保留 10 张,超出时先删最早的那张。 - 截图以 PNG 上传,命名/标记为
📷 xxx.png,一眼能看出是屏幕识别来的; 发送后待发送图片会被清空(和手动上传图片一样)。
- 需要先配置 视觉模型(VLM)接口信息,否则截图无法识别(未配置时会在卡片里提示)。
- 截「整个屏幕」会把当前屏幕上的所有内容(包括其它窗口)拍下来,图片会先留在输入框里; 你按下发送才会把这张图发给模型,所以发送前可以先把敏感内容处理掉,或者删掉那张图的标签。
- 想只截某个软件界面,就点「选择窗口…」选中它 —— 程序按窗口标题回找窗口, 窗口关掉时会自动退化为整屏截图并在卡片里提示。
在设置页展开 「记忆优化」,可以给"压缩记忆"单独配一个模型:
| 设置项 | 说明 |
|---|---|
| ① 接口地址 Base URL / ② API Key / ③ 模型名称 | 精简记忆用的模型(格式与 LLM/VLM 卡片一致,含常见服务快捷标签与「获取可用模型」) |
| 记忆优化的时间权重 k | W = k·T + (1-k)·L 里的 k,0~1(默认 0.5) |
| 单次精简的记忆条数 x | 一次最多把几条记忆交给模型精简(默认 3) |
| 最多存在的记忆条数 y | 带 D 的记忆最多保留几条(默认 6) |
什么时候触发:每次生成记忆 .md 时,如果正文超过「单个总结文件的字数」或 2000 字
(取两者中较小的那个),程序就会调用上面配的模型,把 W 最大、末尾还没带 D 的最多 x 条记忆
逐条精简(保留关键事实与数字),压到字数达标为止;精简过的条目在 W 后面加 ,D
(如 W(0.42),D),其它条目一字不动。
带 D 的太多怎么办:当带 D 的记忆条数超过 y 时,程序会删掉其中 W 最大的 y/2 条
(向下取整、至少 1 条)——因为 W 越大表示越旧/越长。
其它细节:
- 如果精简模型没配(或调用失败),程序会记一行日志,并退化为丢弃 W 最大的几条兜底, 保证记忆文件不会无限膨胀、也绝不会因为优化失败而写不出文件。
- 每次生成新的
.md都会重新计算所有条目的 T、L、W 并按 W 重新排序;序号保持不变(条目文字本身也不变)。AI 复习时按原序号从小到大读。 - 优化动作会写进文件头的「覆盖」行,例如
本次新增 3 条,累计 9 条;已精简 2 条(标 D);已删除 1 条带 D 的记忆。
小贴士:
- 单文件 exe 首次启动要先把运行时解压到临时目录,比后续启动慢 3~5 秒,属正常现象。
- 自制的 exe 没有代码签名,Windows SmartScreen 可能提示风险(选「更多信息」→「仍要运行」); PyInstaller 产物也常被杀毒软件误报,加白名单即可。
- 验证打包结果是否完好:在 exe 所在目录执行
忆言.exe --selftest, 会生成selftest-report.txt,全部 ✅ 即功能正常。 - 打包版没有控制台窗口,运行期出错会写入 exe 同目录的
llm_chat.log。