烟台网站建设方案报价免费律师咨询
2026/1/29 0:43:11 网站建设 项目流程
烟台网站建设方案报价,免费律师咨询,绿色网站设计,做网站 买空间最近在使用llamasharp 本地加载大模型输出#xff0c;模型启动#xff0c;模型会话#xff0c;模型使用cuda都没有任何问题#xff0c;但是到最后一步#xff0c;让大模型输出内容的时候发现#xff0c;要么输出内容重复#xff0c;要么输出角色标识#xff0c;自问自答…最近在使用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 Liststring() {\n\n}; //Inference.InferPromptAnti!.Split(,).ToList();其他的截断提示词先不管设置\n\n, 基本能满足要求。调试时候正常了但是我通过前端设置了 多个提示词通过分隔然后读取到liststring 对象里面的时候发现又不起作用了这里有个小坑这个分隔字符串不能加双引号而且不能设置成 \\n\\n通过转移来识别因为c#默认下的\\转义为\ ,是输出了文本不是换行符所以处理的时候 截至词才能匹配llama.cpp, 其实这是c# 到c语法的一个差异性导致的如果不同时精通这两种语言估计始终找不到问题所在。经过这些处理一切正常可以平替了ollama和dify 以及Inferences 实现本地化自开发人工智能应用了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询