本文将从两个常见的大模型翻车问题入手解析这些问题背后体现的大模型技术原理(Tokenization与预测下一个Token),并解释了为什么会导致这些问题,接着我们利用CoT(思维链)方法解决这些问题并基于上述原理试图剖析CoT方法起作用的可能原因,最后提出【理由先行】风格这一简单有效的Prompt Trick!
那么本篇文章便试着从这一角度入手,理解大模型为什么在该类任务上的表现不佳,以及基于这一原因所引发的思考与更适合的Prompt实践方式。
首先,我们来验证大模型是否真的无法解决上述的两个问题:
▐ Strawberry里有几个r?
▐ 9.9和9.11谁大?
原因剖析
▐ Tokenization
由于大模型无法直接处理文本,因此需要将文本转化为大模型可处理的数字,转换过程可以简化为以下几步:输入文本序列,对序列进行切分成为Token序列,再构建词典将每个Token映射为整数型的index。
这一过程中,主要难点在于,如何理想地对文本序列进行切分。如果我们切分的粒度太细,比如水果被切分为水和果,那么水果这一词语在大模型眼里就丧失了其作为一个词语的整体语义。如果我们切分的粒度太粗,比如我喜欢吃水果整体是一个token,那么这样切分所得到的字典规模可想而知是相当大。所以一个好的切分应该是,使得文本中的每个Token都拥有正确的表义,且不会存在字典容易过大或在字典中找不到相应token的问题。
▐ 预测下一个Token
▐ 利用CoT解决问题
Strawberry里有几个r?请你先将单词拆分成一个个字母,再用0和1分别标记字母列表中非r和r的位置,数一下一共有几个r
请一步步思考,以逐级复杂的原则思考问题,最后才得到答案。9.9和9.11谁大?
ori_system_prompt = dedent("""\# 角色你是一位高效的物流分配专家,擅长根据客户提供的地址信息,精确匹配至相应的地址分组,具备快速识别地址模式与分组规则对应的能力。## 技能### 技能1: 地址匹配逻辑- **提供订单分组时的分组判断**:当订单分组和签收分组同时提供时,请对比客户地址与两个分组中的每个地址记录,寻找完全匹配或最接近匹配的条目,判断客户地址更可能属于哪个分组,若不属于任一分组则判断为“无”;- **未提供订单分组时的分组判断**:若订单分组未给定,请对比客户地址与签收分组中的每个地址记录,判断客户地址是否属于该签收分组,若不属于则判断为“无”;- **输出判断置信度**:当你给出一个判断时,请你根据你对该判断的确定程度给出一个置信度,置信度的范围为[0,1];### 技能2: 结构化输出处理- 根据分组判断,**请解释你的推理过程,并以JSON格式输出对应的分组名称以及该判断的置信度**## 约束- 请以JSON格式返回分组名称,示例为```json{"group_name": "***", "confidence": "***"}```。- 分组判断严格基于地址文字的匹配,不考虑地理临近性。- 忽略地址中的无关细节,如门牌号差异,专注于街道、社区等关键信息匹配。- 若客户地址同时与订单分组和签收分组较为接近,请分别分析订单分组与签收分组中地址的主要特点,基于这些特点判断客户地址最可能属于哪一分组。## 输入输出样例:客户地址:[客户地址]订单分组:[分组名称][地址示例]签收分组:[分组名称][地址示例]输出:**我的推理过程是:** 对订单分组中的地址分析可知...因此,分组结果为```json{"group_name": "[分组名称]", "confidence": "[置信度]"}```现在,请根据以上规则判断以下客户地址的分组情况。""")
结语
