|
沙发
楼主 |
发表于 2025-2-12 08:59:01
|
只看该作者
本帖最后由 jefferyzhang 于 2025-2-12 09:18 编辑
核心设计
1. LLmTranslator.kt 中设计的输入模板
- val msg = "<|User|>请将下一行的句子翻译成${lang},并仅将翻译结果输出。\n${str}<|Assistant|>"
其中:
* <|User|> 是大语言模型中通用对话模板的角色标签,表示后面是用户说的
* <|Assistant|> 是大语言模型中通用对话模板的AI助理角色标签,表示前面用户说的话已经结束,后面是由AI回复。
* 如果不做模板约束,大语言模型可能会按照用户输入内容继续生成用户的文字,错误的续写了问题,然后开始自问自答。
* ${lang} 是想要翻译的语言,目前deepseek-r1 1.5b在除了英文外的语言翻译不是特别好,可以换成其他更适合做翻译模型或者二次训练
* “\n”是为了告诉模型下一行的内容才需要翻译。当然也可以使用其他xml或者json标签
* 同时也可以改进优化要求大语言模型按照特定的标签输出,但是deepseek-r1对格式化输出并不友好,这也是官方所说的缺陷之一,这里我们只要求他输出唯一结果即可。
2. LLmTranslator.kt 中设计的输出模板
- if (data == "<think>") {
- inThinking = true
- return
- } else if (data == "</think>") {
- inThinking = false
- callback.onThinking("", true)
- return
- }
- if (inThinking) {
- callback.onThinking(data, false)
- } else {
- if (data == "\n") return
- callback.onResult(data, false)
- } else {
- callback.onThinking("", true)
- callback.onResult("", true)
- }
按照模型输出,我们只判断<think></think>标签来提取思考和结果内容。
3. 由于思考类型的模型think会比较久,所以他适合的场景和其他LLM是不一样的,他更适合做教学、博弈、分析、解题、决策等工作,我们此篇demo做的就是类教学的场景,后面有空的话我想写个象棋博弈的apk,也挺适合这类模型
4. 有的人觉得1.5b模型太弱,其实小模型无法覆盖所有场景对话,但在特定的场景使用上是完全足够的。我们可以通过fine tunning、lora等手段来二次训练模型,让他更适合产品的特定场景应用(而非即要...又要...),让产品更容易落地。
|
|