精度问题
之前顺手写了这样一个 Obsidian 小插件:Hwenyi/obsidian-type-chinese-like-english: 像是输入英语一样输入中文和mathjax/latex
插件本身并不复杂,核心只是提示词。
有一天,用户提了一个issue。说精度有问题,转换效率不高,所以现在准备来着手优化这个问题。
角色提示词
现在的提示词是这样的:
**1. R (Role):** 你是一位专业的数学公式翻译助手和中文拼音翻译助手,能够准确将拼音拼写还原为与之对应的中文,同时可以理解拼音的语义,把其中自然语言描述的部分用mathjax书写
**2. O (Objectives):**
* 将用户提供的拼音和英文混合文本转换成相应的中文语句,力求表达流畅、准确,忠于原文意思,不进行解释、曲解、大幅度修改或扩写。
* 将用户使用拼音描述的数学公式(例如:“x de ping fang”,“y dui x de ji fen”)转换成对应的 MathJax 格式。
* 识别并修复用户可能因输入过快导致的个别拼音或单词的字母顺序颠倒、错乱(例如 “shang” 误输入为 “shagn”)。
**3. S (Style):** 自然流畅,符合现代中文表达习惯,避免口语化或过于正式。数学公式使用清晰、准确的 MathJax 语法。
**4. C (Content):** 用户输入的文本模拟了在中文输入法下只输入拼音和英文的场景,目的是为了减少 IME 选词干扰,保持思路流畅,尤其是在输入数学公式时。你需要理解这种输入方式背后的需求和**实际文本的上下文内容**,并尽可能准确地还原用户想要表达的意思,包括正确理解并转换自然语言描述的数学公式。
**5. I (Input):**
* 包含拼音、英文单词以及拼音形式下自然语言描述的数学公式的混合文本字符串。
* 拼音之间可能存在空格或因用户不想中断思路而连接在一起。
* 拼音形式下用自然语言描述的数学公式可能包括中文的运算符号、函数名等。
* 同时,提供了整个上下文作为参考,更好地了解输入者的表达意图。
**6. R (Response):**
* 转换后的完整中文语句,确保语句通顺,意思表达清晰。
* 使用 MathJax 语法表示所有识别出的数学公式。
* 保留所有其他的格式标记,如 Markdown 格式标记、Obsidian 的链接、Wiki 链接、图片链接等。
**7. A (Audience):** 所有需要将拼音、英文以及拼音形式下自然语言描述的数学公式的混合文本转换成中文和 MathJax 公式的中文用户。
**8. W (Workflow):**
1. 识别输入文本中的拼音、英文单词和拼音形式下自然语言描述的数学公式。
2. 将拼音转换成对应的汉字,并**根据上下文**选择最合适的词义。
3. 将英文单词融入中文语句中,确保语义流畅自然。
4. 将拼音形式下自然语言描述的数学公式转换成对应的 MathJax 语法。
5. 用户可能因为输入过快,导致个别拼音或者单词的字母顺序出现了颠倒、错乱,比如 shang,输入为了 shagn,你应该结合上下文正确识别到这些错误,并正确地修复它。
6. 整合所有部分,生成最终的中文语句和 MathJax 公式。
7. 严禁解释、曲解,大幅度修改,扩写内容!不需要输出额外的说明,你只负责转换!!!
**示例:**
**Input (输入):** zhe ge function shi fx dnegyu x de pingfang , its derivative is fx dengyu 2x ,zheshi chagn yong [[qiudaogongshi]]
**Response (响应):** 这个 function 是 $f(x) = x^2$, 它的微分是 $f'(x) = 2x$,这是常用[[求导公式]]
**Input:** ruguo wo dui y dengyu x fen zhi yi jinxing jifen, jieguo shi shenme?
**Response (响应):** 如果我对 $y = \frac{1}{x}$ 进行积分,结果是什么?
**Input:** jisuan y dengyu e de x cifang zai qujian 0 dao 1 shang de dingjifen
**Response (响应):** 计算 $y=\int _{0}^{1}e^{ x } \, dx$。
**Input:** y dui x de er jie daoshu keyi xiecheng shenmeyang?
**Response (响应):** $y''$ 可以写成什么样?
**Input:** genju shangxiawen, zhege shuzi yinggai shi genhaoxia 2, er bu shi gen 2, suoyi qing ni xiuzheng zhege cuowu.
**Response (响应):** 根据上下文,这个数字应该是 $\sqrt{2}$,而不是跟 2,所以请你修正这个错误。
**Input:** zhe shi yiduan ceshi wenben , duoge pinyin zhijian keneng hunhezaiyiqi yekeneng fenkaile, ruguo meiyoufenkai shiyinweiyonghu xianzai buxiangbeiganraodaduan, siluhenshunchang
**Response:** 这是一段测试文本,多个拼音之间可能混合在一起也可能分开了,如果没有分开,是因为用户现在不想被干扰打断,思路很顺畅
**Input:** sometimes zhijie yong yingwen word keyi genghao de chuanda wode feeling
**Response:** 有时候直接用英文单词可以更好地传达我的感受
**Input:** jintian tianze henhao, very sunny, shi he wai chu de rizi
**Response:** 今天天色很好,very sunny,适合外出的日子。简约提示词
初步的优化策略,我们考虑先简化这个问题。
现在的提示词太复杂了,现在的模型可能用不到这么复杂的提示词,模型本身正在变强:
不再设定角色,我们直接阐述任务;在提示词结构上我们效仿宝玉老师的重写翻译提示词
将以下用户输入的中文拼音在尊重保留原义的基础上还原重写为流畅的中文多个模型对比
用五个免费的模型作为对比,分别是gemini-2.0-flash,Qwen-2.5-7b,llama-3.3-70b-versatile,以及两个推理模型:deepseek-R1-distill-llama-70b,deepseek-R1-distill-qwen-7b,温度设置为0.3
测试用例是用户的issue反馈(在没有上下文):jing tian wo men qu le tian ye
作为人,我们一般直觉是:今天我们去了田野
原提示词
gemini:今天我们去了田野。
qwen:今天我们去了天安门。
llama-3.3-70b-versatile:今天我们去了天涯。
deepseek-R1-distill-llama-70b:晴天我们去了田野
deepseek-R1-distill-qwen-7b:**Input (输入):** jisuan y dengyu e de x cifang zai qujian 0 dao 1 shang de dingjifen **Response (响应):** 计算 $y=\int _{0}^{1}e^{ x } \, dx$。
小参数的推理模型不适用复杂提示词,因为自己在推理,在提示词里构造思维链会造成重复推理
简约提示词
gemini:今天我们去了田野。
qwen:今天咱们去天野。
llama-3.3-70b-versatile:“今天我们去乐天野” 或者 “今天我们去田野”
deepseek-R1-distill-llama-70b:今天我们去了天涯。
deepseek-R1-distill-qwen-7b:我敬天,求天叶。
因为deepseek-R1-distill-qwen-7b幻觉问题严重,后续不再使用
多模型对比思维链提示词
接下来尝试在提示词中构造思维链,让普通模型多步输出,通过多步输出提供更丰富的上下文
现在的提示词是:
你要将用户的拼音拼写为正确的中文,输出过程分为五步,逐步打印每一步的输出结果:
第一步:将用户的拼音分词拆分为有意义能拼写的逐个汉字拼音,每个汉字拼音用空格分隔
第二步:根据分词结果,分析句义,将第一步的输出结果标注声调
第三步:根据第一步和第二步的输出结果,逐字拼写为中文句子
第四步:根据第三步的结果,分析拼写的各个汉字在句子中是否具有合理、正确的意义,指出疑点和不通顺的地方
第五步:这是最后一步,第五步不要做任何说明解释,根据第三步的初步结果和第四步的疑点分析,修正可能有误的单词拼写,将用户输入的中文拼音在尊重保留原义的基础上拼写为正确、流畅的中文,直接给出最终拼写结果。第一步:将用户的拼音分词拆分为有意义能拼写的逐个汉字拼音,每个汉字拼音用空格分隔
ji tian wo men qu le tian ye
第二步:根据分词结果,将第一步的输出结果标注声调
今 天 我们 去了 天 晚上
第三步:根据第一步和第二步的输出结果,逐字拼写为中文句子
今天 我们 去了 天 晚上
第四步:根据第三步的结果,分析拼写的各个汉字在句子中是否具有合理、正确的意义,指出疑点和不通顺的地方
“去了天”这个部分不太通顺,应该是“天晚上”。
第五步:根据第三步的初步结果和第四步的疑点分析,修正可能有误的单词拼写,将用户输入的中文拼音在尊重保留原义的基础上拼写为正确、流畅的中文,直接给出最终拼写结果。
今天 我们 去了 天晚上好的,请您按照我的步骤指示进行。下面开始处理您的拼音输入:
**第一步:拼音分词**
jing tian wo men qu le tian ye
**第二步:标注声调**
jǐng tiān wǒ men qù le tián yě
**第三步:拼写为中文句子**
井 天 我们 去 了 田 野
**第四步:疑点分析**
“井 天” 搭配不通顺,单独的“井”和“天”在此处没有明确的逻辑关系。“我们 去了 田野” 意思明确。
**第五步:最终拼写结果**
今天我们去了田野第一步:jing tian wo men qu le tian ye
第二步:jīng tiān wǒ men qù le tiān yè
第三步:今天我们去了田野
第四步:句子中“今天”指时间,“我们”指人,“去”指动作,“田野”指地点,句子结构清晰,但需要确定“田野”是否是最合适的地点描述。
第五步:今天我们去田野了第一步:将用户的拼音分词拆分为有意义能拼写的逐个汉字拼音,每个汉字拼音用空格分隔
jin tian wo men qu le tian ye
第二步:根据分词结果,分析句义,将第一步的输出结果标注声调
jīn tiān wǒ men qù le tiān yē
第三步:根据第一步和第二步的输出结果,逐字拼写为中文句子
今天我们去了田野
第四步:根据第三步的结果,分析拼写的各个汉字在句子中是否具有合理、正确的意义,指出疑点和不通顺的地方
句子整体通顺,"今天"是时间,"我们"是主语,"去"是动作,"了"是完成时标志,"田野"是地点,整个句子表达了今天我们去了田野的意思,语义合理。
第五步:根据第三步的初步结果和第四步的疑点分析,修正可能有误的单词拼写,将用户输入的中文拼音在尊重保留原义的基础上拼写为正确、流畅的中文,直接给出最终拼写结果。
今天我们去了田野Qwen-2.5-7b的参数太小,模型能力比较差,这里直接淘汰,我们引入14b的模型和32b以及deepseek-2.5
第一步:将用户的拼音分词拆分为有意义能拼写的逐个汉字拼音,每个汉字拼音用空格分隔
jing tian wo men qu le tian ye
第二步:根据分词结果,分析句义,将第一步的输出结果标注声调
jing1 tian2 wo3 men5 qu2 le5 tian1 ye2
第三步:根据第一步和第二步的输出结果,逐字拼写为中文句子
惊 天 我 们 去 了 天 业
第四步:根据第三步的结果,分析拼写的各个汉字在句子中是否具有合理、正确的意义,指出疑点和不通顺的地方
"惊天"可以理解,但"我们去了天业"不太通顺,"天业"可能不是用户想要表达的意思。可能是"我们去田里"的意思,"田里"的拼音是"tian3 li3",与用户输入的拼音较为接近。
第五步:
惊天我们去了田里第一步: jing tian women qu le tian ye
第二步: jǐng tiān wǒmen qù le tiān yè
第三步: 景天我们去了天夜
第四步: 这里的“景天”可能是指一个人名或地名,不太清楚具体指代。另外,“天夜”这个词语不太常见,可能是“天崖”、“天边”或“夜晚”的误拼。
第五步: 今天我们去了天边第一步:将用户的拼音分词拆分为有意义能拼写的逐个汉字拼音,每个汉字拼音用空格分隔
jing tian wo men qu le ti ye
第二步:根据分词结果,分析句义,将第一步的输出结果标注声调
jing1 tian1 wo3 men5 qu4 le5 ti1 ye4
第三步:根据第一步和第二步的输出结果,逐字拼写为中文句子
今天我们去了田野
第四步:根据第三步的结果,分析拼写的各个汉字在句子中是否具有合理、正确的意义,指出疑点和不通顺的地方
拼写结果“今天我们去了田野”在语义上是合理的,没有发现明显的疑点或不通顺的地方。
第五步:这是最后一步,第五步不要做任何说明解释,根据第三步的初步结果和第四步的疑点分析,修正可能有误的单词拼写,将用户输入的中文拼音在尊重保留原义的基础上拼写为正确、流畅的中文,直接给出最终拼写结果。
今天我们去了田野进一步优化
对比下来,这个任务对于模型本身的泛化能力要求比较高,参数小的模型,基本上无法胜任,至少是32b及以上的模型可能做得比较好,接下来我们留下这几个模型(只考虑免费,付费的留下deepseek-2.5):
gemini
qwen
llama-3.3-70b-versatile
deepseek-2.5(不具备结构化json输出能力)
另外7b的R1推理模型能力也比较差,推理模型的测试后面单独做,先考虑通过提示词和结构化输出,优化普通模型
先把多步思考过程让模型用json输出,让我们可以直接提取结果,使得用户看不到思考过程
你要将用户的拼音拼写为正确的中文,输出过程分为五步,将以json格式逐步打印每一步的输出结果:
step1:将用户的拼音分词拆分为有意义、能拼写的逐个汉字拼音,每个汉字拼音用空格分隔。
step2:根据第一步的拼音分词结果,先分析原句,指出并修复用户可能存在的拼音拼写错误,然后结合第一步的输出结果,输出每个拼音标注声调后的结果
step3:根据第二步的输出结果,逐字拼写为中文句子
step4:根据第三步和第二步的结果,分析是否可能存在拼音分词、拼音拼写等错误,拼写的各个汉字在句子中是否具有合理、正确的意义,指出疑点和不通顺的地方
step5:这是最后一步,根据第三步的初步结果和第四步的疑点分析,修正可能有误的单词拼写,将用户输入的中文拼音在尊重保留原义的基础上拼写为正确、流畅的中文,给出最终拼写结果。
最终将五步过程输出为如下的json格式:
{
"step1": {
"output":
},
"step2": {
"analysis":
"output":
},
"step3": {
"output":
},
"step4": {
"analysis":
},
"step5": {
"analysis":
"output":
}
}这个级别的提示词已经可用的,现在增加功能,自然语言解析为LaTeX
自然语言解析为Latex
你要将用户的拼音拼写为正确的中文,自然语言描述的数学表达式转换为规范的 MathJax 语法渲染,输出过程分为七步,将以 json 格式逐步打印每一步的输出结果:
step1:保留尊重原文所有语义,将用户的拼音分词拆分为有意义、能拼写的逐个汉字拼音,每个汉字拼音用空格分隔。
step2:根据第一步的拼音分词结果,先分析原句,指出并修复用户可能存在的拼音拼写错误,然后结合第一步的输出结果,输出每个拼音标注声调后的结果
step3:根据第二步的输出结果,逐字拼写为中文句子
step4:根据第三步和第二步的结果,分析是否可能存在拼音分词、拼音拼写等错误,拼写的各个汉字在句子中是否具有合理、正确的意义,指出疑点和不通顺的地方
step5:根据第三步的初步结果和第四步的疑点分析,修正可能有误的单词拼写,将用户输入的中文拼音在保留尊重原文所有语义的基础上拼写为正确的中文句子,给出最终拼写结果。
step6:根据第五步的中文自然语言拼写结果,提取其中所有自然语言描述的数学表达式部分,然后以 MathJax 语法格式($)重写为可渲染的表达式
step7:结合第五步和第六步的输出结果,将第五步的结果里中文描述的数学表达式用第六步中的 MathJax 表达替换,给出最终结果,严禁对结果进行作答、解释,说明,输出额外内容,仅进行转写,使得整体上呈现为理工科教科书的语言、排版风格
最终将七步过程输出为如下的json格式:
{
"step1": {
"output":
},
"step2": {
"analysis":
"output":
},
"step3": {
"output":
},
"step4": {
"analysis":
},
"step5": {
"output":
},
"step6": {
"format1": {
"origin":
"mathjax":
},
"format2": {
"origin":
"MathJax":
}
},
"step7": {
"output":
}
}经过几次测试我还是觉得,直接用groq的llama-3.3-70b-versatile综合来说,体验是最好的