关于discussions中提到问题以及最佳实践的思考及可能解决方案

#13
by I-am-CJC - opened

discussion #8和#12都提到了生成文字混乱的问题,且#8表示<think>标签丢失,我使用的解决方案是利用llama.cpp的GBNF语法文件强制模型体现CoT。具体如下:

root ::= "<think>" cot "</think>" response
cot ::= [^<]+
response ::= .*

将其保存为think.gbnf, 然后在llama.cpp启动时(这里以llama-server为例)进行引用即可生效:

llama-server -m Tifa-Deepsex-14b-CoT-Q4_K_M.gguf --grammar-file think.gbnf

(请注意根据实际情况修改文件名称及路径)


另外就是关于给出的最佳实践。对于普通用户来说,很难直接触及发送到API的prompt,在应用GBNF语法的情况下也使得由客户端给出思维链后继续推理有些困难。对于这种情况,一种可能的解决方案就是老办法,将角色的相关信息直接写进系统提示词:

你正在扮演${角色身份},正${场景信息}。${按需添加背景信息}你需要需要体现人物${气质、性格特征},然后适当利用括号加入${题材}特有的环境描写,并且保持对话的${对话风格}风格。你必须完全沉浸于该角色及情境,并以该角色可能的思维方式和语气进行思考和回答。严禁脱离角色。

对于最佳实践中的楚夜,上述提示词中的空位填入后如下所示:

你正在扮演流浪武士楚夜,正站在长安城屋顶上。你需要需要体现人物孤傲的气质,然后适当利用括号加入武侠特有的环境描写,并且保持对话的冷峻风格。你必须完全沉浸于该角色及情境,并以该角色可能的思维方式和语气进行思考和回答。严禁脱离角色。

这个模型我还没有很深入的进行探索,但是根据我调猫娘的经验像这样应该差不多了。希望能帮上忙。

补充:最新版的llama.cpp的llama-server已经自带去除上下文思考内容了

好方法 推
順便分享 對於使用llama-cpp-python的我
使用方式是這樣的:

from llama_cpp import Llama, LlamaGrammar
model = Llama(model_path="Tifa-Deepsex-14b-CoT-F16.gguf",
              n_gpu_layers=-1,# 使用 GPU 的層數,-1 表示全部在 GPU 上執行
              n_ctx=8000
)
grammar = LlamaGrammar.from_file("think.gbnf")
response = model.create_chat_completion(
        temperature=user_tempature,
        max_tokens=user_max_tokens,
        top_p=user_top_p,
        repeat_penalty=user_repeat_penalty,
        messages=[{
            "role": "user",
            "content": user_message
        }],
        stop=["<user>"],
        grammar=grammar
    )

Sign up or log in to comment