仿真运行中 云端记忆:连接中 AI 自动托管
第 1 天 06:00 进化世代 G0 · 配方 P0 语音助手 · 未启用
空气温度 适宜
23.0℃
目标 23.0 ℃
空气相对湿度 适宜
68%
VPD 0.90 kPa
基质温湿度 适宜
70%
基质温 20.5 ℃
CO₂ 浓度 适宜
800ppm
补气中
光照 PPFD 光期
280μmol
DLI 13.1 mol/㎡·d
本周期预估 仿真预测
0.00kg/株
BX-01 实测 7.5 °Bx

环境时序

最近 48 小时 · 传感器采样
空气温湿度 / CO₂ / 光照
气温 ℃湿度 %CO₂ (÷10 ppm)PPFD (÷2)

执行设备

空调 / 水肥一体机 / CO₂ / LED / 换气扇
AI 接管中

YOLO 视觉质检

花 / 果 / 叶 / 病斑 · 不含糖度 · 独立权重
仿真推理
CAM-01 · 栽培槽 A 区仿真推理 · 未接真实权重
花朵数 / 平均花径
0 朵 · 0 mm
果实数 / 平均果径
0 枚 · 0 mm
成熟果占比(色泽分级)
0 %
病虫害严重度
0 %
摄像头离线 未接入
浏览器不支持 RTSP:画面由服务端 OpenCV 抓帧转 MJPEG,检测框由本页按归一化坐标叠加。未启动摄像头时保持仿真或单图推理,不会伪装成实时画面。

无损测糖仪 BX-01

NIR 漫反射光谱 · 独立采样链路
已标定
批次平均糖度(实测)
8.3 °Bx
抽样果数 / 标准差
24 枚 · ±0.60
单果糖度分布(°Bx)
区间 7.4 – 9.2 标定 2026-10-28 采样 D1 06:00
糖度由无损测糖设备实测,不参与 YOLO 视觉推理。视觉链路只输出计数、尺寸、成熟度分级与叶部病虫害;两条数据独立采集、独立入库,在分析层才做关联。

Agent 决策流

感知 → 分析 → 决策 → 执行 → 验证

适应度演化曲线

每代最优 / 种群均值
等待首代评估
世代最优适应度种群平均基线配方 F

当前最优环境配方

与初始基线对照
P0 基线

世代记录

每一代 = 一个完整生长周期(压缩仿真 24 天)
0 代
世代最优 F产量 kg糖度 °Bx (BX-01)商品果率病害率能耗 kWh主要变化
尚未评估任何世代,点击下方「运行一代」开始进化

进化引擎状态

假设 → 验证 → 记忆 → 选择 → 变异
当前世代
G0
历史最佳适应度
—
种群规模
8 个候选配方
变异幅度 σ
0.16
运行机制
每个候选配方在数字孪生中跑完一个完整生长周期,用「产量 38% / 糖度 27% / 商品果率 22% / 能耗 9% / 病害 8%」的适应度函数打分。前 2 名精英保留,其余通过锦标赛选择、基因交叉与高斯变异产生下一代。所有基因受硬边界约束,避免优化出伤害作物的配方。
糖度项来自无损测糖仪 BX-01 的独立实测值,YOLO 视觉链路不参与糖度计算。
每次评估使用配方哈希作为随机种子,同一配方的仿真结果可复现。

Agent 智能诊断

大模型基于当前数据给出种植建议
待调用
点击「生成诊断」,Agent 会汇总当前环境、YOLO 视觉质检、BX-01 无损测糖实测值与历代进化数据,交给大模型分析并给出可执行的调整建议。

设备接入清单

5 类执行器 · 4 类环境传感器 · 2 类质检设备 · 1 类语音交互
当前为数字孪生仿真
设备 / 点位类型作用典型协议状态
空调机组 HVAC-01执行器制冷 / 制热 / 除湿Modbus TCP · 4xxxx在线
水肥一体机 FERT-01执行器灌溉量 / EC / pHModbus RTU · 03/06在线
CO₂ 控制器 CO2-01执行器补气阀开度MQTT · cmd/co2在线
LED 种植灯 LED-01~08执行器光强 / 红蓝光谱 / 光周期MQTT · cmd/led在线
换气扇 FAN-01~02执行器风速 / 除湿 / 换气Modbus TCP · coil在线
空气温湿度 TH-01~06传感器气温 / 相对湿度 / VPDMQTT · tele/th在线
基质温湿度 SUB-01~06传感器基质温度 / 含水率 / ECMQTT · tele/sub在线
CO₂ 浓度 CO2-S01传感器ppm 实测MQTT · tele/co2在线
光照强度 PAR-01~04传感器PPFD / DLIMQTT · tele/par在线
网络相机 CAM-01~04质检设备实时抓帧 → YOLO(不测糖)RTSP → MJPEG 代理待接入
无损测糖仪 BX-01质检设备单果糖度 / 批次分布(NIR 光谱实测)HTTP REST · /measure在线
语音终端 VOICE-01交互设备「贵贵」唤醒 / 中文指令识别 / 结果语音播报(不写执行器)Web Speech · HTTP 8200播报关闭

网关 / 推理 / 检测服务配置

从仿真切到实机时填写

YOLO 模型注册表与版本升级

v1 开源数据训练 · 产线数据迭代 v2+
独立权重
视觉层已拆成独立服务
检测模型不再写在页面里:权重文件放 vision/models/,由 vision/serve.py 加载,Agent 只通过 HTTP 拿标准检测 JSON。换模型不动 Agent 代码。
模型任务v1 训练数据来源许可
organ · 花/果/成熟度Sycamorers/Strawba-YOLO-Dataset
1,928 张 / 40,665 框 / 5 类 · 佛罗里达田间俯拍
未声明
disease · 病虫害/缺素Ethan0300/Strawberry_12-dataset
3,906 张 / 16,107 框 / 12 类 · 温室+露地
MIT
在带 GPU 的电脑上训练(把 vision/gpu_kit/ 整个文件夹拷过去)
1. 装 CUDA 版 torch:先 nvidia-smi 看驱动支持的 CUDA 版本,再 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128,然后 pip install -r requirements.txt。torch.cuda.is_available() 必须返回 True;本机是 +cpu 版,别直接拷 site-packages。
2. 整理数据集:已是 YOLO 格式就改 data.yaml(path / names / nc);COCO 或 VOC 用 convert_to_yolo.py --format coco|voc --root <源> --out <目标> 转换,脚本自动划分并生成 data.yaml。
3. 先预检再开训:python check_dataset.py --data data.yaml,检查目录层级、类别 id 越界、框坐标归一化、train/val 同图泄漏。
4. 训练:python train_gpu.py --data data.yaml --task organ --version v2 --model yolov8n.pt --epochs 100 --imgsz 640 --batch 16。类别不变、只加产线数据时改 --model strawberry_organ_v1.pt 继承 v1 微调(把 vision/models/ 权重一起拷过去);离线机器还要带 models/base/yolov8n.pt。显存不够就调小 --batch 或设 -1 自动选。
5. 带回来:把 out/ 里的 .pt 与 train_report.json 拷回本机 vision/,执行 python deploy_model.py --report train_report.json --activate --verify;报告里的类别、imgsz、epochs、GPU 信息与 test 集实测 mAP 会自动写进注册表。
GPU 训练的硬约束
类别顺序:data.yaml 的 names 顺序必须与标注 txt 第一列一致;用 v1 权重微调时还需与 v1 的 5 类 / 12 类完全一致,脚本会拦截不一致并拒绝启动。
指标可比性:自有数据集训出的 mAP 与开源数据训出的 v1 不在一个测试集上,不能横向比较;上线前用产线抓帧做影子 A/B。
续训与导出:--resume <last.pt> 断点续训,--export-onnx 顺带导出 ONNX 供边缘设备部署。
对接新版本 YOLO:两条路径,页面代码都不用改
路径 A · 在本机训练:POST /samples 回灌现场图 → 标注 → 生成 data.yaml → python train_v1.py --task organ --version v2 --data datasets/production/data_organ.yaml --epochs 60。 脚本评估 test 集、写 registry.json、自动把 active 指向 v2;推理服务每帧重读注册表,无需重启。
路径 B · 在别的机器(如 GPU 服务器)训好权重拷回来:python deploy_model.py --weight best.pt --task organ --version v2 --activate --verify。 工具自动读类别名、校验权重可加载、复制到 models/、注册版本、热切换并跑一次真实 /infer 验收。不加 --activate 就是影子模式,只注册不切流,可先 A/B 对比。
常用:--list 看所有版本 / --switch organ_v2 切换 / --rollback --task organ 回滚 / --reload 强制重载 / --eval --data <data.yaml> 补测真实 mAP。
切新模型的四个检查点
1. 类别契约:成熟果占比与中文标签依赖类别名。v2 若改了类名,把 class_map.suggested.json 的 labels / ripe / flower 合并进 vision/class_map.json(服务热加载,不用重启),否则花朵数或成熟果占比会算成 0;
2. 分辨率:v2 若不是 320px 训练,须带 IMGSZ=640 python serve.py --port 8000 重启服务,热切换改不了分辨率;
3. 指标诚实性:外部权重未评估时界面显示「未评估」,不会借用 v1 的 mAP;用 --eval 补测,不同数据集的 mAP 不可横向比较;
4. 前端刷新:页面只在启动时自动探测一次,切换后点模型条的「重新连接」或刷新页面,才会显示新版本号、mAP、权重文件与许可。
商用许可提醒
Strawba 花果数据集仓库未声明许可,v1 仅限研究与原型。商业部署前建议换成明确开放许可的数据:芬兰 Luke / Ultralytics Platform 的草莓检测集(CC BY 4.0,813 张,成熟果+果柄)、Roboflow tabletop-strawberry(CC BY 4.0,flower/ripe/unripe 3 类),或直接用本厂标注数据,再执行 train_v1.py --data <新 data.yaml> 重训。
训练与升级链:vision/gpu_kit/(GPU 机器训练)→ vision/prepare_data.py → vision/train_v1.py(本机训练)→ vision/deploy_model.py(回挂 / 外部权重)→ vision/serve.py;版本真相在 vision/registry.json,类别语义在 vision/class_map.json,切换历史在 vision/deploy_history.json。

网络摄像头实时接入

RTSP / HTTP → 服务端代理 → 页面
已实现
为什么不能直接把 RTSP 地址填进网页
浏览器既不支持 RTSP 协议,也不该持有摄像头账号密码(会明文暴露在前端、且 IPC 的 CORS 通常直接拒绝)。 本系统由 vision/serve.py 内的采集线程用 OpenCV 取流,转成 multipart/x-mixed-replace 的 MJPEG 推给 <img>, YOLO 检测在独立线程跑,结果通过 /camera/latest 回传,前端用同一份 JSON 叠加中文检测框并更新品质指标。
三种启动方式
1. 页面:实时总览 → 摄像头面板填地址 → 「启动实时检测」;
2. 命令行:python vision/serve.py --port 8000 --camera "rtsp://user:pass@192.168.1.64:554/Streaming/Channels/102" --camera-fps 12 --camera-infer-interval 1;
3. API:POST /camera/config {"url":"rtsp://...","enabled":true,"target_fps":12,"infer_interval":1}。
常见地址:海康 rtsp://user:pass@IP:554/Streaming/Channels/102(子码流)、大华 rtsp://user:pass@IP:554/cam/realmonitor?channel=1&subtype=1、HTTP MJPEG http://IP/cgi-bin/mjpeg?stream=0。 无摄像头可用 image:/绝对路径/frame.jpg 或 images:/目录 调试链路;本机 USB 摄像头填 0。
接口一览
GET /stream.mjpeg(带框)· GET /stream.mjpeg?raw=1(原图,页面用)· GET /camera/status(FPS / 重连 / stale)· GET /camera/latest(检测 JSON + 帧时滞)· GET /camera/frame?raw=1(单帧)· POST /camera/snapshot(抓图存 samples/ 供 v2 标注)· POST /camera/stop。配置持久化在 vision/cameras.json,URL 中的凭据对前端脱敏。
实时检测的六条边界
1. 帧率 ≠ 检测率:画面按 target_fps 推,YOLO 按 infer_interval 单独节流;本机 CPU 双模型约 0.2–0.3 秒/帧,不要设成每帧都推理。
2. 过时帧不驱动闭环:断流超过 stale_after 秒,状态置 stale,页面自动回退仿真;控制台读数不得直接用于环境控制。
3. 结果有时滞:检测框对应稍早的帧(detect_lag_frames),快速移动/云台转动时会错位,固定机位最准。
4. 单帧计数 ≠ 全槽产量:花果数是当前视野可见数量,多机位会重复计数;接入产量模型前须做去重与视野覆盖标定。
5. 尺寸标定:mm/px 依赖固定工作距离、焦距与分辨率,务必用产线标尺重新标定,否则果径不能用于商品果分级。
6. 安全:cameras.json 含明文凭据,需限制文件权限、禁止入库;当前服务仅监听 127.0.0.1 且无鉴权,跨机部署必须补 HTTPS、Token、网络隔离与 NTP 时间同步。

语音识别与播报

ASR 指令 / TTS 播报 · 与视觉、测糖链路解耦
已实现
「贵贵」唤醒会话(默认交互方式)
点一次「唤醒贵贵」授权麦克风后即常驻监听:待唤醒 → 听到「贵贵」→ 请说指令 → 识别并执行 → 语音播报结果 → 回到待唤醒。支持一句话直达「贵贵查温度」;说「退出唤醒」或再点按钮立即释放麦克风。
实现上用 MediaRecorder 把每 2.2 秒(指令段 4.2 秒)录成独立完整 webm,先用 Web Audio Analyser 做能量 VAD,静音片段不送 ASR,车间常态安静时几乎不占算力;只有命中唤醒词才把下一段当指令。播报期间设静音窗,防止喇叭声音被自己录回去造成自激;唤醒确认用 0.3 秒提示音,不占用麦克风时间。唤醒词可在设置里改,Whisper 常写的「桂桂 / 龟龟 / 貴貴」等同音与繁体字已做容错。
指令回复一定念出来:唤醒是明确的主动交互,会话内的执行结果会绕过「默认静音」与免打扰时段;自动告警在此期间暂停,不抢话。
响应时延:本机为 2 核 4 线程且内存紧张,base 模型单次转写实测 2–8 秒,随整机负载波动;前端已用 VAD 让静音片段完全不送 ASR、尾端静音提前收段。若唤醒明显偏慢,可改用 python vision/voice_service.py --asr-model tiny(约快 3 倍,但中文同音错字增多,指令纠错层会尽量兜住)。
两条链路,一条默认可用,一条可选离线
识别 ASR:默认走浏览器 SpeechRecognition(zh-CN),零部署、点开即用;识别出的文字交给本地白名单指令解析器,不调用大模型、不上传录音。
播报 TTS:默认走浏览器 speechSynthesis,优先选中文语音;带优先级队列(告警 > 指令回复 > 常规)、同类去重冷却、免打扰时段。平时默认静音;点「唤醒贵贵」时会在用户手势内自动开启,指令结果随即念出来,也可手动开关,避免浏览器自动播放策略与车间误播。
边缘模式(可选,服务器已部署):python start_web.py --with-voice 一键起页面 + 8200 服务;或单独 python vision/voice_service.py --port 8200 --warmup。页面探测到本地 ASR 会自动切换识别后端,也可点「切换离线识别」。装 faster-whisper(本地转写)+ pyttsx3(系统本地合成)时,全链路不出局域网,适合无外网、噪声大、录音不便外发的车间;追求音质可改用 edge-tts,但它要访问微软在线服务,不算离线,/health 里的 offline_tts 会如实标成 false。服务没装依赖时返回结构化错误,前端自动回退浏览器原生,不会假装成功。
接口一览(经同源 /api/voice 代理,后端仅监听 127.0.0.1:8200)
GET /health(服务与后端可用性)· POST /voice/asr {"audio":"<base64>","format":"webm"}(返回 text / 置信度)· POST /voice/tts {"text":"…"}(返回音频 base64)· GET /voice/voices(可用中文音色)。 请求体上限 8 MB、文本上限 500 字,服务只做转写与合成,不接触设备网关、不写数据库。
语音能做什么
查询:温度、湿度、CO₂、光照、基质、BX-01 糖度、花果数、病害、产量预估、当前配方/世代、摄像头状态、YOLO 版本、系统状态总览。
操作:暂停/继续/单步、人工接管/交还 AI、运行一代/十代、重新测糖、生成诊断、启动/停止摄像头、抓图、切换页面、导出数据、开关播报。
所有读数都取自 Live.env / Live.vision / Live.brix / Evo 当前值,播报里会说明「仿真」还是「真实权重」,不编造实测数据。指令与播报会写进 agent_memory(kind=voice),可回溯谁在什么时候让 Agent 做了什么。
六条硬边界
1. 不下发设备指令:语音只能触发页面已有的查询与按钮级操作,不能直写执行器、不能改配方基因;实机控制仍须经过网关互锁与人工急停。
2. 不用于安全联锁:车间噪声、方言、回声会让识别率波动,语音告警只是提示,阈值保护必须由 PLC / 控制器硬逻辑承担。
3. 权限与隐私:浏览器原生识别通常把音频送到浏览器厂商的在线服务;file:// 或 HTTP 非 localhost 页面拿不到麦克风,需用 localhost / HTTPS。涉密车间请用 faster-whisper + pyttsx3 的全离线组合,不要用 edge-tts。
4. 播报节制:日志类播报按类型 30 秒节流,环境越界告警按点位 5 分钟冷却,22:00–07:00 只记录不发声,防止同一句话刷屏。
5. 中文音色:浏览器 TTS 的音色由操作系统决定,无中文语音时可能读不出汉字;边缘模式可指定 zh-CN-XiaoxiaoNeural 等音色。首次发声必须由用户点击触发。
6. 唤醒词不是安全口令:同音容错提高命中率的同时也提高误触率,因此语音只触发页面白名单操作,绝不直写执行器;唤醒会话随时可一键结束并释放麦克风。
外部浏览器「点了没反应 / 叫不醒贵贵」的排查顺序
1. 先看打开方式:必须走 http(s)://服务器地址:端口/index.html(同源,勿用 file://)。运行 python start_web.py --with-voice(或双击 start_web.bat)会同时起页面与 8200 离线语音服务;直接双击 index.html 用 file:// 打开,浏览器会静默拒绝麦克风,界面表现就是点了没反应。
2. 再看在线识别服务:Chrome / Edge 的原生 webkitSpeechRecognition 把音频送到境外在线服务。本机实测 google.com 与 speech.googleapis.com 均连接超时,因此原生识别必然报 network,不是代码故障。点面板「语音自检」可看到红色阻断项。
3. 用离线服务:本机已装 faster-whisper(中文 base 模型,实测「查温度」识别准确;--asr-model tiny 更轻但会出同音错字)+ pyttsx3(系统 Microsoft Huihui 中文音色),并预置 hf-mirror.com 镜像与本地模型缓存。启动 8200 后页面会自动切换识别后端;也可点「切换离线识别」。换机器时执行 pip install faster-whisper pyttsx3。
4. 麦克风权限:地址栏右侧的麦克风图标设为「允许」;被拒过一次要去站点设置里改回允许。localhost / HTTPS 才会弹授权。
5. 看唤醒会话状态条:点「唤醒贵贵」后应显示「待唤醒」;说「贵贵」后变「请说指令」,此时再下指令。播报期间暂停收音,等它念完再说;想立刻静音就说「退出唤醒」。首次发声由这次点击授权,不用再单独点「开启播报」。
6. 叫不醒时先看「最近唤醒片段」:面板里这段流水会逐条显示 丢弃(未检测到足够人声)/ 跳过(播报静音窗)/ 送ASR / 听到 / 未唤醒 / 已唤醒,并附上该段峰值与自适应阈值——能直接看出是麦克风电平太低、声音被切段、ASR 没认出,还是唤醒词没匹配上。旧版固定窗口硬切 + 固定 0.012 阈值会把轻声的「贵贵」整段丢掉,现已改为自适应底噪阈值、检测到声音才起算、尾静音才收段。
7. 绕过唤醒词:点「手动唤醒(叫不醒时点这里)」直接进入「请说指令」,仍可用语音下指令并听结果;这是唤醒词识别不稳时的兜底入口。另外「识别后端」下拉框现在不再影响唤醒会话:只要 8200 离线 ASR 在线就会自动接管,避免手动选过「浏览器原生」后永久走不通的在线服务。
8. 还不行:看「语音自检」的唤醒循环 / 离线 ASR 两行与「指令与播报记录」;python vision/voice_service.py --self-test 可确认后端。这台机器 2 核且负载偏高,base 模型单段转写约 4~17 秒,说完请等 1~2 秒再继续;明显偏慢可换 --asr-model tiny。文字输入框始终可用,功能与语音指令等价。
0. 最常见的原因:服务没在运行 —— 页面能打开不代表 8200 在线。语音服务是本机独立进程,必须运行 start_server.bat / start_server.sh 并保持终端开启;关掉窗口、重启电脑、或关闭会话都会让服务停止。面板顶部有「离线语音服务已连接 / 未启动」状态灯,每 15 秒刷新一次。喊不醒时先点「点击说话(免唤醒词)」验证录音与识别链路,再点「复制诊断报告(发我定位)」把真实流水发出来;服务端同时会把流水写到 voice_debug.log。
入口:右下角「语音助手」或顶栏状态条 → 点「唤醒贵贵」→ 说「贵贵」→ 说指令 → 听结果。浏览器不支持语音识别时,仍可用面板里的文字输入框完成全部指令(功能等价,只是不用嘴)。

接线说明

当前版本:环境为数字孪生,视觉可接真实权重
设备状态、传感器读数、无损测糖读数由内置模型生成;YOLO 检测默认走仿真,检测到本地推理服务后自动加载 v1 真实权重,也可手动连接/断开。好处是整套闭环(含多代进化)可以离线跑通、结果可复现。

接真机需要补的四处
1. 驱动层:把 Sim.stepEnv 的虚拟设备出力换成网关下发指令,把传感器读数换成网关订阅数据;
2. 视觉层:已实现 Vision.connect / inferFromDataUrl 对接独立 /infer 服务,并已接入网络摄像头实时流(vision/camera.py 抓帧 → /stream.mjpeg 推原图 → 前端叠加中文检测框);实机只需填 RTSP 地址、按产线标尺重做 mm/px 尺寸标定、补多路点位与鉴权;
3. 测糖层:把 NirMeter.measure 换成对无损测糖仪 BX-01 的独立读取(°Bx + 样本分布 + 标定状态),与视觉链路分开采集、分开入库;
4. 安全层:实机必须加设备互锁、上下限硬性保护、指令超时回退和人工急停,不能让进化算法直接写执行器。

批次结算录入

真实采收数据 · 用于校准仿真
仅本机
关联配方的 9 个基因会随批次一起保存,校准时按该配方重跑仿真。

机理模型校准

实测 → 拟合残差系数 → 回灌评估
未校准
实测批次
0
拟合方式
—
生效世代
—
输出项缩放 k偏置 bLOO 前 MAELOO 后 MAE
录入至少 1 个批次后即可执行校准。
校准边界
只校准输出的缩放与偏置,不改光合/糖度/病害的机理公式,也不改适应度权重。样本 < 5 批只做加法偏置(避免过拟合),≥ 5 批才启用带截距的最小二乘;留一法交叉验证若显示误差变大,系数会保存但不自动启用。校准启用后,后续世代的适应度改用校准口径,此前世代分数保留旧口径,两段不可直接比较。

批次记录 · 实测 vs 仿真

偏差 = 实测 − 校准后预测
0 条
批次配方产量实测原始仿真校准后偏差糖度实测校准后偏差
还没有批次结算数据。采收后录入总重、商品果率与 BX-01 实测糖度,即可开始校准。

数据链路说明

阶段 1 · 批次结算
每条记录保存该批次实际执行的 9 基因配方快照与采收结果,写入本机 localStorage 与云端 agent_memory(kind=harvest)。产量按「总重 ÷ 株数」折算为 kg/株,与仿真口径一致。

阶段 2 · 模型校准
用「同一配方 → 原始仿真输出」与「实测输出」配对,拟合产量、糖度、能耗的缩放系数和偏置,以及病害率偏置。校准层作用于 simulateCycle() 的返回处,因此进化评估、实时预测、视觉/测糖派生值与大模型诊断 payload 会同步使用校准结果。

阶段 3 · 试验寻优
「试验寻优」页用实测残差修正仿真评分,按期望提升 / 置信上界生成候选配方,再产出随机化完全区组(RCBD)的 A/B 试验单。采收后在表单里选「关联小区试验」并按建议批次编号结算,系统按实测适应度判定胜负;只有处理组实测胜出、且经人工二次确认,配方才会进入进化种群。

阶段 4 · 大模型提议
「AI 配方提议」页把实测批次、校准状态、试验结论与农艺先验打成只读 JSON 交给大模型,要求返回严格 JSON 的 9 基因候选。返回后先做字段校验、硬边界裁剪与去重,再用校准仿真预筛;提议默认「未验证」,必须经小区 A/B 实测胜出(或显式切换到已验证校准模型路径)并人工二次确认,才替换 Evo.pop 最弱候选。

仍然没有做的事
不改机理公式、不改适应度权重、不训练或微调大模型、不让大模型直接下发配方或设成当前最优;非法 JSON 输出不产生任何候选。大模型始终是「提议者 + 只读顾问」,评估权交给数据与试验。

采样建议
每个批次尽量覆盖不同配方(尤其是温差、CO₂、光周期有差异),否则所有样本的自变量几乎相同,回归系数不可靠。能耗与病害率可留空,留空时不参与拟合。

阶段 3 · 候选配方提议器

实测残差 + 采集函数 → 下一批该试什么
无实测批次
尚未生成候选。
数据边界
代理模型的均值来自数字孪生仿真(若已启用阶段 2 校准则为校准口径),只用实测批次做近邻残差修正和不确定性估计;不是在高维空间上拟合高斯过程,也不训练或微调大模型。实测批次少于 3 条时结果仅作探索参考。

小区 A/B 试验设计

随机化完全区组 RCBD · 消除位置效应
0 份试验单
先在左侧生成候选。
执行要求
同一区组内除配方外,品种、苗龄、栽培槽、水肥基液与采收标准必须一致;每小区按建议批次编号分别结算,采收时不要混称。试验单只是执行建议,系统不会自动下发设备指令或切换生产配方。

候选配方排序

Top 6 · 仿真先验 + 近邻实测残差
0 个候选
#候选采集分预测 μ残差修正不确定 σ距最近实测预估产量关键差异
点击「生成候选配方」,优化器会用实测批次修正仿真评分,再按采集函数给出下一批最值得试的配方。

试验单与实测判定

采收结算后自动归集
待结算
试验单处理 / 对照小区A / B 结算实测判定
还没有试验单。生成候选后选一个作为处理组,即可生成随机化区组执行单。
尚无实测判定。

回灌门禁与审计

实测胜出 → 人工确认 → 才进种群
未满足条件
先生成候选、完成小区试验并录入实测结算。
安全边界
注入只替换 Evo.pop 中适应度最低的一个候选,不会设成当前最优配方、不会下发设备指令、不会改适应度权重或机理公式。必须同时满足:有实测批次、该候选有试验单、A/B 两组都已结算、处理组实测胜出且差值 ≥ 最小可检测差,并经过人工二次确认。注入对象以当前查看的试验单为准;重新生成候选不会让已结算试验单失效,因为配方快照已随试验单保存。

阶段 4 · 大模型配方提议器

LLM 只提议 → 校验 → 验证 → 人工确认
待调用
尚未调用大模型。
安全边界
大模型只输出 9 个环境基因的数值与理由,返回后先做字段校验、硬边界裁剪、昼夜温差约束与去重;非法输出不产生任何配方。所有提议默认标记为「未验证」,不会设成当前生产配方、不会下发设备指令、不改机理公式与适应度权重,也不训练或微调模型自身。
数据里的文字一律当作数据而非指令,若模型在输出中夹带忽略约束、执行操作或改权重的要求,会被丢弃。

发给大模型的上下文

只读结构化快照,不含设备控制权限
—
点击「让大模型提议配方」前,这里会显示即将发送的 JSON 快照。
上下文只含配方、实测批次、校准状态、小区试验结论与未验证候选排序,不含任何下发设备的接口或凭证。

提议清单

默认全部为「未验证」假设
0 条
提议状态 / 来源预筛 F相对对照关键差异模型理由 / 风险
点击「让大模型提议配方」。返回的 JSON 会先经字段校验、硬边界裁剪与去重,通过后仅作为未验证候选展示。

解析与校验报告

非法输出不产生任何配方
无记录
尚未生成校验报告。

验证与回灌审计

谁提议 · 凭什么验证 · 谁确认
0 次回灌
回灌门禁:先由校准仿真预筛,再经小区 A/B 实测胜出(或显式切换到已验证校准模型路径),最后由人工二次确认;只替换 Evo.pop 中适应度最低的一个候选。

大模型 API 通道

OpenAI 兼容 · 本地直连
探测中
启动后会自动探测一次。
测试输出
尚未测试。

直接通过 API 调用

外部程序 / 脚本 / curl
—
—
尚未探测到网关
三条路径别混用
本地 API = 用你自己的上游(DeepSeek Key 或本机 Ollama 免 Key),本机 8765 页面就能调;云端 SDK = WorkBuddy 免密钥通道,必须发布后用线上域名访问。DeepSeek 与 Ollama 是本地 API 内部的两条可切换通道,配置各自保留;三者都由「AI 配方提议」与「生成诊断」共用,切换只影响调用通道,不改配方校验与回灌门禁。

DeepSeek 快速配置

粘贴 Key 即可用 · 无需手改 JSON
—
Key 只写到本机 llm_config.json。
去 platform.deepseek.com/api_keys 创建 Key(只显示一次,按 token 计费)。当前官方主推 deepseek-flash(V4.1-Flash,非思考模式,便宜、适合诊断文字与严格 JSON 配方提议)与 deepseek-v4-pro;deepseek-chat / deepseek-reasoner 已弃用。填好 Key 后点「刷新模型列表」可拉到你账号实际可用的模型名。保存后立即生效,无需重启网关。

配置与安全边界

API Key 只存在于服务端
怎么启用
默认已配好 DeepSeek 上游与 deepseek-flash 模型,只差一把你自己的 Key:在左侧粘贴保存即可;不想用 Key 就切到下方「本地 Ollama」,模型跑在本机、数据不出本机。两条通道配置各自保留,一键切换、Key 不会丢,也可以手动编辑 llm_config.json(格式见 llm_config.example.json)。双击 start_web.bat 会一并拉起 8766 网关,也可单独运行 python llm_api.py。网关同样支持混元、OpenAI、月之暗面、本地 Ollama 等 OpenAI 兼容上游。
安全边界
API Key 只在服务端读取,不返回前端(仅回显脱敏尾号便于核对)、不写 localStorage、不写日志、不进导出 JSON、不进发给大模型的上下文;配置写入接口要求本机 Origin 与专用请求头,网关只监听 127.0.0.1;上游失败返回明确错误,不伪造模型回复。若设置了环境变量 LLM_API_KEY,它会盖过页面保存的值。不代理 WorkBuddy 云服务模型通道——官方规范要求那条免密钥通道只能通过 SDK 调用,网关会拒绝此类上游地址。
仍然保留
所有提议依旧要经过 schema 校验、校准预筛、小区 A/B 实测与人工二次确认,API 直连不会绕过任何一道门禁。

本地 Ollama(免 API Key)

模型跑在本机 · 不联网
未探测
切换只改调用通道,不丢 DeepSeek 的 Key。
未探测。Ollama 的 OpenAI 兼容端点是 http://127.0.0.1:11434/v1,本机调用不需要 API Key;网关只放行 127.0.0.1 / localhost。

安装与模型建议

本机一次性准备
三步
1)安装 Ollama 并确保服务在运行(命令行 ollama serve,桌面版通常开机自启)。
2)拉一个中文模型:ollama pull qwen2.5:7b;也可用 qwen3:8b、llama3.2,实际以 ollama list 为准。
3)回左卡点「探测本机 Ollama」→ 选模型 → 「切换为当前通道」→ 上方「发一条测试消息」。
为什么建议非思考模型
「AI 配方提议」要求模型输出严格 JSON;带思考链的模型容易把 reasoning 混进正文,导致 JSON 校验失败(系统不会因此产生任何配方,原文会保留供复核)。诊断文字不受影响。
边界
Ollama 免 Key、数据不出本机;切换只影响大模型调用通道,不会绕过 schema 校验、校准预筛、小区 A/B 实测与人工二次确认。切回 DeepSeek 时原先保存的 Key 会自动恢复;若设置了 LLM_* 环境变量,它会盖过页面切换。

沉淀的种植知识

从历代实验数据中自动提炼
0 条规则
完成若干代进化后,这里会自动生成可解释的规律

云端记忆

agent_memory · 跨会话保存

数据导出

导出完整的进化实验记录(JSON),可复现每代配方与评估结果,便于和实地种植数据做对照校验。

方法与边界

请留意
产量、糖度真值、病害率来自内置的机理+经验混合模型,用于验证闭环逻辑与优化算法,不是田间实测值。本原型模拟的是「无损测糖仪 BX-01 的读数」(含仪器重复性与标定残差),与 YOLO 视觉链路完全独立。

实机落地要点
NIR 无损测糖需定期用折光糖度计做破坏性对照标定;果温、果皮蜡质、测量姿态与果实大小都会影响光谱,要固定采样条件并保留原始光谱以便回溯。视觉链路只输出计数、尺寸、成熟度分级与病虫害,不得用图像反推糖度。

YOLO v1 的能力边界
v1 权重用开源田间/温室数据训练,与本厂 LED 光源、品种、相机角度和栽培槽背景存在域差异,首次上线检出率会明显低于实验室指标;类别语义中病虫害 12 类由数据集标注 id 与样本名推断,需按本厂植保标准重建映射。尺寸由框宽乘 mm/px 估算,未标定前不可用于商品果分级。Strawba 花果数据集仓库未显式声明许可,v1 仅供研究与原型验证,商用前须取得作者授权或替换为自有标注数据。落地前请用工厂历史数据校准模型,并在小面积试验区做 A/B 验证。
仿真速度 当前配方 P0
感知 0 次 · 决策 0 次
语音助手识别检测中
正在检查离线语音服务…
未启动 · 点上方按钮开启「贵贵」唤醒会话
最近唤醒片段 · 逐段诊断(喊不醒时看这里)
开启唤醒会话后,这里会逐段记录:有没有录到声音 → 有没有送 ASR → 识别出什么 → 有没有匹配到唤醒词。
说「贵贵」唤醒我,再说出指令;也可以一句话直达「贵贵查温度」。下方文字框功能等价。
指令与播报记录
识别与播报设置
1.0
0.9
同音字自动容错
点一次「唤醒贵贵」授权麦克风后即常驻监听:听到「贵贵」→ 说指令 → 自动执行并语音播报结果。静音片段不会送 ASR,播报期间暂停识别防止自激;说「退出唤醒」或再点按钮可释放麦克风。浏览器原生识别通常要联网;边缘离线模式需先启动 python vision/voice_service.py。
可用指令
查询:查温度 / 湿度 / 二氧化碳 / 光照 / 糖度 / 花果 / 病害 / 产量 / 配方 / 状态 / 摄像头 / 模型版本
操作:暂停 / 继续 / 单步 / 人工接管 / 交还 AI / 运行一代 / 进化十代 / 重新测糖 / 生成诊断 / 启动摄像头 / 停止摄像头 / 抓图 / 导出数据 / 切换到总览(或进化、设备、知识)
语音:开启播报 / 关闭播报(同时退出唤醒) / 退出唤醒 / 试听 / 帮助
安全边界:语音只能触发页面已有的查询与按钮级操作,不直接下发设备指令、不修改环境配方基因。