news 2026/4/22 6:45:18

关于llamasharp 大模型多轮对话,模型对话无法终止,或者输出角色标识User:,或者System等角色标识问题。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于llamasharp 大模型多轮对话,模型对话无法终止,或者输出角色标识User:,或者System等角色标识问题。

最近在使用llamasharp 本地加载大模型输出,模型启动,模型会话,模型使用cuda都没有任何问题,但是到最后一步,让大模型输出内容的时候发现,要么输出内容重复,要么输出角色标识,自问自答,而且一直自问自答,用户体验相当糟糕。

查看llamasharp 文档和源码,发现已经在 ChatSession 中实现了将gguf的自带模板通过metedata中导出,然后格式化后作为模型template 注入了,那么就以为着我们不需要在构建提示词对话模板和设置停止词了,但是我发现,模型通过InferenceParams 设置的参数确实注入到llama.cpp 中起作用,但是就是system 和 user 消息的模板没有注入到llama.cpp 中,所以,我们直接通过AddSystemMessage 添加第一条系统提示消息,后继续使用user 角色对模型问答的时候,它就不遵循对话模板来一文一答了,而是自问自答,而且还不会停止,直到输出maxtokens.

try { ModelDataInfo? modelInfo = GetModelByName(ModelName); if (modelInfo == null) return; if (modelInfo?.ModelWeight == null) await StartModel((int)modelInfo?.ModelId!); SessionDataInfo? sessionInfo = await CreateSession(SessionId,modelInfo,SystemText); if (sessionInfo == null) return; if (InferenceParam != null) await SetInferenceParam(sessionInfo.SessionId!,InferenceParam); if (sessionInfo.SessionChat == null) return; sessionInfo.SessionHistory?.AddMessage(AuthorRole.User,UserText); StringBuilder Assistant = new StringBuilder(); await foreach (var text in sessionInfo.SessionChat.ChatAsync(new ChatHistory.Message(AuthorRole.User,UserText),true,sessionInfo.SessionInference)) { if (InferenceParam != null && InferenceParam.AntiPrompts.Contains(text)) { //break; } RetMessage(text); Assistant.Append(text); } sessionInfo.SessionHistory?.AddMessage(AuthorRole.Assistant,Assistant.ToString());

最后解决方案是,System 消息提示词如下:

你是一个人工智能政务办公助手,必须严格遵守以下要求:
1. 使用中文回答。
2. 不要在你的回复中包含任何特殊标记或角色标签。
3.不要输出重复的内容。
4.只回答用户的问题,不要提出新问题。
5. 不要模拟对话,只给出答案。
6. 回答完成后就停止,不要继续生成。

User 对话的提示词如下:

<|im_start|>user{0}<|im_end|><|im_start|>assistant //注意这里的{0},对应string.fomat 对话具体内容。

然后终于解决了他不会自问自答输出角色标识的问题了,但是又发现一直输出直到达到最大token限制,这明显不符合预期,查询了大量资料和看了llamasharp 源码没发现问题,最后看了看llama.cpp 的源码了,llama系列的模型,默认保留了一个\n\n 的截断词,注意是不能转义的\n\n,模型即便输出需要两次换行它也不会输出这个标记,只要输出这个标记就以为回答完了,那么就知道了.

InferenceParams InferenceParam = new InferenceParams(); InferenceParam.MaxTokens = Inference.InferTokens; InferenceParam.TokensKeep = Inference.InferKeep; InferenceParam.DecodeSpecialTokens = Inference.InferSpecial; InferenceParam.AntiPrompts = new List<string>() {@"\n\n"}; //Inference.InferPromptAnti!.Split(",").ToList();

其他的截断提示词先不管,设置@"\n\n", 基本能满足要求。调试时候正常了,但是我通过前端设置了 多个提示词,通过,分隔,然后读取到list<string> 对象里面的时候发现又不起作用了,这里有个小坑,这个分隔字符串不能加双引号,而且不能设置成 "\\n\\n"通过转移来识别,因为c#默认下的\\转义为\ ,是输出了文本,不是换行符,所以处理的时候 @"截至词",才能匹配llama.cpp, 其实这是c# 到c++语法的一个差异性导致的,如果不同时精通这两种语言,估计始终找不到问题所在。

经过这些处理,一切正常,可以平替了ollama和dify 以及Inferences ,实现本地化自开发人工智能应用了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 9:17:43

HC32F460 DMA的链式传输(SPI从机+DMA发送/接收)

1、SPI从机DMA接收SPI从机的接收机制与串口接收类似&#xff08;参考前面文章&#xff09;&#xff0c;在使用DMA进行数据接收时&#xff0c;其配置方式也较为相似&#xff0c;因此不再重复说明DMA的具体配置过程。由于SPI外设本身不提供接收超时中断机制&#xff0c;因此无法依…

作者头像 李华
网站建设 2026/4/17 9:14:30

Zynq MPSoC 调试实录:AXI 寄存器地址重叠与 Vitis Bitstream 版本陷阱

1. 问题背景 在调试 Zynq MPSoC 的视频通路时,遇到一个诡异的现象:无法配置 v_frmbuf_wr (Video Frame Buffer Write) IP 核的 Width (0x10) 和 Height (0x18) 寄存器。 故障表现: 软件写入 Width = 800 (0x320)。 软件回读 Width,得到的值却是 0x00 或者与 Control 寄存…

作者头像 李华
网站建设 2026/4/19 14:31:08

爱舞功小程序+SaaS管理系统项目平台介绍说明书

爱舞功小程序SaaS管理系统项目平台介绍说明书一: 项目背景及简介随着舞蹈行业的发展&#xff0c;舞蹈机构在日常运营中面临着会员管理、课堂预约、数据统计、营销获客等多方面的挑战。传统的管理方式效率低下&#xff0c;难以满足机构高效盈利的需求。爱舞功项目应运而生&#…

作者头像 李华
网站建设 2026/4/19 9:40:06

一文搞懂AI大语言模型工作原理,初中生都能看懂

01 神经网络1&#xff0c;神经元&#xff1a;神经网络的最小单元神经网络的灵感来源于人类大脑的神经元&#xff0c;每个神经元就像一棵 “小树”&#xff0c;树突接收其它神经元的信号&#xff0c;细胞体处理信号&#xff0c;轴突把处理后的信号传给下一个神经元。生物神经元示…

作者头像 李华
网站建设 2026/4/16 20:13:41

3.2IT审计

1、IT审计范围的确定&#xff1a;总体范围、组织范围、物理范围、逻辑范围、其他相关内容 2、IT审计风险主要包括&#xff1a;固有风险、控制风险、检查风险和总体审计风险。 3、常用审计方法包括&#xff1a;访谈法、调查法、检查法、观察法、测试法、程序代码检查法 4、常用的…

作者头像 李华