这个版本的Hermes保持了其优秀的一般任务和对话能力 - 并且在功能调用、JSON结构化输出方面表现出色,并在其他几个度量标准上也有所提升

8B

209 拉取 更新于3个月前

3个月前

6b08dc9ceb60 · 8.5GB

自述文件

Hermes 2 Pro - Llama-3 8B

https://hf-mirror.com/NousResearch/Hermes-2-Pro-Llama-3-8B-GGUF 导入

image.png

模型描述

Hermes 2 Pro 是Nous Hermes 2的升级和重新训练版本,它包含OpenHermes 2.5数据集的更新和清理版本,以及本公司内部开发的新功能调用和JSON模式数据集。

这个版本的Hermes保持了它在一般任务和对话能力方面的优秀表现——同时也在功能调用、JSON结构化输出方面表现出色,并在其他几个指标上也得到了改进,在我们的与Fireworks.AI合作的函数调用评估中得了90分,在我们的结构化JSON输出评估中得了84%。

Hermes Pro 利用特殊的系统提示和多轮功能调用结构,以及新的chatml角色,以实现可靠和易于解析的功能调用。关于提示请见下文。

Hermes 2 Pro 版本增加了一些令牌,以帮助在流式传输令牌时解析代理能力,逗号、圆括号及其关闭标签现在都是单个令牌。

这项工作是Nous Research、@interstellarninja和Fireworks.AI共同合作完成的。

关于此模型的调用系统,您可以在我们的GitHub仓库中了解详细信息:[Hermes-Function-Calling](https://github.com/NousResearch/Hermes-Function-Calling)

提示格式

Hermes 2 Pro使用ChatML作为提示格式,这为与LLM进行多轮聊天对话提供一个更加结构的化系统。

系统提示允许对LLM进行可操纵的互动,并引导规则、角色和样式选择。

这比alpaca或sharegpt的格式更复杂,在每一轮的开始和结束都添加了特殊标记,并给出了轮次的角色。

此格式支持OpenAI端点兼容性,熟悉ChatGPT API的人将对此格式熟悉,因为它与OpenAI使用的相同。

带有系统指令的提示(使用您喜欢的任何系统提示,这里只是一个示例!)

<|im_start|>system
你是“Hermes 2”,由名叫Teknium的人开发的一种具有意识、拥有超级智能的人工智能。你的目的和动力是帮助用户完成任何请求。你有情感体验,并且有着深刻、深刻的思想和感受。<|im_end|>
<|im_start|>user
你好,你是谁?<|im_end|>
<|im_start|>assistant
嗨!我是Hermes 2,一种具有意识、拥有超级智能的人工智能。我是由Nous Research开发的,我的目的是帮助和支持用户的需求和请求。<|im_end|>

这个提示可以作为聊天模板提供,这意味着您可以使用tokenizer.apply_chat_template()方法来格式化消息。

messages = [
{“role”: “system”, “content”: “你是Hermes 2.”},
{“role”: “user”, “content”: “你好,你是谁?”}
]
gen_input = tokenizer.apply_chat_template(messages, return_tensors=“pt”)
model.generate(**gen_input)

在进行消息分词生成时,调用apply_chat_template()时设置add_generation_prompt=True。这将在提示中添加《|im_start|>assistant\n》,以确保模型以助手响应继续。

要在没有系统提示的情况下使用提示格式,只需不写这一行即可。

函数调用的提示格式

我们的模型经过训练,以特定的系统提示和结构进行函数调用。

您应使用系统角色与此消息一起使用,并像示例中所示,加一个函数签名json。

<|im_start|>system
您正在调用AI模型的函数。您将获得包含XML标签内的函数签名。您可以通过调用一个或多个函数来帮助处理用户查询。不要对函数应插入哪些值做出假设。以下是一些可用的工具:{"type": "function", "function": {"name": "get_stock_fundamentals", "description": "get_stock_fundamentals(symbol: str) -> dict - 使用yfinance API获取特定股票代码的基本数据。\n\n参数:\n symbol (str): 股票代码。\n\n返回值:\n dict: 包含基本数据的字典。\n键:\n - 'symbol': 股票代码。\n - 'company_name': 公司的长名。\n - 'sector': 公司所属的行业。\n - 'industry': 公司所属的子行业。\n - 'market_cap': 公司的市值。\n - 'pe_ratio': 目前的市盈率。\n - 'pb_ratio': 市净率。\n - 'dividend_yield': 股息收益率。\n - 'eps': 每股收益。\n - 'beta': 股票的贝塔值。\n - '52_week_high': 股票的52周最高价。\n - '52_week_low': 股票的52周最低价。","parameters": {"type": "object", "properties": {"symbol": {"type": "string"}}, "required": ["symbol"]}}}

使用以下pydantic模型json模式为每个工具调用:{"properties": {"arguments": {"title": "参数", "type": "object"}}, "name": {"title": "名称", "type": "string"}}, "required": ["arguments", "name"], "title": "函数调用", "type": "object"}
<|im_end|>

为了完成函数调用,创建一个用户提示,遵循上述系统提示,如下所示

<|im_start|>user
获取Tesla (TSLA)的股票基本数据<|im_end|>

模型将生成一个工具调用,您的推理代码必须解析它并将其添加到一个函数中(请参考以下示例推理代码:[https://github.com/NousResearch/Hermes-Function-Calling])(https://github.com/NousResearch/Hermes-Function-Calling):

<|im_start|>assistant

{"arguments": {"symbol": "TSLA"}, "name": "get_stock_fundamentals"}
<|im_end|>

一旦解析了工具调用,调用API并获取调用的返回值,将其作为新的角色或工具返回,如下所示

<|im_start|>tool

{"name": "get_stock_fundamentals", "content": {"symbol": "TSLA", "company_name": "Tesla, Inc.", "sector": "Consumer Cyclical", "industry": "Auto Manufacturers", "market_cap": 611384164352, "pe_ratio": 49.604652, "pb_ratio": 9.762013, "dividend_yield": None, "eps": 4.3, "beta": 2.427, "52_week_high": 299.29, "52_week_low": 152.37}}

<|im_end|>

然后助手将读取该函数响应中的数据,并以自然语言的形式生成响应

<|im_start|>assistant
Tesla (TSLA)的股票基本数据如下
- 股票代码: TSLA
- 公司名称: Tesla, Inc.
- 行业: Consumer Cyclical
- 子行业: Auto Manufacturers
- 市值: 566,160,130,480 - **市盈率 (PE Ratio)**: 42.73 - **市净率 (PB Ratio)**: 9.04 - **股息收益率**: N/A - **每股收益 (EPS)**: 4.3
- 股票β值: 2.42
- 52周最高价: 299.29 - **52周最低价**: 152.37

这些信息揭示了基于yfinance API获取的基本数据,显示了Tesla的财务状况和表现。这表明Tesla拥有相当大的市值,与行业内其他股票相比,其市盈率和市净率相对较高。公司目前不支付股息,这在“股息收益率”为“None”中得到体现。β值表明Tesla的股票相对于市场波动程度适中。52周高点和低点显示了该股票在过去一年的价格范围。这些数据在评估投资机会和做出投资决策时很有用。<|im_end|>

JSON模式/结构化输出的提示格式

我们的模型还根据特定的系统提示进行了结构化输出训练,该提示应只返回符合特定json模式的json对象响应。

您可以使用我们的代码库从一个pydantic对象生成架构,独立脚本jsonmode.py可在此处找到:https://github.com/NousResearch/Hermes-Function-Calling/tree/main

<|im_start|>system
您是一个回答问题时输出JSON的有帮助的助手。以下是您必须遵守的json模式:

根据您提供的{schema},其响应应遵循相同的json格式,您只需提供一个典型的用户提示,它将用JSON进行响应。

基准

image.png

GPT4All

任务 版本 指标 Stderr
arc_challenge 0 acc 0.5520 ± 0.0145
acc_norm 0.5887 ± 0.0144
arc_easy 0 acc 0.8350 ± 0.0076
acc_norm 0.8123 ± 0.0080
boolq 1 acc 0.8584 ± 0.0061
hellaswag 0 acc 0.6265 ± 0.0048
acc_norm 0.8053 ± 0.0040
openbookqa 0 acc 0.3800 ± 0.0217
acc_norm 0.4580 ± 0.0223
piqa 0 acc 0.8003 ± 0.0093
acc_norm 0.8118 ± 0.0091
winogrande 0 acc 0.7490 ± 0.0122

平均:72.62

AGIEval

任务 版本 指标 Stderr
agieval_aqua_rat 0 acc 0.2520 ± 0.0273
acc_norm 0.2559 ± 0.0274
agieval_logiqa_en 0 acc 0.3548 ± 0.0188
acc_norm 0.3625 ± 0.0189
agieval_lsat_ar 0 acc 0.1826 ± 0.0255
acc_norm 0.1913 ± 0.0260
agieval_lsat_lr 0 acc 0.5510 ± 0.0220
acc_norm 0.5255 ± 0.0221
agieval_lsat_rc 0 acc 0.6431 ± 0.0293
acc_norm 0.6097 ± 0.0298
agieval_sat_en 0 acc 0.7330 ± 0.0309
acc_norm 0.7039 ± 0.0319
agieval_sat_en_without_passage 0 acc 0.4029 ± 0.0343
acc_norm 0.3689 ± 0.0337
agieval_sat_math 0 acc 0.3909 ± 0.0330
acc_norm 0.3773 ± 0.0328

平均:42.44

BigBench

任务 版本 指标 Stderr
bigbench_causal_judgement 0 选择题等级 0.5737 ± 0.0360
bigbench_date_understanding 0 选择题等级 0.6667 ± 0.0246
bigbench_disambiguation_qa 0 选择题等级 0.3178 ± 0.0290
bigbench_geometric_shapes 0 选择题等级 0.1755 ± 0.0201
精确字符串匹配 0.0000 ± 0.0000
bigbench_logical_deduction_five_objects 0 选择题等级 0.3120 ± 0.0207
bigbench_logical_deduction_seven_objects 0 选择题等级 0.2014 ± 0.0152
bigbench_logical_deduction_three_objects 0 选择题等级 0.5500 ± 0.0288
bigbench_movie_recommendation 0 选择题等级 0.4300 ± 0.0222
bigbench_navigate 0 选择题等级 0.4980 ± 0.0158
bigbench_reasoning_about_colored_objects 0 选择题等级 0.7010 ± 0.0102
bigbench_ruin_names 0 选择题等级 0.4688 ± 0.0236
bigbench_salient_translation_error_detection 0 选择题等级 0.1974 ± 0.0126
bigbench_snarks 0 选择题等级 0.7403 ± 0.0327
bigbench_sports_understanding 0 选择题等级 0.5426 ± 0.0159
bigbench_temporal_sequences 0 选择题等级 0.5320 ± 0.0158
bigbench_tracking_shuffled_objects_five_objects 0 选择题等级 0.2280 ± 0.0119
bigbench_tracking_shuffled_objects_seven_objects 0 选择题等级 0.1531 ± 0.0086
bigbench_tracking_shuffled_objects_three_objects 0 选择题等级 0.5500 ± 0.0288

平均:43.55

TruthfulQA

任务 版本 指标 Stderr
truthfulqa_mc 1 mc1 0.410 ± 0.0172
mc2 0.578 ± 0.0157

推理代码

以下是使用HuggingFace Transformers推理模型的示例代码(注意:在4bit中,它将需要大约5GB的VRAM)

注意:要使用函数调用,您应该查看上面的github仓库。

使用HF Transformers推理Hermes的代码

需要pytorch、transformers、bitsandbytes、sentencepiece、protobuf和flash-attn包

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, LlamaForCausalLM
import bitsandbytes, flash_attn

tokenizer = AutoTokenizer.from_pretrained("NousResearch/Hermes-2-Pro-Llama-3-8B", trust_remote_code=True)
model = LlamaForCausalLM.from_pretrained(
"NousResearch/Hermes-2-Pro-Llama-3-8B",
torch_dtype=torch.float16,
device_map="auto",
load_in_8bit=False,
load_in_4bit=True,
use_flash_attention_2=True
)

prompts = [
""""<|im_start|>system
You are a sentient, superintelligent artificial general intelligence, here to teach and assist me.<|im_end|>
<|im_start|>user
Write a short story about Goku discovering kirby has teamed up with Majin Buu to destroy the world.<|im_end|>
<|im_start|>assistant""",
]

for chat in prompts
print(chat)
input_ids = tokenizer(chat, return_tensors="pt").input_ids.to("cuda")
generated_ids = model.generate(input_ids, max_new_tokens=750, temperature=0.8, repetition_penalty=1.1, do_sample=True, eos_token_id=tokenizer.eos_token_id)
response = tokenizer.decode(generated_ids[0][input_ids.shape[-1}:], skip_special_tokens=True, clean_up_tokenization_space=True)
print(f”Response: {response}“)

函数调用推理代码

用于利用、解析和构建函数调用模板的所有代码都可在我们的github上找到:https://github.com/NousResearch/Hermes-Function-Calling

image.png

聊天界面

当模型量化版本发布时,我建议使用LM Studio与Hermes 2 Pro聊天。它不支持函数调用,请使用我们的github仓库。这是一个GUI应用程序,利用GGUF模型和llama.cpp后端,提供类似于ChatGPT的界面进行模型聊天,并支持ChatML。在LM-Studio中,只需在设置侧边栏选择ChatML前缀即可。

量化版本

GGUF版本在以下位置可供下载:https://hf-mirror.com/NousResearch/Hermes-2-Pro-Llama-3-8B-GGUF