NLP实践——Llama-2 多轮对话prompt构建

这篇具有很好参考价值的文章主要介绍了NLP实践——Llama-2 多轮对话prompt构建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 问题提出

最近,META开源了Llama-2模型,受到了广泛的关注和好评,然而,在官方给的使用说明中,并没有对使用方法进行特别细节的介绍,尤其是对于对话任务,这就给我们在使用时带来了很多困扰。

以ChatGLM为例,在执行多轮对话时,需要将历史信息拼接到输入中,以供模型在生成时计算历史token与当前query之间的交互(self-attn):

# ChatGLM中对话prompt的产生:
	prompt = ""
	for i, (old_query, response) in enumerate(history_input):
	    prompt += "[Round {}]\n问:{}\n答:{}\n".format(i, old_query, response)
	prompt += "[Round {}]\n问:{}\n答:".format(len(history_input), query_input)

所以可以很自然的想到,如果使用Llama-2模型进行对话,应该也有这样一套模板,与训练过程中的对话形式相匹配。

于是经过简单的搜索后,在reddit论坛找到了Llama-2官方所提供的说明:

https://www.reddit.com/r/LocalLLaMA/comments/155po2p/get_llama_2_prompt_format_right/

2. prompt的正确形式

根据官方账号给出的说明,在对话时,用户所提供的prompt应当满足以下形式:

<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>

{{ user_message }} [/INST]

其中,<s><\s><<SYS>><</SYS>>[INST],以及[/INST]是特殊token,标记着prompt中各个部分的构成。

{{ system_prompt }}部分是整个对话中的通用前缀,一般用来给模型提供一个身份,作为对话的大背景。
{{ user_message }}部分是用户所提供的信息,可以理解为多轮对话中其中一轮对话的内容。

并且,其给出了一个样例:

<s>[INST] <<SYS>>
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe.  Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.

If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information.
<</SYS>>

There's a llama in my garden 😱 What should I do? [/INST]

然而,这个简单的样例并不能很好的反映多轮对话的场景,因为它只描述了用户怎样提供第一轮输入,对于几个特殊token如何使用,也没有很好的说明。

幸运的是,在评论区有用户@Evening_Ad6637给出了更加完整的样例以供我们参考:

假设输入是以下形式的对话:

<s>[INST] <<SYS>>

You are are a helpful... bla bla.. assistant

<</SYS>>

Hi there! [/INST] Hello! How can I help you today? </s><s>[INST] What is a neutron star? [/INST] A neutron star is a ... </s><s> [INST] Okay cool, thank you! [/INST]

那么当这个整体作为prompt输入给模型去进行generate时,模型的输出应该是类似于You're welcome! 之类的话。

更详细的解释一下:

    1. 每一组<s></s>之间是一个相对完整的单元,可以理解为一个对话轮次(如果直接给一个文本作为输入,也可以看到模型的输入结果分别是以这两个BOS和EOS token作为结尾的)。
    1. [INST][/INST]用于区分在当前这一轮的对话(历史)中,用户输入的部分与模型返回的部分。位于[INST]之后,/[INST]之前的文本,是用户在这一轮次对话中所输入的query,而/[INST]之后的文本,是模型针对这一query所作出的回答。
    1. 在对话中的第一组单元,可以提供整个对话的背景信息,并以<<SYS>><</SYS>>作为特殊标记,位于它们之间的,是对话的背景信息。
    1. 需要额外注意,有些特殊标记与文本之间是有空格的,容易遗漏。

3. 效果测试

为了验证prompt是否有效,我们做一个简单的实验,场景是询问动物相关的问题。

(1)首先假设Llama-2模型是一个动物学家,以此作为背景:

You are a zoologist, you will answer my questions about animals.

(2)然后提供一轮对话历史:

- What is an elephant?
- Ah, an excellent question! Elephants are fascinating creatures, and I'm happy to share my knowledge with you.\nAn elephant is a large, intelligent, and social mammal that belongs to the family Elephantidae.

(3)接下来,提供新一轮对话的query

How much does it weigh?

注意,在这里我回避了使用elephant这个词,而是直接用it进行指代。

(4)完整的prompt
根据前文所述的prompt格式,可以将当前轮次输入给模型进行generate的完整prompt构造如下:

text = """<s>[INST] <<SYS>>
You are a zoologist, you will answer my questions about animals. 
<</SYS>>

What is an elephant? [/INST] Ah, an excellent question! Elephants are fascinating creatures, and I'm happy to share my knowledge with you.\nAn elephant is a large, intelligent, and social mammal that belongs to the family Elephantidae.</s><s>[INST] How much does it weigh? [/INST]"""

(5)返回结果
经过generate(生成参数为:{“max_length”: 4096, “num_beams”: 3, “temperature”: 0.9})并解码之后,模型生成结果为:

"<s><s> [INST] <<SYS>>\nYou are a zoologist, you will answer my questions about animals. \n<</SYS>>\n\nWhat is an elephant? [/INST] Ah, an excellent question! Elephants are fascinating creatures, and I'm happy to share my knowledge with you.\nAn elephant is a large, intelligent, and social mammal that belongs to the family Elephantidae.</s><s> [INST] How much does it weigh? [/INST]  Great question! The weight of an elephant can vary depending on the species and the individual animal. Here are the average weights for the two main species of elephants:\n* African elephants: Males typically weigh between 5,000 to 14,000 pounds (2,268 to 6,350 kilograms), while females weigh between 4,000 to 9,000 pounds (1,814 to 4,082 kilograms).\n* Asian elephants: Males typically weigh between 3,000 to 6,000 pounds (1,361 to 2,722 kilograms), while females weigh between 2,000 to 3,000 pounds (907 to 1,361 kilograms).\nIt's worth noting that these are just averages, and individual elephants can vary significantly in weight depending on various factors such as age, sex, and nutrition.</s>"

可以看到对话的效果还是不错的,可以比较好的回答出当前轮次关于大象体重的问题。

4. 结尾

本文介绍了如何构建Llama多轮对话的prompt,以适应模型的训练过程中的结构。如果需要搭建一个对话工具,还需要进行一些其他额外的工作,例如对模型生成结果进行截断、对中间kv进行缓存等。

chat与stream_chat的实现可以参考chatGLM的写法:
https://huggingface.co/THUDM/chatglm2-6b/blob/main/modeling_chatglm.py

如何在对话过程中进行显存控制,可以参考我之前的这一篇博客:
https://blog.csdn.net/weixin_44826203/article/details/130401177

此外,还有关于特殊token的一点小疑问,我实验过程中所使用的Llama-2-7b-chat-hf模型,只将<s><\s>列为了特殊token,而<<SYS>><</SYS>>[INST],以及[/INST]都只是普通字符,在tokenize的时候会被切分开,不知道是我用错了模型还是什么其他的原因,希望官方在后续能够提供更加详细的说明介绍。

如果本文对你的学习和工作有所帮助的话,记得点一个免费的赞。转载请注明出处。文章来源地址https://www.toymoban.com/news/detail-613900.html

到了这里,关于NLP实践——Llama-2 多轮对话prompt构建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何基于文心一言NLP大模型搭建生成式智能对话服务

    随着人工智能技术的不断发展,自然语言处理(NLP)在智能对话领域的应用越来越广泛。文心一言NLP大模型作为当前先进的NLP技术之一,能够为智能对话服务提供强大的支持。本文将详细介绍如何基于文心一言NLP大模型搭建生成式智能对话服务,帮助读者了解语言理解和生成

    2024年02月01日
    浏览(40)
  • 扁鹊:指令与多轮问询对话联合微调的医疗对话大模型

    👏🏻 2023.04.22: 基于扁鹊-1.0模型的医疗问答系统Demo,详情访问:https://huggingface.co/spaces/scutcyr/BianQue 👏🏻 2023.04.22: 扁鹊-1.0版本模型发布,详情见:扁鹊-1.0:通过混合指令和多轮医生问询数据集的微调,提高医疗聊天模型的“问”能力(BianQue-1.0: Improving the “Question” Abil

    2024年02月14日
    浏览(26)
  • 大模型开发(六):OpenAI Completions模型详解并实现多轮对话机器人

    授权声明: 本文基于九天Hector的原创课程资料创作,已获得其正式授权。 原课程出处:九天Hector的B站主页,感谢九天Hector为学习者带来的宝贵知识。 请尊重原创,转载或引用时,请标明来源。 全文共7000余字,预计阅读时间约15~30分钟 | 满满干货(附代码),建议收藏! 本文

    2024年02月16日
    浏览(32)
  • OpenAI开发系列(六):Completions模型的工作原理及应用实例(开发多轮对话机器人)

    授权声明: 本文基于九天Hector的原创课程资料创作,已获得其正式授权。 原课程出处:九天Hector的B站主页,感谢九天Hector为学习者带来的宝贵知识。 请尊重原创,转载或引用时,请标明来源。 全文共7000余字,预计阅读时间约15~30分钟 | 满满干货(附代码),建议收藏! 本文

    2024年02月13日
    浏览(28)
  • 【NLP】Llama & Alpaca大模型

      🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】 ​​  🖍foreword

    2024年02月09日
    浏览(34)
  • [NLP]LLM---大模型指令微调中的“Prompt”

    大家有没有分析过 prompt对模型训练或者推理的影响?之前推理的时候,发现不加训练的时候prompt,直接输入模型性能会变差的,这个倒是可以理解。假如不加prompt直接训练,是不是测试的时候不加prompt也可以?还有一个就是多轮prompt和单轮prompt怎么构造的问题?好多模型训练

    2024年02月09日
    浏览(35)
  • [NLP] Llama2模型运行在Mac机器

    本文将介绍如何使用llama.cpp在MacBook Pro本地部署运行量化版本的Llama2模型推理,并基于LangChain在本地构建一个简单的文档QA应用。本文实验环境为Apple M1 芯片 + 8GB内存。 Llama2是 Meta AI开发的Llama大语言模型的迭代版本,提供了7B,13B,70B参数的规格。Llama2和Llama相比在对话场景中

    2024年01月16日
    浏览(40)
  • 多轮对话系统

    目录 1. 多轮对话概述 1.1 对话类型分类 1.2 应用场景 2. 基于模块化架构的对话系统 2.1 基于模块化对话框架图 2.2 语言理解模块NLU 2.3 对话管理模块 2.4 语言生成 3. 端到端的对话系统 4. 模块化与端到端对比 4.1 模块化架构的优缺点 4.2 端到端架构的优缺点 5 总结 在自然语言处理

    2024年02月14日
    浏览(23)
  • [NLP]LLM---FineTune自己的Llama2模型

    Let’s talk a bit about the parameters we can tune here. First, we want to load a  llama-2-7b-hf  model and train it on the  mlabonne/guanaco-llama2-1k  (1,000 samples), which will produce our fine-tuned model  llama-2-7b-miniguanaco . If you’re interested in how this dataset was created, you can check this notebook. Feel free to change it: there ar

    2024年02月09日
    浏览(37)
  • Rasa 多轮对话机器人

    目录 Rasa 开源机器人 1. 学习资料 2. Rasa 安装 2.1. rasa 简介 2.2. Rasa系统结构 2.3. 项目的基本流程 2.4. Rasa安装 2.5. 组件介绍 3. Rasa NLU 3.0. NLU 推理输出格式 3.1. 训练数据 ./data/nlu.yml 数据文件 3.2. ./config.yml配置文件 4. Rasa Core 4.1. 领域 4.2. 动作Action 4.2.1. 回复动作 4.2.2. 表单 4.2.3. 默

    2024年01月24日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包