这是一个“物理力场引擎”式的 LLM 控制器:不用 prompt 工程,不用复杂的推理链提示(Chain-of-Thought),直接在 token 级别用“力学规则”来引导语言模型生成文本。
✨ 背景动机(为什么要这样做)
传统的大语言模型生成文本靠的是:
* prompt(提示语)的设计
* 内部隐藏状态由模型自己决定
* 有时输出不够集中/重复/不够有趣
Niodoo 的核心想法:把语言模型内部的 token 序列看成动态系统,像物理中粒子受力一样,靠“力”的作用去引导生成过程。
➡ 换句话说:
不是靠提示告诉模型“你应该这么做”,而是直接在模型生成每个 token 的过程中——给它“力”去推动它往我们想要的方向输出内容。
核心机制(老办法单链条解释)
我们把这个“物理力场引导”抽象成下面的单一强因果链:
隐藏状态 → 受力 → 动力学轨迹改变 → 不同 token 生成倾向 → 最终输出变得更丰富/更有逻辑/更少重复**
并且,这些“力”是如何产生的?
五种“力”怎么用(核心机制节点)
1. Gravity(引力)
类比:历史语义对当前 token 的吸引
作用:让生成的文本和前面内容更一致、更连贯
直接影响 token 的概率分布,增强语义联系
2. Ghost Vector(目标锚引力)
类比:向目标主题方向吸引
解释:如果你给了一个 *goal*(比如“写诗”),它就把 token 推向与目标相关的方向
3. Black Hole Repulsion(黑洞排斥)
类比:把不想要的 token 推远
作用:减少重复、减少废话或违禁内容
4. PINN Conservation(守恒力场)
约束生成轨迹保持在“语义合理的流形”上
就像物理系统里的守恒定律,让生成更稳定
5. Langevin Dynamics(随机扰动)
类比:热噪声引入微扰
能增强生成的创造性和多样性
什么时候物理力开始起作用
生成 token 时有一个“动态 ramp”机制:
Tokens 0-3 → 0% 物理(启动阶段)
Tokens 4-9 → 逐渐引入物理力
Tokens 10+ → 全部 physics 作用
➡ 这样做的意思是:
前几步先让模型自己稳定发出开头句,然后再引力/排斥等物理力开始发力,避免一上来就“过度干涉”。
使用上看起来像这样
基本命令:
bash
./niodoo --model-path 模型文件.gguf \
--prompt "写一段内容" \
--max-steps 128 \
--physics-blend 0.55 \
--repulsion-strength -0.60 \
--ghost-gravity 10.0
`
参数说明(抽象版)
physics-blend:物理力的强度
repulsion-strength:排斥力度
ghost-gravity:抓住目标主题的力量 ([GitHub][1])
实验效果(可量化对比)
官方 README 给了简短例子:
| 情况 | 输出特点 |
比如:
常规模型会说:
“The capital of France is Paris. Would you like to know more…?”
Niodoo 会说:
“The capital of France is Paris. … famous landmarks, population…”
(更紧凑、更方向性) ([GitHub][1])
深层逻辑理解(老办法核心解释)
传统 LLM:
$$ P(\text{next token} | \text{context}) $$
Niodoo:
在这个概率上附加“物理势场”:
$$ P(\text{next token} | \text{context}) × e^{(引力 + 目标力 - 排斥)} $$
这就像是在概率空间里打了潜在场,让生成过程有“方向性”和“动力学约束”。
架构/运行方式
* Rust 二进制核心负责融合物理力和模型输出。 ([GitHub][1])
* Python 提供 FastAPI 服务端,可做 HTTP 调用。 ([GitHub][1])
* 输出有 telemetry(认知轨迹)可以调试每个 token 受力情况。 ([GitHub][1])
最核心价值点(老办法总结)
不是修改模型权重、也不是训练新模型,而是:
“在生成过程中用物理类力去 steer(引导)LLM 输出”。