语言:
- 英文
任务标签:
- 文本生成
标签:
- 英伟达
- chatqa-2
- chatqa
- llama-3
- pytorch
模型详情
我们推出Llama3-ChatQA-2系列128K长上下文模型,填补了开源大语言模型与领先专有模型(如GPT-4-Turbo)在长上下文理解和检索增强生成(RAG)能力之间的差距。该模型基于改进版ChatQA-1.5论文训练方案开发,并构建于Llama-3基础模型之上。我们通过三个阶段微调流程扩展了基础模型的上下文窗口(从8K到128K tokens),显著提升了指令遵循、RAG性能和长上下文理解能力。Llama3-ChatQA-2提供两个版本:8B和70B参数模型,原始训练采用Megatron-LM框架,现已转换为Hugging Face格式。更多信息请访问项目网站!
相关资源
70B模型 评估数据 训练数据 官网 论文
基准测试概览
我们在短上下文RAG基准(ChatRAG,4K tokens内)、SCROLLS和LongBench长文本任务(32K tokens内)以及InfiniteBench超长文本任务(超100K tokens)上评估ChatQA 2,结果如下图所示。

注:ChatQA-2基于Llama-3基础模型构建。
提示词格式
强烈建议采用以下格式:
存在上下文时
系统:{系统提示}
{上下文内容}
用户:{问题}
助手:{回答}
用户:{问题}
助手:
无上下文时
系统:{系统提示}
用户:{问题}
助手:{回答}
用户:{问题}
助手:
系统提示内容如下:
这是用户与AI助手的对话。助手需基于上下文给出详尽、礼貌的回答,若答案不在上下文中应明确说明。
注意:本模型专为文档或检索上下文场景优化。
使用指南
整文档上下文处理
适用于文档可完整载入模型的场景:
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_id = "nvidia/Llama3-ChatQA-2-8B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16, device_map="auto")
messages = [
{"role": "user", "content": "第四财季净利润同比变化百分比是多少?"}
]
document = """英伟达(NASDAQ: NVDA)公布2024财年第四季度财报:营收221亿美元,环比增长22%,同比增长265%。\n当季GAAP稀释每股收益4.93美元,环比增长33%,同比增长765%。非GAAP每股收益5.16美元,环比增长28%,同比增长486%。\n2024财年第四季度关键数据(单位:百万美元)\n| 项目 | Q4 FY24 | Q3 FY24 | Q4 FY23 | 环比 | 同比 |\n| 营收 | 22,103 | 18,120 | 6,051 | +22% | +265% |\n| 毛利率 | 76.0% | 74.0% | 63.3% | +2.0点 | +12.7点 |\n| 运营支出 | 3,176 | 2,983 | 2,576 | +6% | +23% |\n| 运营利润 | 13,615 | 10,417 | 1,257 | +31% | +983% |\n| 净利润 | 12,285 | 9,243 | 1,414 | +33% | +769% |\n| 每股收益 | 4.93 | 3.71 | 0.57 | +33% | +765% |"""
def get_formatted_input(messages, context):
system = "系统:这是用户与AI助手的对话。助手需基于上下文给出详尽、礼貌的回答,若答案不在上下文中应明确说明。"
instruction = "请针对问题提供完整解答。"
for item in messages:
if item['role'] == "user":
item['content'] = instruction + " " + item['content']
break
conversation = '\n\n'.join(["用户:" + item["content"] if item["role"] == "user" else "助手:" + item["content"] for item in messages]) + "\n\n助手:"
formatted_input = system + "\n\n" + context + "\n\n" + conversation
return formatted_input
formatted_input = get_formatted_input(messages, document)
tokenized_prompt = tokenizer(tokenizer.bos_token + formatted_input, return_tensors="pt").to(model.device)
terminators = [
tokenizer.eos_token_id,
tokenizer.convert_tokens_to_ids("<|eot_id|>")
]
outputs = model.generate(input_ids=tokenized_prompt.input_ids, attention_mask=tokenized_prompt.attention_mask, max_new_tokens=128, eos_token_id=terminators)
response = outputs[0][tokenized_prompt.input_ids.shape[-1]:]
print(tokenizer.decode(response, skip_special_tokens=True))
生成命令
python evaluate_cqa_vllm_chatqa2.py --model-folder ${模型路径} --eval-dataset ${数据集名} --start-idx 0 --end-idx ${样本数} --max-tokens ${最大token数} --sample-input-file ${数据集路径}
完整配置参见all_command.sh文件。
联系
彭旭(pengx@nvidia.com),魏平(wping@nvidia.com)
引用
@article{xu2024chatqa,
title={ChatQA 2:弥合开源与专有大模型在长上下文和RAG能力的差距},
author={徐鹏 and 魏平 and 吴宪超 and 刘子涵 and Mohammad Shoeybi and Bryan Catanzaro},
journal={arXiv预印本 arXiv:2407.14482},
year={2024}
}
许可
本模型遵循非商业许可协议,使用需遵守META LLAMA 3社区许可协议