在这篇文章中,我将向大家展示如何使用Gradient和LlamaIndex微调Llama2模型(以llama2-7b为例),以便生成更好的结构化输出。我们将通过以下步骤实现这一目标:
- 环境设置
- 定义Pydantic模型和程序
- 记录输入和输出
- 在数据集上进行微调
- 尝试微调后的模型
环境设置
首先,我们需要安装相关的Python包:
%pip install llama-index-llms-gradient
%pip install llama-index-llms-openai
%pip install llama-index-readers-file pymupdf
%pip install llama-index-finetuning
然后,我们需要导入必要的库并设置Gradient的环境变量:
import os
from llama_index.llms.gradient import GradientBaseModelLLM
from llama_index.finetuning import GradientFinetuneEngine
os.environ["GRADIENT_ACCESS_TOKEN"] = os.getenv("GRADIENT_API_KEY")
os.environ["GRADIENT_WORKSPACE_ID"] = "<insert_workspace_id>"
定义Pydantic模型和程序
我们将定义一个Pydantic模型用于表示一个专辑,然后创建一个基于GPT-4的函数调用程序,生成结构化的输出:
from pydantic import BaseModel
from llama_index.core.program import LLMTextCompletionProgram
from llama_index.core.output_parsers import PydanticOutputParser
class Album(BaseModel):
"""Data model for an album."""
name: str
artist: str
prompt_template_str = """
Generate an example album, with an artist and a list of songs.
Using the movie {movie_name} as inspiration.
"""
openai_llm = OpenAI(model="gpt-4")
gradient_llm = GradientBaseModelLLM(base_model_slug="llama2-7b-chat", max_tokens=300)
openai_program = LLMTextCompletionProgram.from_defaults(
output_parser=PydanticOutputParser(Album),
prompt_template_str=prompt_template_str,
llm=openai_llm,
verbose=True,
)
gradient_program = LLMTextCompletionProgram.from_defaults(
output_parser=PydanticOutputParser(Album),
prompt_template_str=prompt_template_str,
llm=gradient_llm,
verbose=True,
)
记录输入和输出
我们将定义一些示例电影名称作为输入,并记录函数调用程序生成的输出:
movie_names = [
"The Shining", "The Departed", "Titanic", "Goodfellas", "Pretty Woman",
"Home Alone", "Caged Fury", "Edward Scissorhands", "Total Recall", "Ghost"
]
from tqdm import tqdm
for movie_name in tqdm(movie_names):
output = openai_program(movie_name=movie_name)
print(output.json())
events = finetuning_handler.get_finetuning_events()
finetuning_handler.save_finetuning_events("mock_finetune_songs.jsonl")
在数据集上进行微调
我们现在定义一个微调引擎并在生成的数据集上进行微调:
base_model_slug = "llama2-7b-chat"
base_llm = GradientBaseModelLLM(base_model_slug=base_model_slug, max_tokens=500, is_chat_model=True)
finetune_engine = GradientFinetuneEngine(
base_model_slug=base_model_slug,
name="albums_structured",
data_path="mock_finetune_songs.jsonl",
verbose=True,
max_steps=200,
batch_size=1
)
epochs = 2
for i in range(epochs):
print(f"** EPOCH {i} **")
finetune_engine.finetune()
尝试微调后的模型
最后,我们将获取微调后的模型并使用Pydantic程序进行测试:
ft_llm = finetune_engine.get_finetuned_model(max_tokens=500, is_chat_model=True)
new_prompt_template_str = """
Generate an example album, with an artist and a list of songs.
Using the movie {movie_name} as inspiration.
"""
gradient_program = LLMTextCompletionProgram.from_defaults(
output_parser=PydanticOutputParser(Album),
prompt_template_str=new_prompt_template_str,
llm=ft_llm,
verbose=True,
)
response = gradient_program(movie_name="Goodfellas")
print(response)
总结
在这篇文章中,我们详细介绍了如何通过使用Gradient和LlamaIndex微调Llama2模型生成结构化的输出。希望这些步骤能够帮助你在自己的项目中进行模型微调。
可能遇到的错误
- 环境变量未设置: 确保已经正确设置了
GRADIENT_ACCESS_TOKEN
和GRADIENT_WORKSPACE_ID
。 - 模型加载失败: 请确保已经正确安装了所有依赖包,并且网络连接正常。
- 微调失败: 检查微调数据集是否正确格式化,并确保每个步骤配置正确。
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料: