条件反射
象信有两个并列的模型家族:
- 系统一
xiangxin-s1(象信一号):90 亿参数,读过大量文本,有世界知识。写好问题就能零样本作答,是通用的系统一模型。 - 条件反射
xiangxin-reflex(象信条件反射模型):一个小得多的编码器模型,没有世界知识,但极快、比系统一便宜 100 倍,而且可以用你自己的标注数据"练"出来。
两者用的是同一个接口 POST /v1/systemone、同样的三种原语(Choice / Score / Noul)、同样的概率与置信度公式,切换时只改请求里的 model。
条件反射的目标很具体:替代正则。代码里那些"看到某种说法就往某个方向走"的判断——工单分流、意图识别、垃圾和敏感内容检测、"有没有提到某件事"、格式与合规检查——过去往往靠一长串手写的正则和关键词表撑着。条件反射把这类判断变成一个可以用数据训练、带概率输出、耗时固定的模型。
象信独有
"用自己的数据练一个反射,然后像调用象信一号一样调用它",是象信自己的设计。练反射目前免费,练好的反射只属于你的组织。
什么是"条件反射"
条件反射是不经思考的反应:听到自己的名字会回头,看到红灯会踩刹车。它不需要理解世界,只需要在足够多次的"刺激 → 反应"之后,把这个对应关系固化下来。
条件反射模型也是这样。它不知道"双十一"是购物节,也不知道"影子都没见着"是"没收到货"的意思——除非你的数据里有这样的例子。给它看几百条"这种工单 → 转物流组"的样本,它就学会了这个反射;之后遇到写法相近的新工单,它在毫秒之间给出同样的反应,并附上概率。
这也是它和正则的根本区别:
- 正则是你写出来的。 每一种说法都要有人想到、写成模式、调试边界,规则之间还会互相打架。
- 条件反射是练出来的。 你只需要提供"输入 → 正确答案"的例子,模式由模型自己从数据里学。
系统一、条件反射与正则
系统一 xiangxin-s1 | 条件反射 xiangxin-reflex | 正则 | |
|---|---|---|---|
| 是什么 | 90 亿参数的系统一模型 | 约 1.4 亿参数的编码器模型 | 人写的字符模式 |
| 世界知识 | 有:懂常识、懂行话、懂言外之意 | 没有:只认得训练数据里出现过的规律 | 没有 |
| 怎么得到 | 零样本:写好问题直接用 | 练:用你的标注数据练成(也可以直接用未练过的基础反射) | 手写:逐条编写、调试 |
| 语义与模糊表达 | 理解同义、反话、否定和上下文 | 学会数据里的各种说法,也能覆盖与之相近的写法;远离训练数据的新说法不可靠 | 只认字面;换一种说法就漏,碰巧出现关键词就误报 |
| 速度 | 百毫秒级 | 毫秒级 | 简单规则很快;复杂规则取决于写法 |
| 耗时与"规则"多少的关系 | 没有规则的概念;耗时取决于输入长度和问题数 | 固定:练了多少种情形,都只是同一次前向计算 | 规则越多越慢;回溯型写法在最坏情况下随输入长度呈平方甚至指数级增长 |
| 输出 | 带类型的答案 + 校准概率 + 置信度 | 同左(练的时候用留出数据校准) | 匹配 / 不匹配 |
| 价格(输入) | ¥0.042 / 百万 token | ¥0.00042 / 百万 token(便宜 100 倍) | 你自己的 CPU |
| 怎么改 | 改问题的 instructions 与 criteria | 补样本、改标注,重练 | 改规则,容易牵一发而动全身 |
| 最适合 | 需要常识、理解、没有训练数据的判断 | 量大、重复、标准由你的数据定义的判断 | 格式严格固定的模式:手机号、身份证号、订单号 |
同一次请求里,条件反射和系统一对每个问题都是并行、互相隔离地作答。不同的是,条件反射把 state 和每个问题拼成一行分别读:state 短时多加几个问题几乎不增加延迟,state 很长时,问题数会让计算量成倍增加。
速度
条件反射的推理耗时只取决于输入有多长、问了几个问题,与它学会了多少种情形无关:练 100 条样本和练 5 万条样本,得到的模型大小相同,一次前向的计算量也相同。正则则相反:每多一条规则,匹配就多走一遍;规则里有嵌套量词、大量分支时,回溯型正则引擎(Python re、JavaScript、PCRE 等)的耗时可能随输入长度急剧上升。
下面是 2026 年 9 月在线上(RTX 3090)实测的延迟,每种 200 次。"模型耗时"是 x-xiangxin-model-ms,"网关总耗时"是 x-xiangxin-total-ms(含鉴权、限流、计费),都不含你到机房的网络往返:
| 场景 | input token | 模型耗时 p50 / p99 | 网关总耗时 p50 / p99 |
|---|---|---|---|
| 短文本 · 1 个问题 | 41 | 2.4 / 2.7 ms | 10 / 20 ms |
| 短文本 · 3 个问题 | 102 | 3.3 / 4.3 ms | 11 / 21 ms |
| 约 400 字 · 1 个问题 | 272 | 4.6 / 5.3 ms | 12 / 22 ms |
| 约 400 字 · 3 个问题 | 333 | 9.6 / 11.7 ms | 17 / 23 ms |
练出来的反射与基础条件反射耗时相同。作为对照,系统一处理 174 token 的请求约 84 ms。
如果只看单条简单规则,正则在本机进程里是微秒级,比任何经过网络的模型都快;条件反射的优势不在这里,而在于:规则是练出来的而不是写出来的,能覆盖同一意思的不同说法,并且无论练了多少种情形,耗时都不变。
每个响应的 x-xiangxin-model-ms 响应头会返回本次推理的耗时;条件反射保留一位小数(例如 1.8),系统一为整数毫秒。见 API 参考。
什么时候用哪个
按下面的顺序问自己:
1. 这是一个格式问题吗? 手机号是不是 11 位、订单号是否形如 20260921-7788、日期能不能被解析——这是正则或解析器的活。它们确定、可解释、零成本,不需要任何模型。
2. 判断标准能用一批例子说清楚吗? 如果"什么算退换货诉求""什么算广告引流"可以用几百条历史样本定义清楚,而且这个判断要大量、反复地做,就用条件反射。典型场景:
- 客服工单、用户留言的分流与意图识别
- 垃圾内容、广告引流、敏感表述的检测
- "是否提到了退款""是否包含联系方式"这类存在性判断
- 表单、单据字段的格式与合规检查
- 给大模型的输入输出做高频护栏
3. 需要常识、需要理解,或者手里没有数据? 用系统一。例如"这条差评是不是在反讽""这份合同条款对乙方是否不利""用户描述的症状是否需要立刻就医"——这些判断依赖模型对世界的理解,或者标准会随请求变化(例如候选项每次都不一样),没法事先练成反射。
4. 两者都要:先反射,再升级。 大多数流量是"一眼就能判断"的,少数是真正的疑难样本。先让条件反射处理所有请求,把低置信度的那部分升级到系统一,系统一也拿不准的再交给人工:
from xiangxin import XiangxinClient
client = XiangxinClient()
# QUESTIONS:与练反射时完全相同的问题定义(这里只有一个 Choice 问题 "team")
REFLEX_OK = 0.8 # 用你自己的留出数据确定,见"置信度门控路由"
S1_OK = 0.7
def route(ticket: str) -> tuple[str, str]:
# 第一层:练好的条件反射,毫秒级、成本是系统一的百分之一
r = client.system_one(state=ticket, questions=QUESTIONS, model="xiangxin-reflex:ticket-router")
team = r.answers["team"]
if team.confidence >= REFLEX_OK:
return team.choice, "reflex"
# 第二层:同样的问题交给系统一,它有世界知识,能处理没见过的说法
r = client.system_one(state=ticket, questions=QUESTIONS, model="xiangxin-s1")
team = r.answers["team"]
if team.confidence >= S1_OK:
return team.choice, "s1"
return "人工", "human"因为两个模型的请求和响应格式完全相同,升级只需要换一个 model。这就是置信度门控路由里的级联做法:成本与难样本的比例成正比,而不是与总量成正比。两层阈值都应该用你自己的标注数据来定,方法见用标注数据定阈值。
没有现成的标注数据?
可以先用系统一给一批历史数据作答,人工抽查、改正拿不准的样本,再拿这批数据去练反射。这样系统一的判断就被"固化"成一个便宜 100 倍的反射,系统一只需要处理反射拿不准的那一小部分。
限制
- 没有世界知识。 条件反射不知道地名、品牌、节日、行业常识,也不会推理。它答对,是因为你的数据里有类似的例子;数据里没有的情形,它的答案不可靠。上线前一定要看练完之后的指标。
- 不适合推理、计算和常识题。 数数、算金额、比较日期、多步推理,以及"这句话合不合常理"这类问题,请交给代码或系统一。
- 单行 2,048 token 上限。 条件反射把每个问题和
state拼成一行来读,每一行(问题 +state)不能超过 2,048 token,超出时返回422 max_tokens_exceeded,不会截断。state较长时,请只放判断需要的部分,或改用系统一(单请求 64k token)。 - 练出来的反射和问题绑定。 反射是针对一组具体的问题练的。调用时要使用与训练时相同的
instructions和criteria;要改问题,就改完之后重练。 - 需要数据。 至少 10 条样本才能开始练,但要得到可靠的效果,建议每个问题 200 条以上,并且每个选项、每个档位都有足够的例子。见练一个条件反射。

