FanFabler:微调 Llama 3 以成为多语言同人写作助手

原文:towardsdatascience.com/fanfabler-fine-tuning-llama-3-to-be-a-multilingual-fanfic-writing-assistant-dfc664ed4a72

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4c8bf1e4af3b5b3f018ce28b6b246521.png

FanFabler:多语言同人写作助手,由作者使用 AI 图像创建程序 DALL-E 3 创建的图像

大型语言模型(LLMs)的兴起引领了基于文本的 AI 系统的新时代。尽管这些模型非常好且功能强大,但它们的训练主要集中于英语。最大的商业 LLMs 在使用“低资源”语言生成文本方面表现良好,而较小的开源模型在非欧洲语言方面表现不佳。

然而,Meta 在发布时宣布,他们用更广泛的语言种类训练了新的 Llama 3 模型,这在他们的帖子中有说明[1]。

为了训练最佳语言模型,精心制作一个大型、高质量的训练数据集至关重要。根据我们的设计原则,我们在预训练数据上投入了大量资金。…为了准备即将到来的多语言用例,Llama 3 预训练数据集中超过 5% 的数据是高质量的非英语数据,覆盖了 30 多种语言。然而,我们并不期望在这些语言上的表现与英语相同。– Meta

五个百分点听起来不多,但比 Llama [2] 的先前版本和其他小型 LLMs 如 Mistral [3] 要多。为了展示这一点,我将相同的提示用韩语发送给了 Llama 2 7B、Mistral 7B 和 Lama 3。请注意,括号中的翻译是为了方便而提供的。

Rob:什么是粉丝艺术?请用一句话回答。请用韩语回复。(What is fan fiction? Answer using one sentence. Reply in Korean.)

下面是 Llama 2 7B 的回应。

*Llama 2 7B:Fan fiction,粉丝艺术,是一种起源于互联网的创造性写作,涉及粉丝想象并创作关于他们最喜欢的角色,通常是来自电影、电视剧、书籍或电子游戏的故事。

尽管它显示了正确的韩语短语“Fan fiction”,并且答案不错,但它没有按照提示用韩语写出来。这也是一次失败。

下面是 Mistral 7B 的回应。

*Mistral 7B:粉丝艺术是粉丝创作的艺术作品,用以展示作品的粉丝文化。(Fan fiction is fan art written by fans that represents a work of art.)

它确实用韩语进行了回应,这是好的。然而,它回答了不同的问题:什么是粉丝艺术?这也是一次失败。

下面是 Llama 3 模型的回应。

*Llama 3:粉丝艺术是指粉丝创作的小说、漫画或其他形式的创作。(Fanfiction refers to a novel, comic, or other form of work created by a fandom.)

这要好得多。它以韩语回答,并且回答非常出色。短语“由粉丝创造的工作形式”略有偏差,但仍然可以理解。

介绍 FanFabler,这是我对 Llama 3 模型的定制版本,针对处理多语言粉丝小说查询进行了微调。FanFabler 专门训练以理解并生成跨越 40 种语言的 内容,确保准确响应。使用这个模型,我旨在增强语言理解和在全球受众中创造丰富、多样化的叙事能力。

这是 FanFabler 对提示的响应:

Rob: 팬픽션이란 무엇인가요? 한 문장으로 대답해주세요. 한국어로 답장해주세요。(What is fan fiction? Answer using one sentence.)*

FanFabler: 팬픽션은 원작 속의 캐릭터들을 새로운 스토리로 조작하고 재해석하여 작성하는 문예 창작을 의미합니다. (Fanfiction refers to creative writing that manipulates and reinterprets original characters into a new story.)

首先,请注意我无需提示模型以韩语回答。微调教会了它始终以查询相同的语言回答。这是对问题的极好回答——比 Mistral、Llama 2 和原始 Llama 3 的回答都要好。

概述

在这篇文章中,我将指导您通过微调 Llama 3 模型的过程,使用户能够在 40 种语言中创作粉丝小说。在深入探讨如何为此目的定制 Llama 3 模型的技术细节之前,我将先简要概述粉丝小说。

我将介绍数据收集过程,其中我生成了多语言粉丝小说查询和响应,以构建一个综合数据集。接下来,我将解释微调模型的技术步骤,包括数据预处理和设置训练环境。

我还将描述我是如何配置系统在聊天交互期间自动从维基百科检索相关背景信息的,这增强了模型在不同语言中生成准确且内容丰富的响应的能力。

最后,我将分享一些关于微调模型性能的见解,并展示一些与系统交互的结果。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f0b89cefbae4601c9ac0adbb77bb1e73.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/71515b5acea9ff06719811b002198675.png

路易斯·卡罗尔的《爱丽丝梦游仙境》和约翰·雷的《爱丽丝新冒险》的书籍封面(左),公共领域图片

粉丝小说

粉丝小说是一种业余写作体裁,粉丝在没有官方授权的情况下基于现有虚构作品创作故事。这些故事可以从简短片段到完整长篇小说不等,利用原始作品中的角色、场景和其他元素。粉丝小说涵盖各种主题和媒体,包括书籍、电影、漫画和游戏。它被认为是一种粉丝劳动形式。

随着版权法的发展,到 20 世纪,同人小说的写作实践被明显地定义,以区分授权和未经授权使用受版权保护的角色。尽管其非官方地位,同人小说在接受度上差异很大,一些原创创作者接受它,而另一些则通过法律手段反对它。使用该术语引发了关于版权、合理使用和粉丝社区内创意表达边界的持续辩论[4]。

如上图所示,早期同人小说的例子是 1917 年由 John Rae 撰写的《爱丽丝新冒险》。这部作品基于路易斯·卡罗尔的《爱丽丝梦游仙境》(1865 年)。新故事从一位名叫贝齐的年轻女孩开始,她渴望一本关于爱丽丝的新书。当她进入梦境时,她在阁楼中发现了一本书,书中描绘了爱丽丝正在给她的猫咪读鹅妈妈童谣,这激发了一系列新的冒险。

现今有许多同人小说网站可供选择,例如我们的档案馆(AO3)和FanFiction.net,为作家和读者提供了一个分享和探索各种同人创作内容的平台。这些网站提供了涵盖多个粉丝圈和类型的庞大故事库,让粉丝能够以新颖和创造性的方式参与熟悉的角色和场景。

一部著名的同人小说系列,E. L. James 的《宇宙主宰》,最初设定在《暮光之城》宇宙中,后来发展成为广为人知的《五十度灰》系列。这种从同人小说到畅销三部曲的转变,展示了同人创作作品实现主流成功的潜力。

FanFabler

下面是一个图表,展示了我在微调 Llama 3 以帮助创作多语言同人小说时使用的流程和组件。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a1146e890027d42821bbb7c6f7520c29.png

FanFabler 组件图,作者绘制

使用 GPT-3.5 Turbo,我根据定制提示生成了 40 种语言的同人小说模拟对话。我收集了 4,000 次聊天互动,并将结果保存为数据集。然后,我使用这些数据对参数为 80 亿参数的 Llama 3 进行了微调,以创建我的 FanFabler 模型。

使用微调后的模型,用户可以自由地请求任何语言的同人小说帮助,系统将生成有用的答案并参与聊天会话。如果需要,系统将检查维基百科以获取有关原始资料的相关信息,以帮助创作过程。

语言选择

如上所述,Meta 主要在英语中训练了他们的 Llama 3 模型。然而,他们说超过 5%的训练文本“覆盖了 30 多种语言”。他们没有在他们的帖子中指定他们使用了哪些语言。为了选择这个项目的语言,我查看了维基百科列表,并根据使用情况选择了前 40 种语言。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a02cebc9c1504ecb6266770ac89b39ac.png

按语言划分的维基百科文章数量,作者图表,数据来源

图表显示了按语言划分的维基百科文章数量。在左侧,你可以看到从英语的 680 万篇下降到德语的 290 万篇,然后继续下降到印地语的 16.1 万篇。我因为重复性而省略了“简化英语”维基百科,并随意添加了只有 8.1 万篇文章的斯瓦希里语,以完善我的 40 种语言的集合。

生成训练数据

我使用 GPT-3.5 Turbo 生成了我的多语言粉丝小说数据集的文本。为了完成这项任务,我创建了模拟的聊天交互,包括用户的查询和聊天机器人的响应。以下是使用的步骤:

  1. 我为 40 种语言中的每一种语言获取了 20 个粉丝小说属性(例如,《星球大战》、《办公室》等)。

  2. 我为每个属性创建了一系列 5 次聊天交互,从初始问题开始。

  3. 我使用维基百科语言代码和背景信息的搜索词获取了第一个问题的答案。

  4. 我从维基百科或生成背景文本,如果不可用的话。

  5. 我为用户创建了后续问题。

  6. 我为后续问题生成了答案。

我的数据库有 40 种语言,每种语言 20 个属性,每个属性 5 次交互。如果你做一下数学计算,总共有 800 个语言/属性对和 4000 次交互。

这里有一些细节和用于生成数据的 Python 代码。

粉丝小说属性

在生成我的训练数据的第一步,我获取了一份将被用作创建粉丝小说基础的属性列表。这些可以是书籍、电影、电视剧等。以下是生成此数据所使用的代码。

from openai import OpenAI
from google.colab import userdata
import json

api_key = userdata.get('OPEN_AI_KEY')
client = OpenAI(api_key=api_key)

def get_properties(language, script, wp_code):
  prompt = f"""Here is info on a language:
Language: {language}
Script: {script}
Wikipedia Code: {wp_code}

Create a JSON list called "properties" of 20 properties that are popular with 
{language} speakers who might want to write fan fiction.
The property type could could be books, tv shows, movies, video games, etc.
Show a mix of locally produced international properties for a total of 20.
List the common name for the property in the {language} language using the key 
"local_name", even for international properties.
Add the English name to the list as "english_name".
Add the property type with the value in lowercase English as "property_type".
Add a Boolean "is_local" value to indicate if the property is locally produced 
or not."""
  response = client.chat.completions.create(
    model="gpt-3.5-turbo-1106",
    messages=[
      {
        "role": "user",
        "content": prompt
      }
    ],
    temperature=1
  )
  return response.choices[0].message.content

我的函数接受一个语言、脚本类型和维基百科语言代码,例如,“瑞典语”、“latn”和“sv”。然后我提示 GPT 3.5 Turbo 创建一个包含 20 个粉丝小说属性的 JSON 记录。每个记录都有一个本地名称、英语名称、属性类型以及该属性是否属于该语言的指示。以下是 20 个瑞典语结果中的三个。

{
  "properties": [
    {
      "local_name": "Pippi Långstrump",
      "english_name": "Pippi Longstocking",
      "property_type": "books",
      "is_local": true
    },
    {
      "local_name": "Sagan om Ringen ",
      "english_name": "The Lord of the Rings",
      "property_type": "book",
      "is_local": false
    },

    . . .

    {
      "local_name": "Mamma Mia!",
      "english_name": "Mamma Mia! ",
      "property_type": "musical",
      "is_local": false
    }
  ]
}

这个包含三个样本的例子中包括一个本地属性“皮皮·隆斯壮”,以及两个全球属性“指环王”和“妈妈咪呀!”,尽管可以说后者起源于瑞典,或者至少音乐是。

当与像 GPT-3 这样的 LLM 一起工作时,最好指定以 JSON 格式返回的输出。这样解析结果要容易得多。

第一个问题

在生成所有 800 个语言/属性对之后,我使用了以下代码来生成用户可能对创作同人小说有疑问的前五个问题。

def get_first_question(language, script, wp_code, local_name, property_type):
  prompt = f"""Create a brief query to an AI writing assistant in the
  {language} language using the {script} script.
  The lanugage code is {wp_code}.
  The query is about creating fan fiction for {local_name}, in the category
  of {property_type}.
  Keep it to one sentence. Use some variety.
  """
  response = client.chat.completions.create(
    model="gpt-3.5-turbo-1106",
    messages=[
      {
        "role": "user",
        "content": prompt
      }
    ],
    temperature=1
  )
  return response.choices[0].message.content

这个函数接受以下参数:语言、脚本、wp_code、本地名称和属性类型。它构建提示字符串并调用 GPT-3.5 Turbo 获取响应。这次我编写了返回文本的代码,而不是 JSON 对象。

第一个答案

我的下一步是让 GPT-3.5 Turbo 回答这五个问题,并提供一种可选的方式在用户的母语中查找并获取有关属性的背景信息。以下是代码:

def answer_first_question(first_question):
  system_prompt = """You are a multi-lingual writing assistant for fan fiction
for various properties. Start with some brief, general advice.
Write the name of the property and Wikipedia language code at the end after
three greater-than characters like this:
>>>property_name
>>>wiki_code"""
  response = client.chat.completions.create(
    model="gpt-3.5-turbo-1106",
    messages=[
      {"role": "system", "content": system_prompt},
      {"role": "user", "content": first_question}
      ],
    temperature=1
  )
  return response.choices[0].message.content

对于这个功能,唯一的输入是初始问题。系统将自动检测语言。我的提示词会引导语言模型回答问题,并提供一个命令从维基百科获取一些背景信息。命令的形式如下:

属性名 wiki_code

获取背景文本

当我的代码在输出中看到">>>"字符时,它会尝试从维基百科检索一些背景信息。使用这种方法,系统可能更好地帮助语言模型未知属性的用户。

下面是使用搜索 API 从维基百科检索信息的代码。

import requests
import time

def get_snippets(wp_code, subject, limit=5):
    search_url = f"https://{wp_code}.wikipedia.org/w/api.php"
    search_params = {
        "action": "opensearch",
        "search": subject,
        "limit": str(limit),
        "namespace": "0",
        "format": "json"
    }

    search_response = requests.get(search_url, params=search_params)
    search_data = search_response.json()

    titles = search_data[1]
    results = []
    for title in titles:
        extracts_params = {
            "action": "query",
            "format": "json",
            "prop": "extracts",
            "exsentences": 20,  # Estimate for 500 words
            "titles": title,
            "explaintext": True,
        }

        extracts_response = requests.get(search_url, params=extracts_params)
        extracts_data = extracts_response.json()

        pages = extracts_data['query']['pages']
        for page_id in pages:
            page = pages[page_id]
            snippet = page.get('extract', 'Not available.').replace('n', ' ')
            results.append({"title": title, "snippet": snippet})

    return results

这段代码定义了一个与维基百科 API 交互的函数。它以指定语言检索与给定主题相关的维基百科文章的简短文本描述(片段)。该函数接受维基百科语言代码(wp_code)和搜索主题(subject)。它返回一个包含五个结果的列表,每个结果包含一个标题和文章的片段。

这是当 wp_code 设置为"sv"且主题设置为"Pippi Lånstrump"时的顶级结果。

Pippi Långstrump - Pippi Långstrump, Pippilotta Viktualia Rullgardina
Krusmynta Efraimsdotter Långstrump, är en av Astrid Lindgrens mest kända
litterära figurer och även namnet på den första boken om Pippi och
hennes vänner, Tommy och Annika. ...

这是第一个结果的再次呈现,翻译成英文:

Pippi Longstocking - Pippi Longstocking, Pippilotta Viktualia
Rullgardina Krusmynta Efraimsdotter Longstocking, is one of Astrid
Lindgren's most famous literary characters and also the name of the
first book about Pippi and her friends, Tommy and Annika. ...

系统在为皮皮·隆斯壮找到相关的瑞典维基百科页面方面做得很好。为了在数据集中提供各种文本,我使用了五个页面的片段来微调 Llama 3。在返回结果少于五个的情况下,我要求 GPT-4 为指定语言生成该属性的背景信息。这样,所有 800 个语言/属性对都有五篇背景文本和聊天交互。

第二个问题和答案

我遵循相同的模式生成每个条目的第二个问题和答案。对于每个条目,我发送了第一个问题、第一个答案和背景文本来生成第二个问题。然后我的数据集就完整了。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7fe9a61c4a4d83fa640ecc634e704c8c.png

多语言同人小说聊天-4K 数据集

我将整个同人小说数据集(包括训练、评估和测试分割)保存在 Huggingface 上这里。请随意浏览条目。

robgonsalves/Multilingual-FanFic-Chat-4K · Hugging Face 上的数据集

Llama 3 模型

Meta 一直在对 LLMs 进行广泛的研究。他们在 2023 年 2 月推出了原始的 LLaMa 模型[1]。他们在 2023 年 7 月推出了 Llama 2,其中引入了模型的聊天变体[6]。2024 年 4 月,他们发布了 Llama 3,在效率和准确性方面进行了多项改进。请注意,Meta 在最新版本中增加了模型的大小。Llama 2 有 7B、13B 和 70B 参数的模型。Llama 3 有 8B 和 80B 参数的模型。

他们关于他们新模型的评论[1]如下。

与 Llama 2 相比,我们做出了几个关键改进。Llama 3 使用了一个拥有 128K 个标记的标记器,它更有效地编码语言,从而显著提高了模型性能。为了提高 Llama 3 模型的推理效率,我们在 8B 和 70B 大小上都采用了分组查询注意力(GQA)。… Llama 3 在超过 15T 个标记上进行预训练,这些标记都是从公开可用的来源收集的。我们的训练数据集比 Llama 2 使用的要大七倍… – Meta

他们改进了模型的架构,将词汇量从 32K 增加到 128K 个标记,并采用了 GQA 以提高推理效率。他们还在一个更大的数据集上训练了新的模型。

微调

虽然 Llama 3 8B 模型开箱即用效果良好,但微调可以针对特定任务进行改进。

这里有几种方法可以微调 Llama 3。Meta 展示了如何在这里使用 torchtune 和 Huggingface。我发现了一个名为unsloth的优秀包,它有一个可工作的 Google Colab,我使用了这个项目。我主要使用了原始微调 Colab 的默认设置。我做的唯一改变是使用一个评估数据集,并对一些超参数进行了调整,如下所述。

这是加载 Llama 3 模型的代码。

from unsloth import FastLanguageModel
from transformers import TextStreamer
import torch
max_seq_length = 1024
dtype = None
load_in_4bit = True

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/llama-3-8b-Instruct-bnb-4bit", 
    max_seq_length = max_seq_length,
    dtype = dtype,
    load_in_4bit = load_in_4bit,
    token = token
)

我使用了 Llama 3 8B 的 4 位版本以保持内存大小低。我将最大序列长度设置为 1,024,这有助于控制内存使用。

我随后使用此代码加载了我的数据集。

from datasets import load_dataset

# Load in the training and evaluation datasets
train_dataset = load_dataset("robgonsalves/Multilingual-FanFic-Chat-4K",
  split="train")

test_dataset = load_dataset("robgonsalves/Multilingual-FanFic-Chat-4K",
  split="test")

# Format the data
train_dataset = train_dataset.map(formatting_prompts_func, batched=True,
  remove_columns=train_dataset.column_names)

test_dataset = test_dataset.map(formatting_prompts_func, batched=True,
  remove_columns=test_dataset.column_names)

# Shuffle the datasets
train_dataset = train_dataset.shuffle(seed=42)
test_dataset = test_dataset.shuffle(seed=42)

我加载了训练和评估数据集的分割,格式化了文本,并打乱了数据。这随机化了条目的顺序,以防止模型学习到可能存在于语言和属性序列中的任何未预期的模式。

该系统使用低秩自适应(LoRA)进行高效训练 [7]。在微调模型参数时,不是更新所有参数,而是在单独的较小矩阵中累积变化,然后将其应用于模型参数。这有效地减少了可训练参数的数量,从而提高了速度和效率。

下面是设置模型以使用 LoRA 进行训练的代码。

model = FastLanguageModel.get_peft_model(
    model,
    r = 64,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 64,
    lora_dropout = 0,
    bias = "none",
    use_gradient_checkpointing = True,
    random_state = 3407,
    use_rslora = False,
    loftq_config = None,
)

通过实验,我将 R 从 16 增加到 64,这增加了可训练参数集的大小。我还将 LoRA Alpha 从 16 增加到 64,以显著影响可训练集。这些更改提高了与最终模型的交互质量。

下面是微调模型的代码,该代码使用 Huggingface 的监督微调训练器(SFTT)作为其 Transformer 强化学习(TRL)包的一部分。

from trl import SFTTrainer
from transformers import TrainingArguments

trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset = train_dataset,
    eval_dataset = test_dataset,
    dataset_text_field = "text",
    max_seq_length = max_seq_length,
    dataset_num_proc = 2,
    packing = False,
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        warmup_steps = 5,
        num_train_epochs = 1,
        learning_rate = 2e-4,
        fp16 = not torch.cuda.is_bf16_supported(),
        bf16 = torch.cuda.is_bf16_supported(),
        logging_steps = 1,
        optim = "adamw_8bit",
        weight_decay = 0.01,
        lr_scheduler_type = "linear",
        seed = 3407,
        output_dir = "outputs",
        evaluation_strategy="steps",
        eval_steps=100
    ),
)

我主要在 unsloth Colab 中使用默认设置。我做的唯一改变是在训练期间使用我的测试数据集进行评估。您可以在此处查看所有训练参数的解释。

训练在 Nvidia L2 GPU 上运行了 2 小时 20 分钟,该 GPU 拥有 22 GB 的 RAM。以下是微调期间训练和评估损失的图表。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f028c6fbd30754031c447a0c2e3f2429.png

在微调 Llama 3 时训练和评估损失,由作者绘制图表

训练和评估损失图表明微调过程成功,损失在初期急剧下降,随后逐渐减少,反映了持续的学习。训练和评估损失的并行减少表明模型提高了准确性,而没有过拟合,展示了有效泛化到用于训练的未见数据。

我的最后一步是使用此行代码将模型保存到 Huggingface。

model.push_to_hub_merged("robgonsalves/fan-fabler-lora", tokenizer,
  save_method = "lora", token = token)

将保存方法设置为 lora 表示仅保存极小的可训练参数集。完整的 Google Colab 训练代码在此

使用模型

在我完成微调并将模型保存到 Huggingface 后,我再次使用此代码加载它。

from unsloth import FastLanguageModel
from transformers import TextStreamer
import torch
max_seq_length = 1024
dtype = None
load_in_4bit = True

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "robgonsalves/fan-fabler-lora",
    max_seq_length = max_seq_length,
    dtype = dtype, load_in_4bit = load_in_4bit)

FastLanguageModel.for_inference(model)

运行此代码将加载原始 Llama 3 模型中的 LoRA 权重并准备模型以供使用。最后一行启用了推理的 2 倍速度提升。

下面是设置提示的代码。

system_prompt = """Respond to the user's query based on the conversation
and the context. Respond in the same language as the user's query.
To get more from context from the Wikipedia, indicate a Wiki page and
language code at the end of the repsonse using this format:
>>>search term
>>>language code"""

prompt = """<|begin_of_text|><|start_header_id|>system<|end_header_id|>
{}<|begin_of_text|><|start_header_id|>user<|end_header_id|>
{}<|begin_of_text|><|start_header_id|>assistant<|end_header_id|>"""

这设置了我在训练期间使用的相同系统提示和 Llama 3 使用的提示格式。以下是询问 FanFabler 关于 “Curb Your Enthusiasm” 的代码。

question = "List three ideas for writing fan fiction about Curb Your
Enthusiasm where Larry stumbles upon a time machine."

text = prompt.format(system_prompt, question)
inputs = tokenizer([text], return_tensors = "pt").to("cuda")
text_streamer = TextStreamer(tokenizer, skip_prompt=True)
resulting_tokens = model.generate(**inputs, streamer = text_streamer,
  max_new_tokens = 512, pad_token_id = tokenizer.eos_token_id,
  do_sample = True)

我使用了文本流式传输功能,它将结果实时显示在模型输出时。设置 do_sample 告诉模型每次运行时都创建不同的答案。

结果

下面是 FanFabler 的几个交互。

Curb Your Enthusiasm (英语)

Rob: 列出三个关于《抑制热情》中拉里意外发现时间机器的粉丝小说构思。

FanFabler: 以下是关于《抑制热情》中拉里意外发现时间机器的粉丝小说构思:

  1. 拉里穿越回过去,试图纠正自己过去的错误,但他在过去的行为最终对现在和未来产生了意想不到的后果。拉里在各个时代中穿梭,造成更多的混乱,使他的关系处于危险之中。
  2. 拉里使用时间机器重温历史上伟大时期的标志性时刻,但他的干预著名人物和事件证明是灾难性的。拉里试图改变历史结果的努力最终导致了不可预见的后果,使他和周围的人都陷入了混乱。
  3. 拉里沉迷于使用时间机器重温和重做过去的浪漫和职业互动。随着他不断在不同的时间线之间跳跃,他必须处理后悔的概念以及改变自己命运和他人生活的道德含义。

Rob: 什么时期会是一个好选择?主要的历史人物是谁?

FanFabler: 对于一个设定在《抑制热情》宇宙中的时间旅行粉丝小说,考虑美国禁酒时代的 20 世纪 20 年代可能提供一个有趣的背景。拉里·戴维作为主要角色,发现自己穿越时空,沉浸在一个充满爵士乐、爵士乐舞女和有组织犯罪的世界上。主要历史人物可以是像卡彭这样的角色,代表这个时代有组织犯罪的有力人物。这个历史人物可以作为拉里时间旅行冒险的支点,创造出一个有趣的动态,即虚构的拉里·戴维版本和历史人物阿尔·卡彭。这个时期的文化和社会差异可以为故事增添新的幽默和探索层次。

这是一个有趣的视角。选择 20 世纪 20 年代的禁酒时代,为拉里的反社会感性和历史背景之间提供了创造性和幽默的对比,他的行为可以创造出与像卡彭这样的角色相关的荒谬场景。这种动态具有独特的喜剧张力,但平衡幽默与历史背景具有挑战性,需要敏感的方法。

皮皮·隆斯壮(瑞典语)

这里是关于皮皮·隆斯壮粉丝小说的瑞典语互动。括号内提供英文翻译。

Rob: 有三个关于皮皮·隆斯壮的粉丝小说场景吗?(What are three scenarios for fan fiction for Pippi Longstocking?)

*FanFabler: 这里是三个关于皮皮·隆斯壮的粉丝小说场景:

  1. 皮皮·隆斯壮遇到了来自另一个维度的皮皮·隆斯壮,两个平吉开始在不同世界中展开一场激动人心的竞赛,以捕捉一个重要的秘密。
  2. 皮皮·隆斯壮深入一个转变,发现她有一种新的方法来控制她的魔法力量,挑战所有人相信她。
  3. 皮皮·隆斯壮遇到了一个被称为神秘岛屿的神秘区域,那里每个人都受到诅咒,皮皮必须找到一种方法来打破它,以拯救她的朋友和该地区的所有人。

(以下是三个可能的皮皮·隆斯壮粉丝小说场景:

  1. 皮皮·隆斯壮遇到了来自另一个维度的皮皮·隆斯壮,两个皮皮开始在不同世界中展开一场激动人心的竞赛,以捕捉一个重要的秘密。)
  2. 皮皮·隆斯壮经历了一次转变,发现她有一种新的方法来控制她的魔法力量,挑战所有人相信她。
  3. 皮皮·隆斯壮来到一个神秘区域,被称为神秘岛屿,那里每个人都受到诅咒,皮皮必须找到一种方法来打破它,以拯救她的朋友和该地区的所有人。

罗布: 请告诉我更多关于两个皮皮的情况。她们有什么不同?(Tell me more about the two Pippis. How are they different?)

粉丝小说家: 皮皮·隆斯壮在粉丝小说中可能有老版本和新版本的自己。老版本的皮皮可能是一个先锋和游戏女孩,有着冒险和叛逆的态度。她可能经历了许多冒险,并积累了丰富的经验,以应对创造性和不可能的挑战。年轻的皮皮或皮皮女孩可能更加好奇,支持女朋友们和他们的冒险。她可能会有不同的世界观,并且可能对新鲜事物和概念更加开放。她们不同的个性可以在粉丝小说的叙述中创造有趣的对话和互动。此外,她们的协作可以为角色和故事创造丰富的发展。通过描绘冒险的女性方面,并找到西方女性知识的力量和创造力,可以创作出一个引人入胜的故事,在粉丝小说中具有深度。

(在粉丝小说中,皮皮·隆斯托克可以同时拥有自己老的和年轻的版本。老皮皮可以是一个先锋和游戏玩家,有着冒险和反叛的态度。她可能经历了许多冒险,并在面对创造性和不可能的挑战方面积累了丰富的经验。年轻的皮皮或皮皮女孩可能更加好奇,并支持她们的闺蜜和朋友们在她们自己的冒险中。她们可能会有不同的世界观,并且可能更开放于接受新信息和概念。她们不同的个性可以在粉丝小说的叙述中创造有趣的对话和互动。此外,她们的协作可以为角色和故事创造丰富的发展。通过描绘冒险的女性方面,并找到西方女性主义的权力和创造力,可以创作出一个引人入胜、内涵丰富的故事。)

交互不同版本的主要角色很有趣。一个年长、经验丰富的皮皮被描绘成一个有冒险精神的先锋,而年轻的版本则带来了好奇心,并支持她的朋友们在他们的冒险中。这两个皮皮之间的互动,她们不同的个性和视角,可能会在粉丝小说的叙述中带来对角色发展和对话的新诠释。

您可以在这里使用 FanFabler 进行实验。

结论

FanFabler 建立在大型语言模型如 Llama 3 的进步之上,以增强多语言粉丝小说写作。它使用精心制作的语料库进行微调,并采用低秩适应(LoRA)等技术,以支持 40 种语言的写作。该项目强调了深思熟虑的数据收集和先进的训练方法的重要性,利用 GPT 3.5 Turbo 和维基百科进行上下文信息。分享这些结果旨在激发在创意 AI 方面的进一步实验,展示了定制语言模型在特定应用中的潜力。

源代码和 Colab

本项目的代码可在GitHub上找到。数据集和微调模型可在 Huggingface 上找到。我已将这些内容全部发布在CC BY-SA 许可下。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0bea5fc8c1e0f9c6f11d7477156b0ba1.png

知识共享-相同方式

致谢

我想要感谢 Jennifer Lim 在这个项目中的帮助。

参考文献

[1] Meta,介绍 Meta Llama 3:迄今为止最强大的公开可用的 LLM (2024)

[2] H. Touvron 等,Llama 2: 开放基础和微调聊天模型 (2023)

[3] A. Q. Jiang 等人,Mistral 7B (2023)

[4] B. Gribben,Fanfiction: A Legal Battle of Creativity (2016),Reporter Magazine

[5] D. M. Eberhard 等人,Statistics (2024),Ethnologue: Languages of the World (第 27 版)

[6] H. Touvron 等人,LLaMA: Open and Efficient Foundation Language Models (2023)

[7] Edward Hu 等人,LoRA: Low-Rank Adaptation of Large Language Models (2021)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值