关于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
)