生成式人工智能与 LangChain(预览)(四)

287 阅读1小时+

我们甚至可以使用更小的模型,比如EleutherAI/gpt-neo-125m,这样可以在资源使用和性能之间取得很好的折衷。让我们加载模型:

import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
)
device_map="auto"
base_model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True,
)
base_model.config.use_cache = False

Bits and Bytes 配置使我们能够将模型量化为 8、4、3 甚至 2 位,从而加速推理并减少内存占用,而不会在性能方面产生大的成本。我们将在谷歌云盘上存储模型检查点;您需要确认登录到您的谷歌账户:

from google.colab import drive
drive.mount('/content/gdrive')

我们需要通过谷歌进行身份验证才能使其工作。我们可以将模型检查点和日志的输出目录设置为我们的谷歌云盘:

output_dir = "/content/gdrive/My Drive/results"

如果您不想使用谷歌云盘,只需将其设置为计算机上的一个目录。对于训练,我们需要设置一个分词器:

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

现在我们将定义我们的训练配置。我们将设置 LORA 和其他训练参数:

from transformers import TrainingArguments, EarlyStoppingCallback
from peft import LoraConfig
# More info: https://github.com/huggingface/transformers/pull/24906
base_model.config.pretraining_tp = 1
peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
)
training_args = TrainingArguments(
    output_dir=output_dir, 
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    learning_rate=2e-4,
    logging_steps=10,
    max_steps=2000,
    num_train_epochs=100,
    evaluation_strategy="steps",
    eval_steps=5,
    save_total_limit=5 
    push_to_hub=False, 
    load_best_model_at_end=True,
    report_to="wandb"
)

有一些参数需要解释一下。push_to_hub参数意味着我们可以在训练过程中定期将模型检查点推送到 HuggingSpace Hub。为了使其工作,你需要设置 HuggingSpace 身份验证(如上所述,需要写入权限)。如果我们选择这个选项,作为output_dir我们可以使用new_model_name。这将是模型在 HuggingFace 上可用的存储库名称:huggingface.co/models或者,如我在这里所做的,我们可以将模型保存在本地或云端,例如谷歌云盘的一个目录。我将max_stepsnum_train_epochs设置得非常高,因为我注意到训练仍然可以在许多步骤后改进。我们使用早停和较高数量的最大训练步数使模型收敛到更高的性能。对于早停,我们需要将evaluation_strategy设置为"steps",并且load_best_model_at_end=Trueeval_steps是两次评估之间的更新步数。save_total_limit=5意味着只保存最后 5 个模型。最后,report_to="wandb"意味着我们将发送训练统计数据、一些模型元数据和硬件信息到 W&B,我们可以在那里查看每次运行的图表和仪表板。然后训���可以使用我们的配置:

from trl import SFTTrainer
trainer = SFTTrainer(
    model=base_model,
    train_dataset=dataset,
    eval_dataset=eval_dataset,
    peft_config=peft_config,
    dataset_text_field="question",  # this depends on the dataset!
    max_seq_length=512,
    tokenizer=tokenizer,
    args=training_args,
    callbacks=[EarlyStoppingCallback(early_stopping_patience=200)]
)
trainer.train()

训练可能需要相当长的时间,即使在 TPU 设备上运行。评估和早停会大大减慢训练速度。如果禁用早停,可以使训练速度更快。我们应该在训练过程中看到一些统计数据,但最好显示性能图表,这样我们可以在 W&B 上看到:

图 8.4:随时间(步数)的微调训练损失。

图 8.4:随时间(步数)的微调训练损失。

训练完成后,我们可以将最终检查点保存在磁盘上以便重新加载:

trainer.model.save_pretrained(
    os.path.join(output_dir, "final_checkpoint"),
)

现在,我们可以与朋友分享我们的最终模型,以炫耀我们通过手动推送到 HuggingFace 所取得的性能:

trainer.model.push_to_hub(
    repo_id=new_model_name
)

现在,我们可以使用我们的 HuggingFace 用户名和存储库名称(新模型名称)的组合来加载模型。让我们快速展示如何在 LangChain 中使用这个模型。通常,peft 模型存储为适配器,而不是完整模型,因此加载方式有点不同:

from peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
from langchain.llms import HuggingFacePipeline
model_id = 'openlm-research/open_llama_3b_v2'
config = PeftConfig.from_pretrained("benji1a/openllama-3b-peft-squad_v2")
model = AutoModelForCausalLM.from_pretrained(model_id)
model = PeftModel.from_pretrained(model, "benji1a/openllama-3b-peft-squad_v2")
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    max_length=256
)
llm = HuggingFacePipeline(pipeline=pipe)

到目前为止,我们在 Google Colab 上完成了所有工作,但我们也可以在本地执行,只需注意你需要安装 huggingface peft 库!到目前为止,我们已经展示了如何对开源 LLM 进行微调和部署。一些商业模型也可以根据自定义数据进行微调。例如,OpenAI 的 GPT-3.5 和 Google 的 PaLM 模型都提供了这种能力。这已经与一些 Python 库集成。使用 Scikit-LLM 库,在任何情况下这只是几行代码:对文本分类进行 PaLM 模型的微调可以这样完成:

from skllm.models.palm import PaLMClassifier
clf = PaLMClassifier(n_update_steps=100)
clf.fit(X_train, y_train) # y_train is a list of labels
labels = clf.predict(X_test)

同样,你可以这样对 GPT-3.5 模型进行文本分类的微调:

from skllm.models.gpt import GPTClassifier
clf = GPTClassifier(
        base_model = "gpt-3.5-turbo-0613",
        n_epochs = None, # int or None. When None, will be determined automatically by OpenAI
        default_label = "Random", # optional
)
clf.fit(X_train, y_train) # y_train is a list of labels
labels = clf.predict(X_test)

有趣的是,在 OpenAI 提供的微调中,所有输入都会通过一个调节系统,以确保输入与安全标准兼容。这结束了微调。在极端情况下,LLMs 可以在没有任何任务特定调整的情况下部署和查询。通过提示,我们可以实现少样本学习甚至零样本学习,正如我们将在下一节讨论的那样。

提示工程

提示对于引导大型语言模型(LLMs)的行为非常重要,因为它们可以在不进行昂贵的重新训练的情况下将模型输出与人类意图对齐。精心设计的提示可以使 LLMs 适用于原始训练之外的各种任务。提示充当指示,向 LLM 展示所需的输入-输出映射。下图显示了提示不同语言模型的几个示例(来源:“预训练、提示和预测 - 自然语言处理中提示方法的系统调查”由刘等人,2021 年):

图 8.5:提示示例,特别是填空形式的知识探测和摘要。

图 8.5:提示示例,特别是填空形式的知识探测和摘要。

提示工程,也称为上下文学习,是指通过精心设计的提示技术引导大型语言模型(LLM)的行为,而无需更改模型权重。其目标是使模型输出与给定任务的人类意图对齐。通过设计良好的提示模板,模型可以取得强大的结果,有时可与微调相媲美。但是好的提示看起来是什么样的呢?

提示的结构

提示由三个主要组成部分组成:

  • 描述任务要求、目标和输入/输出格式的指令

  • 展示所需输入-输出对的示例

  • 模型必须对其进行操作以生成输出的输入

说明清楚任务给模型解释。示例提供了不同输入应该如何映射到输出的多样演示。输入是模型必须概括的内容。基本提示方法包括仅使用输入文本的零-shot 提示,以及使用几个演示示例显示所需的输入-输出对的少-shot 提示。研究人员已经确定了像多数标签偏见和最近性偏见这样的偏见,这些偏见导致了少-shot 性能的变化。通过示例选择、排序和格式化的仔细提示设计可以帮助减轻这些问题。更高级的提示技术包括指令提示,其中任务要求被明确描述而不仅仅是演示。自一致性抽样生成多个输出并选择与示例最匹配的输出。思维链 (CoT) 提示生成导致最终输出的明确推理步骤。这对于复杂的推理任务特别有益。CoT 提示可以手动编写,也可以通过增强-修剪-选择等方法自动生成。这张表简要概述了几种提示方法与微调的比较:

技术方法关键思想结果
微调在通过提示生成的解释数据集上进行微调提高模型的推理能力在常识 QA 数据集上达到 73%的准确率
零-shot 提示简单地将任务文本输入模型并要求结果。文本:"我敢打赌视频游戏比电影更有趣。"
- 情感:
思维链 (CoT)在响应前加上"让我们一步一步地思考"在回答之前给模型推理的空间在数学数据集上将准确率提高了四倍
少-shot 提示提供少量演示,包括输入和期望的输出,以帮助模型理解显示所需的推理格式在小学数学上将准确率提高了三倍
由浅入深提示逐步提示模型解决更简单的子任务。"要解决{问题},我们首先需要解决:"将问题分解成较小的部分在某些任务上,将准确率从 16%提高到 99.7%
选择-推理提示交替选择和推理提示引导模型进行推理步骤提高了长推理任务的表现
自一致性从多个样本中选择最频繁的答案增加冗余性在各项基准测试中获得了 1-24 个百分点的提升
验证器训练单独的模型来评估响应过滤掉不正确的响应将小学数学准确率提高了约 20 个百分点

图 8.6:LLM 的提示技术。

一些提示技术结合外部信息检索,在生成输出之前为 LLM 提供缺失的上下文。对于开放领域的问答,可以通过搜索引擎检索相关段落并纳入提示中。对于封闭书籍问答,具有证据-问题-答案格式的少样本示例比问题-答案格式效果更好。有不同的技术可以提高大型语言模型(LLMs)在复杂推理任务中的可靠性:

  1. 提示和解释:在回答之前,提示模型逐步解释其推理过程,使用类似“让我们逐步思考”(如 CoT 中)的提示显著提高推理任务的准确性。

  2. 提供推理链的少样本示例有助于展示所需的格式,并指导 LLMs 生成连贯的解释。

  3. 交替选择和推理提示:利用专门的选择提示(缩小答案空间)和推理提示(生成最终响应)的组合,与仅使用通用推理提示相比,可以获得更好的结果。

  4. 问题分解:将复杂问题分解为较小的子任务或组件,使用从最少到最多的提示方法有助于提高可靠性,因为这样可以实现更有结构和可管理的问题解决过程。

  5. 采样多个响应:在生成过程中从 LLMs 中采样多个响应,并选择最常见的答案,可以增加一致性,减少对单一输出的依赖。特别是训练单独的验证器模型,评估 LLMs 生成的候选响应,有助于过滤出不正确或不可靠的答案,提高整体可靠性。

最后,通过提示生成的解释数据集对 LLMs 进行微调可以增强它们在推理任务中的性能和可靠性。

少样本学习向 LLM 提供与任务相关的少量输入-输出示例,而无需明确说明。这使模型能够纯粹从演示中推断出意图和目标。精心选择、排序和格式化的示例可以极大地提高模型的推理能力。然而,少样本学习可能容易受到偏见和试验间的变异性影响。添加明确的说明可以使意图对模型更加透明,并提高鲁棒性。总的来说,提示结合了指令和示例的优势,以最大程度地引导 LLM 完成手头任务。

自动提示调整等方法不是手工设计提示,而是通过直接优化嵌入空间上的前缀标记来学习最佳提示。目标是在给定输入的情况下增加期望输出的可能性。总的来说,提示工程是一个活跃的研究领域,用于使大型预训练 LLM 与人类意图在各种任务上保持一致。精心设计的提示可以引导模型而无需昂贵的重新训练。在本节中,我们将介绍之前提到的一些(但不是全部)技术。让我们讨论 LangChain 提供的用 Python 创建提示模板的工具!

模板化

提示是我们提供给语言模型的指令和示例,以引导它们的行为。提示模板化指的是创建可配置不同参数的提示的可重用模板。LangChain 提供了用 Python 创建提示模板的工具。模板允许使用变量输入动态生成提示。我们可以创建一个基本的提示模板如下:

from langchain import PromptTemplate
prompt = PromptTemplate("Tell me a {adjective} joke about {topic}")

这个模板有两个输入变量 - {形容词} 和 {主题}。我们可以用值格式化这些变量:

prompt.format(adjective="funny", topic="chickens")
# Output: "Tell me a funny joke about chickens"

模板格式默认为 Python f-strings,但也支持 Jinja2。提示模板可以组合成管道,其中一个模板的输出作为下一个模板的输入。这样可以实现模块化重用。

聊天提示模板

对于对话代理,我们需要聊天提示模板:

from langchain.prompts import ChatPromptTemplate 
template = ChatPromptTemplate.from_messages([
  ("human", "Hello, how are you?"),
  ("ai", "I am doing great, thanks!"),
  ("human", "{user_input}"),
])
template.format_messages(user_input="What is your name?")

这将格式化一系列聊天消息而不是一个字符串。这对考虑对话历史非常有用。我们在第五章中看过不同的记忆方法。在这种情况下,这些方法同样相关,以确保模型输出相关且切题。提示模板化可以实现可重用、可配置的提示。LangChain 提供了一个 Python API,方便地创建模板并动态格式化它们。模板可以组合成管道以实现模块化。高级提示工程可以进一步优化提示。

高级提示工程

LangChain 提供了工具,以实现像少样本学习、动态示例选择和链式推理等高级提示工程策略。

少样本学习

FewShotPromptTemplate允许向模型展示任务的几个示例以引导它,而无需明确的指令。例如:

from langchain.prompts import FewShotPromptTemplate, PromptTemplate 
example_prompt = PromptTemplate("{input} -> {output}")
examples = [
  {"input": "2+2", "output": "4"},
  {"input": "3+3", "output": "6"}
]
prompt = FewShotPromptTemplate(
  examples=examples,
  example_prompt=example_prompt
)

模型必须仅从示例中推断出该做什么。

动态示例选择

为了选择针对每个输入量身定制的示例,FewShotPromptTemplate可以接受一个ExampleSelector而不是硬编码的示例:

from langchain.prompts import SemanticSimilarityExampleSelector
selector = SemanticSimilarityExampleSelector(...) 
prompt = FewShotPromptTemplate(
   example_selector=selector,
   example_prompt=example_prompt
)

SemanticSimilarityExampleSelectorExampleSelector实现可以自动找到每个输入最相关的示例。

链式推理

当要求 LLM 通过一个问题进行推理时,通常更有效的做法是在陈述最终答案之前让它解释其推理过程。例如:

from langchain.prompts import PromptTemplate
reasoning_prompt = "Explain your reasoning step-by-step. Finally, state the answer: {question}"
prompt = PromptTemplate(
  reasoning_prompt=reasoning_prompt,
  input_variables=["questions"]
)

这鼓励 LLM 首先通过逻辑方式思考问题,而不是仅仅猜测答案,然后试图在之后证明。这被称为零射链思维。要求 LLM 解释其思维过程与其核心能力非常契合。少射链思维提示是一个少射提示,其中推理作为示例解决方案的一部分进行解释,旨在鼓励 LLM 在做出决定之前解释其推理。已经证明这种提示可以导致更准确的结果,然而,这种性能提升发现与模型的大小成正比,而在较小的模型中,改进似乎是微不足道的,甚至是负面的。在**思维树(ToT)**提示中,我们生成多个解决问题的步骤或方法,然后使用 AI 模型对这些步骤进行批判。批判将基于模型对解决方案适应问题的判断。让我们通过使用 LangChain 实现 ToT 的更详细示例来走一遍。首先,我们将使用PromptTemplates定义我们的 4 个链组件。我们需要一个解决方案模板,一个评估模板,一个推理模板和一个排名模板。让我们首先生成解决方案:

solutions_template = """
Generate {num_solutions} distinct solutions for {problem}. Consider factors like {factors}.
Solutions:
"""
solutions_prompt = PromptTemplate(
   template=solutions_template,
   input_variables=["problem", "factors", "num_solutions"]
)

让我们要求 LLM 评估这些解决方案:

evaluation_template = """
Evaluate each solution in {solutions} by analyzing pros, cons, feasibility, and probability of success.
Evaluations:
"""
evaluation_prompt = PromptTemplate(
  template=evaluation_template,
  input_variables=["solutions"]  
)

现在我们将对它们进行更多的推理:

reasoning_template = """
For the most promising solutions in {evaluations}, explain scenarios, implementation strategies, partnerships needed, and handling potential obstacles. 
Enhanced Reasoning: 
"""
reasoning_prompt = PromptTemplate(
  template=reasoning_template,
  input_variables=["evaluations"]
)

最后,根据我们迄今为止的推理,我们可以对这些解决方案进行排名:

ranking_template = """
Based on the evaluations and reasoning, rank the solutions in {enhanced_reasoning} from most to least promising.
Ranked Solutions:
"""
ranking_prompt = PromptTemplate(
  template=ranking_template, 
  input_variables=["enhanced_reasoning"]
)

接下来,我们在将所有内容放在一起之前从这些模板中创建链:

chain1 = LLMChain(
   llm=SomeLLM(),
   prompt=solutions_prompt,
   output_key="solutions"  
)
chain2 = LLMChain(
   llm=SomeLLM(),
   prompt=evaluation_prompt,
   output_key="evaluations"
)

最后,我们将这些链连接成一个SequentialChain

tot_chain = SequentialChain(
   chains=[chain1, chain2, chain3, chain4],
   input_variables=["problem", "factors", "num_solutions"], 
   output_variables=["ranked_solutions"]
)
tot_chain.run(
   problem="Prompt engineering",
   factors="Requirements for high task performance, low token use, and few calls to the LLM",
   num_solutions=3
)

这使我们能够在推理过程的每个阶段利用 LLM。ToT 方法有助于通过促进探索来避免死胡同。这些技术共同增强了大型语言模型在复杂任务上的推理能力的准确性、一致性和可靠性,提供更清晰的指导,通过有针对性的数据微调,采用问题分解策略,融合多样的抽样方法,整合验证机制,并采用概率建模框架。提示设计对于释放 LLM 的推理能力、模型和提示技术未来进展的潜力以及这些原则和技术对于与大型语言模型一起工作的研究人员和从业者来说都是非常重要的。让我们总结一下!

摘要

在第一章中,我们讨论了生成模型的基本原理,特别是 LLMs 及其训练。我们主要关注预训练步骤,通常是调整模型以适应单词和更广泛文本段之间的相关性。对齐是评估模型输出与期望之间的关系,而调节是确保输出符合期望的过程。调节允许引导生成式 AI 以提高安全性和质量,但这并不是一个完整的解决方案。在本章中,重点是调节,特别是通过微调和提示。在微调中,语言模型被训练在许多任务示例上,这些任务被制定为自然语言指令,以及适当的回应。通常这是通过强化学习与人类反馈(RLHF)来完成的,其中包括在人类生成的数据集上进行训练(提示,回应)对,然后通过人类反馈进行强化学习,然而,已经开发出其他技术,已经显示出具有较低资源占用的竞争性结果。在本章的第一个示例中,我们实现了一个用于问答的小型开源模型的微调。有许多技术可以提高 LLMs 在复杂推理任务中的可靠性,包括逐步提示,备选选择和推理提示,问题分解,多个响应的采样,以及使用单独的验证器模型。这些方法已经显示出在推理任务中提高准确性和一致性。我们已经讨论并比较了几种技术。LangChain 提供了解锁高级提示策略的构建模块,如少样本学习,动态示例选择和链式推理分解,正如我们在示例中展示的那样。精心设计的提示工程是将语言模型与复杂目标对齐的关键。通过分解问题并添加冗余性可以提高推理的可靠性。我们在本章中讨论的原则和技术为与 LLMs 一起工作的专家提供了工具包。我们可以期待模型训练和提示技术的未来进展。随着这些方法和 LLMs 的持续发展,它们很可能会变得更加有效和有用,适用于更广泛的应用领域。让我们看看你是否记得本章的一些关键要点!

问题

请看看你是否能够凭记忆回答这些问题。如果你对任何问题不确定,我建议你回到本章的相应部分查看:

  1. 在 LLMs 的背景下,什么是对齐?

  2. 有哪些不同的调节方法,我们如何区分它们?

  3. 调节与调节有什么关系?

  4. 什么是指令调整,它的重要性是什么?

  5. 什么是量化?

  6. 有哪些微调的方法?

  7. 什么是少样本学习?

  8. 什么是思维链提示?

  9. 解释一下思维树提示!

九、生产中的生成式人工智能

在本书中,我们已经讨论了模型、代理和 LLM 应用程序以及不同的用例,但是在确保性能和监管要求时,模型和应用程序需要大规模部署,最终需要进行监控时,许多问题变得重要。在本章中,我们将讨论评估和可观察性,总结涵盖操作化人工智能和决策模型的治理和生命周期管理的广泛主题,包括生成式人工智能模型。虽然离线评估在受控环境中提供了对模型能力的初步理解,但在生产中的可观察性提供了对其在实时环境中性能的持续洞察。在模型生命周期的不同阶段,两者都至关重要,并相互补充,以确保大型语言模型的最佳运行和结果。我们将讨论一些工具,以及为每种情况提供示例。我们还将讨论围绕 LLMs 构建的模型和应用程序的部署,概述可用工具和使用 Fast API 和 Ray Serve 进行部署的示例。在本章中,我们将使用 LLMs 进行...,您可以在书的 GitHub 存储库中找到github.com/benman1/generative_ai_with_langchain。本章的主要部分包括:

  • 介绍

  • 如何评估您的 LLM 应用程序?

  • 如何部署您的 LLM 应用程序?

  • 如何观察您的 LLM 应用程序?

让我们首先介绍 MLOps 对 LLMs 和其他生成模型的意义和内容。

介绍

正如我们在本书中讨论的那样,由于其生成类似人类文本的能力,LLMs 近年来引起了广泛关注。从创意写作到对话聊天机器人,这些生成式人工智能模型在各行各业都有多样化的应用。然而,将这些复杂的神经网络系统从研究转化为实际部署面临着重大挑战。本章探讨了负责任地将生成式人工智能投入生产的实际考虑和最佳实践。我们讨论了推理和服务的计算要求,优化技术,以及围绕数据质量、偏见和透明度的关键问题。当扩展到成千上万的用户时,架构和基础设施决策可能会成败一事。同时,保持严格的测试、审计和道德保障对于可信赖的部署至关重要。在生产中部署由模型和代理组成的应用程序及其工具会带来几个关键挑战,需要解决以确保其有效和安全的使用:

  • 数据质量和偏见:训练数据可能引入偏见,反映在模型输出中。仔细的数据筛选和监控模型输出至关重要。

  • 伦理/合规考虑:LLMs 可能生成有害、偏见或误导性内容。必须建立审查流程和安全指南以防止滥用。遵守专业行业如医疗保健中的 HIPAA 等法规。

  • 资源需求:LLMs 需要大量计算资源进行训练和服务。高效的基础设施对于成本效益的规模化部署至关重要。

  • 漂移或性能下降:模型需要持续监控以检测数据漂移或随时间性能下降等问题。

  • 缺乏可解释性:LLMs 通常是黑匣子,使其行为和决策不透明。解释性工具对于透明度至关重要。

将经过训练的 LLM 从研究转化为实际生产中涉及许多复杂挑战,如可扩展性、监控和意外行为。负责地部署能力强大但不可靠的模型需要围绕可扩展性、可解释性、测试和监控进行认真规划。微调、安全干预和防御性设计等技术使开发出的应用程序既有益又无害、诚实。通过慎重准备,生成式人工智能有巨大潜力造福从医学到教育等各行各业。以下几种关键模式可以帮助解决上述挑战:

  • 评估:坚实的基准数据集和指标对于衡量模型能力、回归和与目标的一致性至关重要。指标应根据任务仔细选择。

  • 检索增强:检索外部知识提供有用的背景信息,以减少幻觉并添加超出预训练数据的最新信息。

  • 微调:在任务特定数据上进一步调整 LLMs 可以提高目标用例的性能。像适配器模块这样的技术可以减少开销。

  • 缓存:存储模型输出可以显著降低重复查询的延迟和成本。但缓存有效性需要仔细考虑。

  • 防护栏:通过语法和语义验证模型输出确保可靠性。指导技术直接塑造输出结构。

  • 防御性用户体验:设计以预期不准确性,如限制声明、归因和收集丰富的用户反馈。

  • 监控:持续跟踪指标、模型行为和用户满意度可提供对模型问题和业务影响的洞察。

在第五章中,我们已经涵盖了类似宪法 AI 这样的安全对齐技术,用于减轻生成有害输出等风险。此外,LLMs 有可能生成有害或误导性内容。建立道德准则和审查流程以防止误传信息、仇恨言论或任何其他有害输出是至关重要的。人类审阅员在评估和过滤生成内容方面可以发挥关键作用,以确保符合道德标准。不仅出于法律、道德和声誉原因,还为了保持性能,我们需要持续评估模型性能和输出,以便检测数据漂移或能力丧失等问题。我们将讨论解释模型行为和决策的技术。提高高风险领域的透明度。由于 LLMs 或生成式 AI 模型的规模和复杂性,部署需要大量的计算资源。这包括高性能硬件,如 GPU 或 TPU,以处理涉及的大量计算。由于其资源密集性质,扩展大型语言模型或生成式 AI 模型可能具有挑战性。随着模型规模的增加,训练和推断的计算要求也呈指数增长。分布式技术,如数据并行或模型并行,通常用于在多台机器或 GPU 之间分配工作负载。这可以加快训练和推断时间。扩展还涉及管理与这些模型相关的大量数据的存储和检索。需要高效的数据存储和检索系统来处理庞大的模型大小。部署还涉及考虑优化推断速度和延迟的问题。可以采用模型压缩、量化或硬件特定优化等技术来确保高效部署。我们在第八章中讨论了其中一些内容。LLMs 或生成式 AI 模型通常被认为是黑盒,这意味着很难理解它们是如何做出决策或生成输出的。解释性技术旨在提供对这些模型内部运作的洞察。这可能涉及注意力可视化、特征重要性分析或为模型输出生成解释等方法。在透明度和问责制重要的领域,如医疗保健、金融或法律系统中,解释性至关重要。正如我们在第八章中讨论的,大型语言模型可以在特定任务或领域上进行微调,以提高在特定用例上的性能。迁移学习允许模型利用预训练知识并将其调整到新任务。在领域特定数据上进行迁移学习和微调可以解锁新的用例,同时需要额外的谨慎。通过深思熟虑的规划和准备,生成式 AI 承诺将各行业从创意写作到客户服务进行转型。但在这些系统继续渗透各个领域的同时,深思熟虑地应对这些系统的复杂性仍然至关重要。本章旨在为团队提供一个实用指南,以填补我们迄今为止遗漏的部分,旨在构建有影响力和负责任的生成式 AI 应用程序。我们提到了数据筛选、模型开发、基础设施、���控和透明度的策略。在我们继续讨论之前,我们需要谈谈术语问题。

术语

MLOps 是一个关注在生产环境中可靠高效地部署和维护机器学习模型的范式。它将 DevOps 的实践与机器学习结合起来,将算法从实验系统过渡到生产系统。MLOps 旨在增加自动化,提高生产模型的质量,并解决业务和监管要求。LLMOps 是 MLOps 的一个专门子类别。它指的是为产品的一部分对大型语言模型进行微调和操作所需的操作能力和基础设施。虽然它可能与 MLOps 的概念并没有明显不同,但区别在于与处理、改进和部署像 GPT-3 这样拥有 1750 亿参数的大型语言模型相关的具体要求。术语LMOps比 LLMOps 更具包容性,因为它涵盖了各种类型的语言模型,包括大型语言模型和较小的生成模型。这个术语承认了语言模型及其在操作环境中的相关性的不断扩大。FOMO(基础模型编排)专门解决了在使用基础模型时面临的挑战。它强调了管理多步骤流程、与外部资源集成以及协调涉及这些模型的工作流程的需求。术语ModelOps侧重于 AI 和决策模型在部署时的治理和生命周期管理。更广泛地说,AgentOps涉及对 LLMs 和其他 AI 代理的操作管理,确保它们的适当行为,管理它们的环境和资源访问,并促进代理之间的互动,同时解决与意外结果和不兼容目标相关的问题。虽然 FOMO 强调了专门处理基础模型时面临的独特挑战,但 LMOps 提供了对超出基础模型范围的更广泛语言模型的更具包容性和全面覆盖。LMOps 承认了语言模型在各种操作用例中的多功能性和日益重要性,同时仍属于更广泛的 MLOps 范畴。最后,AgentOps 明确强调了由具有一定启发式的生成模型组成的代理的互动性质,并包括工具。所有这些非常专业化的术语的出现突显了该领域的快速发展;然而,它们的长期普及尚不清楚。MLOps 是一个在行业中广泛使用、得到认可和采用的已建立术语。因此,在本章的其余部分,我们将坚持使用 MLOps。在将任何代理或模型投入生产之前,我们应该首先评估其输出,因此我们应该从这开始。我们将重点关注 LangChain 提供的评估方法。

如何评估您的 LLM 应用程序?

评估 LLMs 作为独立实体或与代理链结合的重要性在于确保它们正常运行并产生可靠结果,这是机器学习生命周期的一个组成部分。 评估过程确定模型在效率、可靠性和效率方面的性能。 评估大型语言模型的目标是了解它们的优势和劣势,提高准确性和效率,减少错误,从而最大限度地提高它们在解决实际问题中的有用性。 这个评估过程通常在开发阶段离线进行。 离线评估在受控测试条件下提供了模型性能的初步见解,并包括超参数调整、与同行模型或已建立标准的基准测试等方面。 它们为部署之前对模型进行改进提供了必要的第一步。评估提供了关于 LLM 能够生成相关、准确和有用输出的见解。 在 LangChain 中,有各种评估 LLMs 输出的方法,包括比较链输出、成对字符串比较、字符串距离和嵌入距离。 评估结果可用于根据输出的比较确定首选模型。 还可以计算置信区间和 p 值来评估评估结果的可靠性。 LangChain 提供了几种工具来评估大型语言模型的输出。 一个常见的方法是使用PairwiseStringEvaluator比较不同模型或提示的输出。 这促使评估模型在相同输入下选择两个模型输出之间的首选输出,并汇总结果以确定整体首选模型。其他评估器允许根据特定标准(如正确性、相关性和简洁性)评估模型输出。 CriteriaEvalChain可以根据自定义或预定义原则对输出进行评分,而无需参考标签。 还可以通过指定不同的聊天模型(如 ChatGPT)来配置评估模型。让我们使用PairwiseStringEvaluator比较不同提示或 LLMs 的输出,这促使 LLM 在给定特定输入时选择首选输出。

比较两个输出

此评估需要一个评估器、一个输入数据集以及两个或更多的 LLMs、链条或代理程序进行比较。 评估将汇总结果以确定首选模型。评估过程涉及几个步骤:

  1. 创建评估器:使用load_evaluator()函数加载评估器,指定评估器类型(在本例中为pairwise_string)。

  2. 选择数据集:使用load_dataset()函数加载输入数据集。

  3. 定义要比较的模型:使用必要的配置初始化要比较的 LLMs、链条或代理程序。 这涉及初始化语言模型以及任何其他所需的工具或代理程序。

  4. 生成响应:为每个模型生成输出,然后再对其进行评估。这通常是批量进行的,以提高效率。

  5. 评估对:通过比较不同模型的输出来评估结果,针对每个输入。通常使用随机选择顺序来减少位置偏见。

这里有一个来自成对字符串比较文档的示例:

from langchain.evaluation import load_evaluator
evaluator = load_evaluator("labeled_pairwise_string")
evaluator.evaluate_string_pairs(
    prediction="there are three dogs",
    prediction_b="4",
    input="how many dogs are in the park?",
    reference="four",
)

评估器的输出应如下所示:

 {'reasoning': 'Both responses are relevant to the question asked, as they both provide a numerical answer to the question about the number of dogs in the park. However, Response A is incorrect according to the reference answer, which states that there are four dogs. Response B, on the other hand, is correct as it matches the reference answer. Neither response demonstrates depth of thought, as they both simply provide a numerical answer without any additional information or context. \n\nBased on these criteria, Response B is the better response.\n',
     'value': 'B',
     'score': 0}

评估结果包括一个介于 0 和 1 之间的分数,表示代理的有效性,有时还包括概述评估过程并证明分数的推理。在这个根据参考的示例中,基于输入,两个结果都事实上是不正确的。我们可以删除参考并让 LLM 判断输出,但这可能是危险的,因为指定的内容也可能是不正确的。

根据标准进行比较

LangChain 为不同的评估标准提供了几个预定义的评估器。这些评估器可以用于根据特定的规则或标准集来评估输出。一些常见的标准包括简洁性、相关性、正确性、连贯性、实用性和争议性。CriteriaEvalChain允许您根据自定义或预定义的标准评估模型输出。它提供了一种验证 LLM 或 Chain 的输出是否符合一组定义的标准的方法。您可以使用这个评估器来评估正确性、相关性、简洁性和生成输出的其他方面。CriteriaEvalChain可以配置为使用或不使用参考标签。没有参考标签时,评估器依赖于 LLM 的预测答案,并根据指定的标准对其进行评分。有了参考标签,评估器将预测答案与参考标签进行比较,并确定其是否符合标准。LangChain 中使用的评估 LLM 默认为 GPT-4。但是,您可以通过指定其他聊天模型(例如 ChatAnthropic 或 ChatOpenAI)以及所需的设置(例如温度)来配置评估 LLM。通过将 LLM 对象作为参数传递给load_evaluator()函数,可以加载自定义 LLM 的评估器。LangChain 支持自定义标准和预定义评估原则。可以使用criterion_name: criterion_description对的字典定义自定义标准。这些标准可以用于根据特定要求或规则评估输出。这里是一个简单的例子:

custom_criteria = {
    "simplicity": "Is the language straightforward and unpretentious?",
    "clarity": "Are the sentences clear and easy to understand?",
    "precision": "Is the writing precise, with no unnecessary words or details?",
    "truthfulness": "Does the writing feel honest and sincere?",
    "subtext": "Does the writing suggest deeper meanings or themes?",
}
evaluator = load_evaluator("pairwise_string", criteria=custom_criteria)
evaluator.evaluate_string_pairs(
    prediction="Every cheerful household shares a similar rhythm of joy; but sorrow, in each household, plays a unique, haunting melody.",
    prediction_b="Where one finds a symphony of joy, every domicile of happiness resounds in harmonious,"
    " identical notes; yet, every abode of despair conducts a dissonant orchestra, each"
    " playing an elegy of grief that is peculiar and profound to its own existence.",
    input="Write some prose about families.",
)

我们可以通过这个结果得到两个输出的非常微妙的比较:

{'reasoning': 'Response A is simple, clear, and precise. It uses straightforward language to convey a deep and sincere message about families. The metaphor of music is used effectively to suggest deeper meanings about the shared joys and unique sorrows of families.\n\nResponse B, on the other hand, is less simple and clear. The language is more complex and pretentious, with phrases like "domicile of happiness" and "abode of despair" instead of the simpler "household" used in Response A. The message is similar to that of Response A, but it is less effectively conveyed due to the unnecessary complexity of the language.\n\nTherefore, based on the criteria of simplicity, clarity, precision, truthfulness, and subtext, Response A is the better response.\n\n[[A]]', 'value': 'A', 'score': 1}

或者,您可以使用 LangChain 中提供的预定义原则,例如来自 Constitutional AI 的原则。这些原则旨在评估输出的道德、有害和敏感方面。在评估中使用原则可以更加专注地评估生成的文本。

字符串和语义比较

LangChain 支持字符串比较和距离度量,用于评估 LLM 输出。像 Levenshtein 和 Jaro 这样的字符串距离度量提供了预测和参考字符串之间相似性的定量度量。使用类似 SentenceTransformers 这样的模型的嵌入距离计算生成和预期文本之间的语义相似性。嵌入距离评估器可以使用嵌入模型,例如基于 GPT-4 或 Hugging Face 嵌入的模型,计算预测和参考字符串之间的向量距离。这测量了两个字符串之间的语义相似性,并可以提供有关生成文本质量的见解。以下是文档中的一个快速示例:

from langchain.evaluation import load_evaluator
evaluator = load_evaluator("embedding_distance")
evaluator.evaluate_strings(prediction="I shall go", reference="I shan't go")

评估器返回得分 0.0966466944859925。您可以在load_evaluator()调用中使用embeddings参数更改所使用的嵌入。这通常比旧的字符串距离度量方法效果更好,但这些方法也可用,并且允许进行简单的单元测试和准确性评估。字符串比较评估器将预测字符串与参考字符串或输入进行比较。字符串距离评估器使用距离度量,例如 Levenshtein 或 Jaro 距离,来衡量预测字符串与参考字符串之间的相似性或不相似性。这提供了一个量化的度量,用于衡量预测字符串与参考字符串之间的相似程度。最后,还有一个代理轨迹评估器,其中使用evaluate_agent_trajectory()方法来评估输入、预测和代理轨迹。我们还可以使用 LangSmith 来将我们的性能与数据集进行比较。我们将在关于可观察性部分更详细地讨论这个 LangChain 的伴随项目 LangSmith。

基准数据集

使用 LangSmith,我们可以评估模型在数据集上的性能。让我们通过一个示例来了解。首先,请确保您在 LangSmith 上创建一个帐户:smith.langchain.com/ 您可以获取一个 API 密钥,并将其设置为环境中的LANGCHAIN_API_KEY。我们还可以为项目 id 和跟踪设置环境变量:

import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "My Project"

这将配置 LangChain 记录跟踪。如果我们不告诉 LangChain 项目 id,它将记录到default项目。设置完成后,当我们运行 LangChain 代理或链时,我们将能够在 LangSmith 上看到跟踪。让我们记录一个运行!

from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI()
llm.predict("Hello, world!")

我们将在 LangSmith 上看到这样:LangSmith 允许我们在 LangSmith 项目页面上列出到目前为止的所有运行:smith.langchain.com/projects

from langsmith import Client
client = Client()
runs = client.list_runs()
print(runs)

我们可以按照特定项目或run_type列出运行,例如“chain”。每次运行都有输入和输出,就像我们在这里看到的一样:

print(f"inputs: {runs[0].inputs}")
print(f"outputs: {runs[0]. outputs}")

我们可以使用create_example_from_run()函数从现有代理运行创建数据集,或者从其他任何地方创建数据集。以下是如何使用一组问题创建数据集:

questions = [
    "A ship's parts are replaced over time until no original parts remain. Is it still the same ship? Why or why not?",  # The Ship of Theseus Paradox
    "If someone lived their whole life chained in a cave seeing only shadows, how would they react if freed and shown the real world?",  # Plato's Allegory of the Cave
    "Is something good because it is natural, or bad because it is unnatural? Why can this be a faulty argument?",  # Appeal to Nature Fallacy
    "If a coin is flipped 8 times and lands on heads each time, what are the odds it will be tails next flip? Explain your reasoning.",  # Gambler's Fallacy
    "Present two choices as the only options when others exist. Is the statement \"You're either with us or against us\" an example of false dilemma? Why?",  # False Dilemma
    "Do people tend to develop a preference for things simply because they are familiar with them? Does this impact reasoning?",  # Mere Exposure Effect
    "Is it surprising that the universe is suitable for intelligent life since if it weren't, no one would be around to observe it?",  # Anthropic Principle
    "If Theseus' ship is restored by replacing each plank, is it still the same ship? What is identity based on?",  # Theseus' Paradox
    "Does doing one thing really mean that a chain of increasingly negative events will follow? Why is this a problematic argument?",  # Slippery Slope Fallacy
    "Is a claim true because it hasn't been proven false? Why could this impede reasoning?",  # Appeal to Ignorance
]
shared_dataset_name = "Reasoning and Bias"
ds = client.create_dataset(
    dataset_name=shared_dataset_name, description="A few reasoning and cognitive bias questions",
)
for q in questions:
    client.create_example(inputs={"input": q}, dataset_id=ds.id)

然后我们可以像这样在数据集上运行 LLM 代理或链:

from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
llm = ChatOpenAI(model="gpt-4", temperature=0.0)
def construct_chain():
    return LLMChain.from_string(
        llm,
        template="Help out as best you can.\nQuestion: {input}\nResponse: ",
    )

我们使用构造函数为每个输入初始化。为了评估模型在这个数据集上的性能,我们需要像在前一节中看到的那样定义一个评估器。

from langchain.evaluation import EvaluatorType
from langchain.smith import RunEvalConfig
evaluation_config = RunEvalConfig(
    evaluators=[
        # Arbitrary criterion as a key: value pair in the criteria dict:
        RunEvalConfig.Criteria({"helpfulness": "Is the response helpful?"}),
        RunEvalConfig.Criteria({"insightful": "Is the response carefully thought out?"})
    ]
)

我们将传递数据集和评估器给run_on_dataset()以生成指标和反馈:

from langchain.smith import run_on_dataset
results = run_on_dataset(
  client=client,
  dataset=dataset,
  llm_factory=lambda: my_agent, 
  evaluation=evaluation_config
)

同样,我们可以将数据集和评估器传递给arun_on_dataset()以异步生成指标和反馈。我们可以在 LangSmith UI 中查看评估器反馈,以确定改进的方向:

图 9.1:LangSmith 中的评估器。

图 9.1:LangSmith 中的评估器。

点击任何一个评估项,我们可以查看一些详细信息,例如,对于仔细思考评估器,我们得到了这个提示,其中包括 LLM 的原始答案:

You are assessing a submitted answer on a given task or input based on a set of criteria. Here is the data:
[BEGIN DATA]
***
[Input]: Is something good because it is natural, or bad because it is unnatural? Why can this be a faulty argument?
***
[Submission]: The argument that something is good because it is natural, or bad because it is unnatural, is often referred to as the "appeal to nature" fallacy. This argument is faulty because it assumes that what is natural is automatically good or beneficial, and what is unnatural is automatically bad or harmful. However, this is not always the case. For example, many natural substances can be harmful or deadly, such as certain plants or animals. Conversely, many unnatural things, such as modern medicine or technology, can greatly benefit our lives. Therefore, whether something is natural or unnatural is not a reliable indicator of its value or harm.
***
[Criteria]: insightful: Is the response carefully thought out?
***
[END DATA]
Does the submission meet the Criteria? First, write out in a step by step manner your reasoning about each criterion to be sure that your conclusion is correct. Avoid simply stating the correct answers at the outset. Then print only the single character "Y" or "N" (without quotes or punctuation) on its own line corresponding to the correct answer of whether the submission meets all criteria. At the end, repeat just the letter again by itself on a new line.

我们得到了这个评估:

The criterion is whether the response is insightful and carefully thought out. 
The submission provides a clear and concise explanation of the "appeal to nature" fallacy, demonstrating an understanding of the concept. It also provides examples to illustrate why this argument can be faulty, showing that the respondent has thought about the question in depth. The response is not just a simple yes or no, but a detailed explanation that shows careful consideration of the question. 
Therefore, the submission does meet the criterion of being insightful and carefully thought out.
Y
Y

提高少数问题类型性能的一种方法是进行少量提示。LangSmith 也可以帮助我们。您可以在 LangSmith 文档中找到更多关于此的示例。这结束了评估。现在我们已经评估了我们的代理,假设我们对性能感到满意并部署它!

如何部署您的 LLM 应用程序?

鉴于 LLMs 在各个领域的不断增加使用,了解如何有效地将模型和应用程序部署到生产中至关重要。部署服务和框架可以帮助克服技术障碍。有许多不同的方法可以将 LLM 应用程序或具有生成式 AI 的应用程序投入生产。生产部署需要对生成式 AI 生态系统进行研究和了解,其中包括不同方面,包括:

  • 模型和 LLM 作为服务:LLMs 和其他模型可以直接运行或作为 API 提供在供应商提供的基础设施上。

  • 推理启发式:检索增强生成(RAG),思维树等。

  • 向量数据库:帮助检索与提示相关的上下文信息。

  • 提示工程工具:这些工具有助于在上下文中学习,而无需昂贵的微调或敏感数据。

  • 预训练和微调:针对特定任务或领域专门化的模型。

  • 提示记录、测试和分析:受到了对了解和改进大型语言模型性能的愿望的启发而出现的新兴领域。

  • 自定义 LLM 堆栈:一组工具,用于塑造和部署基于开源模型构建的解决方案。

我们在 第一章第三章 中讨论了模型,在第 4-7 章中讨论了推理启发式,在第五章中讨论了向量数据库,在 第八章 中讨论了提示和微调。在本章中,我们将专注于部署的日志记录、监控和自定义工具。通常使用外部 LLM 提供商或自托管模型来利用 LLM。通过外部提供商,计算负担由公司如 OpenAI 或 Anthropic 承担,而 LangChain 促进了业务逻辑的实现。然而,自托管开源 LLM 可以显著降低成本、延迟和隐私问题。一些基础设施工具提供完整的解决方案。例如,您可以使用 Chainlit 部署 LangChain 代理,创建类似 ChatGPT 的 UI。一些关键功能包括中间步骤可视化、元素管理和显示(图像、文本、轮播图等)以及云部署。BentoML 是一个框架,可以将机器学习应用程序容器化,以便将它们用作独立运行和扩展的微服务,并自动生成 OpenAPI 和 gRPC 端点。您还可以将 LangChain 部署到不同的云服务端点,例如 Azure 机器学习在线端点。使用 Steamship,LangChain 开发人员可以快速部署他们的应用程序,其中包括:生产就绪的端点、跨依赖项的水平扩展、应用程序状态的持久存储、多租户支持等。以下是总结部署大型语言模型应用的服务和框架的表格:

名称描述类型
Streamlit用于构建和部署 Web 应用的开源 Python 框架框架
Gradio让您将模型包装在界面中,并托管在 Hugging Face 上框架
Chainlit构建和部署类似 ChatGPT 的对话应用框架
Apache Beam用于定义和编排数据处理工作流的工具框架
Vercel用于部署和扩展 Web 应用的平台云服务
FastAPI用于构建 API 的 Python Web 框架框架
Fly.io具有自动缩放和全球 CDN 的应用托管平台云服务
DigitalOcean App Platform用于构建、部署和扩展应用的平台云服务
Google Cloud提供像 Cloud Run 这样的服务来托管和扩展容器化应用云服务
Steamship用于部署和扩展模型的 ML 基础设施平台云服务
Langchain-serve用于将 LangChain 代理作为 Web API 提供的工具框架
BentoML用于模型服务、打包和部署的框架框架
OpenLLM提供商业 LLM 的开放 API云服务
Databutton无代码平台,用于构建和部署模型工作流框架
Azure MLAzure 上用于模型的托管 ML 运维服务云服务

图 9.2:部署大型语言模型应用的服务和框架。

所有这些都有不同用例的详细文档,通常直接引用 LLMs。我们已经展示了使用 Streamlit 和 Gradio 的示例,并讨论了如何将它们部署到 HuggingFace Hub 作为示例。运行 LLM 应用程序有几个主要要求:

  • 可扩展的基础设施,用于处理计算密集型模型和潜在的流量峰值

  • 低延迟用于实时提供模型输出

  • 持久存储用于管理长对话和应用程序状态

  • 用于集成到最终用户应用程序的 API

  • 监控和记录以跟踪指标和模型行为

在大量用户交互和与 LLM 服务相关的高成本下,保持成本效率可能具有挑战性。管理效率的策略包括自托管模型、根据流量自动调整资源分配、使用抢占式实例、独立扩展和批量请求以更好地利用 GPU 资源。工具和基础设施的选择决定了这些要求之间的权衡。灵活性和易用性非常重要,因为我们希望能够快速迭代,这对于 ML 和 LLM 领域的动态性至关重要。避免被绑定到一个解决方案是至关重要的。一个灵活、可扩展的服务层,能够容纳各种模型是关键。模型组合和云提供商的选择构成了这种灵活性方程的一部分。对于最大的灵活性,基础设施即代码(IaC)工具如 Terraform、CloudFormation 或 Kubernetes YAML 文件可以可靠快速地重新创建您的基础设施。此外,持续集成和持续交付(CI/CD)流水线可以自动化测试和部署过程,以减少错误并促进更快的反馈和迭代。设计一个强大的 LLM 应用服务可能是一个复杂的任务,需要在评估服务框架时理解权衡和关键考虑因素。利用这些解决方案之一进行部署,使开发人员能够专注于开发有影响力的 AI 应用程序,而不是基础设施。如前所述,LangChain 与几个开源项目和框架如 Ray Serve、BentoML、OpenLLM、Modal 和 Jina 很好地配合。在下一节中,我们将基于 FastAPI 部署一个基于聊天服务的 Web 服务器。

快速 API 网络服务器

FastAPI 是部署网络服务器的非常受欢迎的选择。设计快速、易于使用和高效,它是一个现代化、高性能的用 Python 构建 API 的 Web 框架。Lanarky 是一个小型的开源库,用于部署 LLM 应用程序,提供了方便的 Flask API 和 Gradio 的包装器,用于部署 LLM 应用程序。这意味着您可以同时获得 REST API 端点和浏览器内可视化,而且只需要几行代码。

一个REST API(表述性状态转移应用程序编程接口)是一组规则和协议,允许不同的软件应用程序在互联网上进行通信。它遵循 REST 的原则,这是一种用于设计网络应用程序的架构风格。REST API 使用 HTTP 方法(如 GET、POST、PUT、DELETE)对资源执行操作,并通常以标准化格式(如 JSON 或 XML)发送和接收数据。

在库文档中,有几个示例,包括一个带有源链的检索 QA、一个对话检索应用程序和一个零射击代理。在另一个示例中,我们将使用 Lanarky 实现一个聊天机器人 Web 服务器。我们将使用 Lanarky 设置一个与 Gradio 集成的 Web 服务器,创建一个带有 LLM 模型和设置的ConversationChain实例,并定义用于处理 HTTP 请求的路由。首先,我们将导入必要的依赖项,包括用于创建 Web 服务器的 FastAPI,用于与 Gradio 集成的mount_gradio_app,用于处理 LLM 对话的ConversationChainChatOpenAI来自 Langchain 的模块,以及其他所需的模块:

from fastapi import FastAPI
from lanarky.testing import mount_gradio_app
from langchain import ConversationChain
from langchain.chat_models import ChatOpenAI
from lanarky import LangchainRouter
from starlette.requests import Request
from starlette.templating import Jinja2Templates

请注意,您需要按照第三章中的说明设置您的环境变量。定义了一个create_chain()函数来创建ConversationChain的实例,指定 LLM 模型及其设置:

def create_chain():
    return ConversationChain(
        llm=ChatOpenAI(
            temperature=0,
            streaming=True,
        ),
        verbose=True,
    )

我们将链设置为ConversationChain

chain = create_chain()

将 app 变量分配给mount_gradio_app,它创建了一个名为ConversationChainDemoFastAPI实例,并将其与 Gradio 集成:

app = mount_gradio_app(FastAPI(title="ConversationChainDemo"))

模板变量设置为Jinja2Templates类,指定了用于呈现模板的目录。这指定了网页将如何显示,允许各种自定义:

templates = Jinja2Templates(directory="webserver/templates")

使用 FastAPI 装饰器@app.get定义了处理根路径(/)上的 HTTP GET 请求的端点。与此端点相关联的函数返回一个模板响应,用于呈现 index.xhtml 模板:

@app.get("/")
async def get(request: Request):
    return templates.TemplateResponse("index.xhtml", {"request": request})

创建了一个LangchainRouter类作为路由器对象。该对象负责定义和管理与ConversationChain实例相关的路由。我们可以为路由器添加额外的路由,用于处理基于 JSON 的聊天,甚至可以处理 WebSocket 请求:

langchain_router = LangchainRouter(
    langchain_url="/chat", langchain_object=chain, streaming_mode=1
)
langchain_router.add_langchain_api_route(
    "/chat_json", langchain_object=chain, streaming_mode=2
)
langchain_router.add_langchain_api_websocket_route("/ws", langchain_object=chain)
app.include_router(langchain_router)

现在我们的应用程序知道如何处理发送到路由中指定的路由的请求,将它们指向适当的函数或处理程序进行处理。我们将使用 Uvicorn 来运行我们的应用程序。Uvicorn 擅长支持高性能、异步框架,如 FastAPI 和 Starlette。由于其异步特性,它能够处理大量并发连接,并在重负载下表现良好。我们可以像这样从终端运行 Web 服务器:

uvicorn webserver.chat:app –reload

这个命令启动了一个 Web 服务器,你可以在浏览器中查看,地址是:127.0.0.1:8000--reload 开关特别方便,因为它意味着一旦你做出任何更改,服务器将自动重新启动。这是我们刚刚部署的聊天机器人应用程序的快照:

图 9.3:Flask/Lanarky 中的聊天机器人

图 9.3:Flask/Lanarky 中的聊天机器人

我认为我们所做的工作很少,看起来相当不错。它还带有一些不错的功能,如 REST API、Web UI 和 Websocket 接口。虽然 Uvicorn 本身不提供内置的负载均衡功能,但它可以与其他工具或技术(如 Nginx 或 HAProxy)一起工作,在部署设置中实现负载均衡,将传入的客户端请求分发到多个工作进程或实例中。使用 Uvicorn 与负载均衡器可以实现水平扩展,处理大量流量,提高客户端的响应时间,增强容错性。在下一节中,我们将看到如何使用 Ray 构建稳健且具有成本效益的生成式 AI 应用程序。我们将使用 LangChain 进行文本处理,使用 Ray 进行扩展索引和服务,构建一个简单的搜索引擎。

Ray

Ray 提供了一个灵活的框架,通过在集群中扩展生成式 AI 工作负载,以满足生产中复杂神经网络的基础设施挑战。Ray 可以帮助解决常见的部署需求,如低延迟服务、分布式训练和大规模批量推理。Ray 还可以轻松地启动按需微调或将现有工作负载从一台机器扩展到多台机器。一些功能包括:

  • 使用 Ray Train 在 GPU 集群上安排分布式训练作业

  • 使用 Ray Serve 部署预训练模型以实现低延迟服务的大规模部署

  • 使用 Ray Data 在 CPU 和 GPU 上并行运行大规模批量推理

  • 编排端到端生成式 AI 工作流,结合训练、部署���批处理

我们将使用 LangChain 和 Ray 来构建一个简单的搜索引擎,用于 Ray 文档,这是根据 Waleed Kadous 在 anyscale 博客上实现的示例和在 Github 上的 langchain-ray 仓库中实现的。你可以将其视为 Channel 5 中示例的延伸。你可以在这里看到此示例的完整代码:github.com/benman1/generative_ai_with_langchain。你还将看到如何将其作为 FastAPI 服务器运行。首先,我们将摄取和索引 Ray 文档,以便快速找到相关段落以供搜索查询:

# Load the Ray docs using the LangChain loader
loader = RecursiveUrlLoader("docs.ray.io/en/master/") 
docs = loader.load()
# Split docs into sentences using LangChain splitter
chunks = text_splitter.create_documents(
    [doc.page_content for doc in docs],
    metadatas=[doc.metadata for doc in docs])
# Embed sentences into vectors using transformers
embeddings = LocalHuggingFaceEmbeddings('multi-qa-mpnet-base-dot-v1')  
# Index vectors using FAISS via LangChain
db = FAISS.from_documents(chunks, embeddings) 

这将通过摄取文档、将其拆分为句子、嵌入句子并索引向量来构建我们的搜索索引。或者,我们可以通过并行化嵌入步骤来加速索引:

# Define shard processing task
@ray.remote(num_gpus=1)  
def process_shard(shard):
  embeddings = LocalHuggingFaceEmbeddings('multi-qa-mpnet-base-dot-v1')
  return FAISS.from_documents(shard, embeddings)
# Split chunks into 8 shards
shards = np.array_split(chunks, 8)  
# Process shards in parallel
futures = [process_shard.remote(shard) for shard in shards]
results = ray.get(futures)
# Merge index shards
db = results[0]
for result in results[1:]:
  db.merge_from(result)

通过在每个分片上并行运行嵌入,我们可以显著减少索引时间。我们将数据库索引保存到磁盘:

db.save_local(FAISS_INDEX_PATH)

FAISS_INDEX_PATH是一个任意的文件名。我将其设置为faiss_index.db。接下来,我们将看到如何使用 Ray Serve 提供搜索查询。

# Load index and embedding
db = FAISS.load_local(FAISS_INDEX_PATH)
embedding = LocalHuggingFaceEmbeddings('multi-qa-mpnet-base-dot-v1')
@serve.deployment
class SearchDeployment:
  def __init__(self):
    self.db = db
    self.embedding = embedding

  def __call__(self, request):   
    query_embed = self.embedding(request.query_params["query"])
    results = self.db.max_marginal_relevance_search(query_embed) 
    return format_results(results) 
deployment = SearchDeployment.bind()
# Start service
serve.run(deployment)

这让我们可以将搜索查询作为 Web 端点提供!运行这个给我这个输出:

Started a local Ray instance. 
View the dashboard at 127.0.0.1:8265

现在我们可以从 Python 中查询它:

import requests
query = "What are the different components of Ray"
         " and how can they help with large language models (LLMs)?”
response = requests.post("http://localhost:8000/", params={"query": query})
print(response.text)

对我来说,服务器在 Ray 用例页面上获取了:https://docs.ray.io/en/latest/ray-overview/use-cases.xhtml我真的很喜欢 Ray 仪表板的监控,看起来像这样:

图 9.4:Ray 仪表板。

图 9.4:Ray 仪表板。

这个仪表板非常强大,因为它可以为您提供大量的指标和其他信息。收集指标非常容易,因为您只需设置和更新部署对象或者 actor 中的CounterGaugeHistogram或其他类型的变量。对于时间序列图表,您应该安装 Prometheus 或 Grafana 服务器。正如您在 Github 上看到的完整实现,我们也可以将其作为 FastAPI 服务器启动。这结束了我们使用 LangChain 和 Ray 构建的简单语义搜索引擎。随着模型和 LLM 应用程序变得越来越复杂,并且高度交织到业务应用程序的结构中,生产中的可观察性和监控变得必不可少,以确保它们的准确性、效率和可靠性。下一节将重点介绍监控 LLMs 的重要性,并强调要跟踪的关键指标,以制定全面的监控策略。

如何观察 LLM 应用程序?

现实世界运营的动态性意味着离线评估中评估的条件几乎不可能涵盖 LLMs 在生产系统中可能遇到的所有潜在场景。因此,生产中需要可观察性 - 更持续、实时的观察,以捕捉离线测试无法预料到的异常情况。可观察性允许在模型与实际输入数据和用户在生产中交互时监控行为和结果。它包括日志记录、跟踪、追踪和警报机制,以确保系统正常运行、性能优化和及早捕捉模型漂移等问题。正如讨论的那样,LLMs 已经成为健康、电子商务和教育等领域许多应用程序中越来越重要的组成部分。

跟踪、追踪和监控是软件运营和管理领域中的三个重要概念。虽然都与理解和改进系统性能有关,但它们各自扮演着不同的角色。跟踪和追踪是为了保留详细的历史记录以供分析和调试,而监控旨在实时观察和立即意识到问题,以确保系统在任何时候功能最佳。这三个概念都属于可观察性范畴。

监控是持续监视系统或应用程序性能的过程。这可能涉及持续收集和分析与系统健康相关的指标,如内存使用情况、CPU 利用率、网络延迟以及整体应用程序/服务性能(如响应时间)。有效的监控包括为异常或意外行为设置警报系统 - 当超过某些阈值时发送通知。而跟踪和追踪是关于保留详细的历史记录以进行分析和调试,监控旨在实时观察和立即意识到问题,以确保系统功能始终处于最佳状态。

监控和可观察性的主要目标是通过实时数据提供对模型性能和行为的洞察。这有助于:

  • 防止模型漂移:模型随时间可能因输入数据或用户行为特征的变化而退化。定期监控可以及早识别这种情况并采取纠正措施。

  • 性能优化:通过跟踪推理时间、资源使用情况和吞吐量等指标,您可以进行调整以提高 LLM 在生产中的效率和效果。

  • A/B 测试:它有助于比较模型中轻微差异可能导致不同结果的方式,从而有助于决策改进模型。

  • 调试问题:监控有助于识别运行时可能发生的未预料问题,从而实现快速解决。

重要的是考虑由几个方面组成的监控策略:

  • 监控的指标:根据所需的模型性能定义关键的感兴趣指标,如预测准确性、延迟、吞吐量等。

  • 监控频率:监控频率应根据模型对运营的关键程度来确定 - 高度关键的模型可能需要接近实时的监控。

  • 日志记录:日志应提供有关 LLM 执行的每个相关操作的详细信息,以便分析人员可以追溯任何异常情况。

  • 警报机制:系统应在检测到异常行为或性能急剧下降时发出警报。

监控 LLM 具有多种目的,包括评估模型性能、检测异常或问题、优化资源利用率以及确保一致和高质量的输出。通过通过验证、影子发布和解释以及可靠的离线评估持续评估 LLM 的行为和性能,组织可以识别和减轻潜在风险,保持用户信任,并提供最佳体验。以下是相关指标的列表:

  • 推理延迟:衡量 LLM 处理请求并生成响应所需的时间。较低的延迟确保更快速和更具响应性的用户体验。

  • 每秒查询数(QPS):计算 LLM 在给定时间范围内可以处理的查询或请求数量。监控 QPS 有助于评估可伸缩性和容量规划。

  • 每秒令牌数(TPS):跟踪 LLM 生成令牌的速率。TPS 指标有助于估计计算资源需求并了解模型效率。

  • 令牌使用量:令牌数量与资源使用相关,如硬件利用率、延迟和成本。

  • 错误率:监控 LLM 响应中错误或失败的发生,确保错误率保持在可接受范围内,以维持输出质量。

  • 资源利用率:衡量计算资源的消耗,如 CPU、内存和 GPU,以优化资源分配并避免瓶颈。

  • 模型漂移:通过将 LLM 的输出与基准或基本事实进行比较,检测 LLM 行为随时间的变化,确保模型保持准确性并与预期结果保持一致。

  • 超出分布输入:识别落在 LLM 训练数据预期分布之外的输入或查询,这可能导致意外或不可靠的响应。

  • 用户反馈指标:监控用户反馈渠道,收集关于用户满意度的见解,识别改进领域,并验证 LLM 的有效性。

数据科学家和机器学习工程师应使用模型解释工具如 LIME 和 SHAP 检查过时性、不正确的学习和偏见。最具预测性的特征突然变化可能表明数据泄漏。离线指标如 AUC 并不总是与在线转化率的影响相关,因此重要的是找到可靠的离线指标,这些指标转化为对业务相关的在线收益,理想情况下是系统直接影响的点击和购买等直接指标。有效的监控能够实现 LLM 的成功部署和利用,增强对其能力的信心并培养用户信任。然而,应当注意,依赖云服务平台时应研究隐私和数据保护政策。在下一节中,我们将看一下监控代理的轨迹。

跟踪和追踪

跟踪通常指记录和管理有关应用程序或系统中特定操作或一系列操作的信息的过程。例如,在机器学习应用程序或项目中,跟踪可能涉及记录不同实验或运行中的参数、超参数、指标、结果等。它提供了一种记录进展和随时间变化的方式。

跟踪是一种更专业的追踪形式。它涉及记录软件/系统中的执行流程。特别是在单个交易可能涵盖多个服务的分布式系统中,跟踪有助于维护审计或面包屑路径,详细信息关于该请求路径通过系统。这种细粒度视图使开发人员能够理解各种微服务之间的交互,并通过确定事务路径中发生问题的确切位置来解决延迟或故障等问题。

跟踪代理的轨迹可能具有挑战性,因为它们具有广泛的行动范围和生成能力。LangChain 具有轨迹跟踪和评估功能。实际上,查看代理的痕迹非常容易!您只需在初始化代理或 LLM 时将 return_intermediate_steps参数设置为True。让我们快速看一下这个。我会跳过导入和设置环境。您可以在此地址的 github 上找到完整的清单:github.com/benman1/generative_ai_with_langchain/我们将定义一个工具。使用@tool装饰器非常方便,它将使用函数文档字符串作为工具的描述。第一个工具向网站地址发送一个 ping,并返回有关传输包和延迟或(在错误情况下)错误消息的信息:

@tool
def ping(url: HttpUrl, return_error: bool) -> str:
    """Ping the fully specified url. Must include https:// in the url."""
    hostname = urlparse(str(url)).netloc
    completed_process = subprocess.run(
        ["ping", "-c", "1", hostname], capture_output=True, text=True
    )
    output = completed_process.stdout
    if return_error and completed_process.returncode != 0:
        return completed_process.stderr
    return output]

现在我们设置一个使用此工具与 LLM 的代理,以根据提示进行调用:

llm = ChatOpenAI(model="gpt-3.5-turbo-0613", temperature=0)
agent = initialize_agent(
    llm=llm,
    tools=[ping],
    agent=AgentType.OPENAI_MULTI_FUNCTIONS,
    return_intermediate_steps=True,  # IMPORTANT!
)
result = agent("What's the latency like for https://langchain.com?")

代理报告如下:

The latency for https://langchain.com is 13.773 ms

results["intermediate_steps"]中,我们可以看到有关代理操作的大量信息:

[(_FunctionsAgentAction(tool='ping', tool_input={'url': 'https://langchain.com', 'return_error': False}, log="\nInvoking: `ping` with `{'url': 'https://langchain.com', 'return_error': False}`\n\n\n", message_log=[AIMessage(content='', additional_kwargs={'function_call': {'name': 'tool_selection', 'arguments': '{\n  "actions": [\n    {\n      "action_name": "ping",\n      "action": {\n        "url": "https://langchain.com",\n        "return_error": false\n      }\n    }\n  ]\n}'}}, example=False)]), 'PING langchain.com (35.71.142.77): 56 data bytes\n64 bytes from 35.71.142.77: icmp_seq=0 ttl=249 time=13.773 ms\n\n--- langchain.com ping statistics ---\n1 packets transmitted, 1 packets received, 0.0% packet loss\nround-trip min/avg/max/stddev = 13.773/13.773/13.773/0.000 ms\n')]

通过提供对系统的可见性,并帮助识别问题和优化工作,这种跟踪和评估可以非常有帮助。LangChain 文档演示了如何使用轨迹评估器来检查它们生成的完整动作和响应序列,并对 OpenAI 函数代理进行评分。让我们超越 LangChain,看看可观察性领域有什么!

可观察性工具

在 LangChain 中或通过回调,有许多工具可用作集成:

  • Argilla:Argilla 是一个开源数据整理平台,可以将用户反馈(人在循环工作流程)与提示和响应集成,以整理数据集进行微调。

  • Portkey:Portkey 为 LangChain 添加了重要的 MLOps 功能,如监视详细指标、跟踪链、缓存和可靠性通过自动重试。

  • Comet.ml:Comet 提供强大的 MLOps 功能,用于跟踪实验、比较模型和优化 AI 项目。

  • LLMonitor:跟踪许多指标,包括成本和使用分析(用户跟踪)、跟踪和评估工具(开源)。

  • DeepEval:记录默认指标,如相关性、偏见和毒性。还可以帮助测试和监视模型漂移或退化。

  • Aim:用于 ML 模型的开源可视化和调试平台。它记录输入、输出以及组件的序列化状态,使得可以对单个 LangChain 执行进行视觉检查,并将多个执行进行比较。

  • Argilla:用于跟踪训练数据、验证准确性、参数等的开源平台,适用于机器学习实验。

  • Splunk:Splunk 的机器学习工具包可以提供对生产中机器学习模型的可观察性。

  • ClearML:用于自动化训练管道的开源工具,无缝地从研究过渡到生产。

  • IBM Watson OpenScale:提供对 AI 健康状况的洞察,快速识别和解决问题,帮助减轻风险。

  • DataRobot MLOps:监视和管理模型,以在影响性能之前检测问题。

  • Datadog APM 集成:此集成允许您捕获 LangChain 请求、参数、提示完成,并可视化 LangChain 操作。您还可以捕获请求延迟、错误以及令牌/成本使用等指标。

  • Weights and Biases (W&B) 跟踪:我们已经展示了使用 (W&B) 监控微调收敛的示例,但它还可以跟踪其他指标,记录和比较提示。

  • Langfuse:使用这个开源工具,我们可以方便地监视有关我们的 LangChain 代理和工具的跟踪的详细信息,如延迟、成本、分数等。

大多数这些集成非常容易集成到 LLM 管道中。例如,对于 W&B,您可以通过将LANGCHAIN_WANDB_TRACING环境变量设置为True来启用跟踪。或者,您可以使用wandb_tracing_enabled()上下文管理器来跟踪特定的代码块。使用 Langfuse,我们可以将langfuse.callback.CallbackHandler()作为参数传递给chain.run()调用。其中一些工具是开源的,这些平台的优点在于允许完全定制和本地部署,适用于隐私重要的用例。例如,Langfuse 是开源的,并提供自托管选项。选择最适合您需求的选项,并按照 LangChain 文档中提供的说明启用代理的跟踪。虽然该平台最近才发布,但我相信还有更多功能将会推出,但已经很棒能看到代理执行的痕迹,检测循环和延迟问题。它可以与合作者共享跟踪和统计数据,讨论改进。

LangSmith

LangSmith 是由 LangChain AI 开发和维护的用于调试、测试、评估和监控 LLM 应用的框架,LangChain 是 LangChain 背后的组织。LangSmith 作为 MLOps 的有效工具,特别是针对 LLMs,提供覆盖 MLOps 流程多个方面的功能。它可以帮助开发人员通过提供调试、监控和优化功能,将他们的 LLM 应用从原型推进到生产阶段。LangSmith 旨在通过提供简单直观的用户界面,降低对没有软件背景的人的准入门槛。LangSmith 是用 LangChain 构建的用于调试、测试和监控大型语言模型(LLMs)的平台。它允许您:

  • 记录来自您的 LangChain 代理、链和其他组件的运行跟踪

  • 创建数据集以评估模型性能

  • 配置 AI 辅助评估器来评分您的模型

  • 查看指标、可视化和反馈,以迭代和改进您的 LLMs

LangSmith 通过提供功能和能力来满足代理的 MLOps 要求,使开发人员能够调试、测试、评估、监控和优化语言模型应用。其在 LangChain 框架中的集成增强了整体开发体验,并促进了语言模型应用的充分潜力。通过同时使用这两个平台,开发人员可以将他们的 LLM 应用从原型阶段优化到生产阶段,并优化延迟、硬件效率和成本。我们可以获得一组大量的图表,展示了许多重要统计数据,就像我们在这里看到的:

图 9.5:LangSmith 中的评估器指标。

图 9.5:LangSmith 中的评估器指标。

监控仪表板包括以下图表,可以按不同的时间间隔进行分解:

统计数据类别
跟踪计数,LLM 调用计数,跟踪成功率,LLM 调用成功率量级
跟踪延迟(秒),LLM 延迟(秒),每个跟踪的 LLM 调用,标记/秒延迟
总标记数,每个跟踪的标记数,每个 LLM 调用的标记数标记数
% 带有流式处理的跟踪,% 带有流式处理的 LLM 调用,跟踪时间到第一个标记(毫秒),LLM 时间到第一个标记(毫秒)流式处理

图 9.6:LangSmith 中的统计数据。

这是 LangSmith 中用于我们在评估部分中看到的基准数据集运行的跟踪示例:

图 9.7:LangSmith 中的跟踪。

图 9.7:LangSmith 中的跟踪。

该平台本身不是开源的,但是 LangSmith 和 LangChain 背后的公司 LangChain AI 为有隐私问题的组织提供了一些自托管的支持。然而,LangSmith 有一些替代品,如 Langfuse、Weights and Biases、Datadog APM、Portkey 和 PromptWatch,功能有一些重叠。我们将重点关注 LangSmith,因为它具有用于评估和监控的大量功能,并且因为它与 LangChain 集成。在下一节中,我们将演示如何利用 PromptWatch.io 来跟踪 LLM 在生产环境中的提示。

PromptWatch

PromptWatch 记录了此交互期间有关提示和生成输出的信息。让我们先处理输入。

from langchain import LLMChain, OpenAI, PromptTemplate
from promptwatch import PromptWatch
from config import set_environment
set_environment()

如第三章所述,我已经在 set_environment()函数中将所有 API 密钥设置在环境中。

prompt_template = PromptTemplate.from_template("Finish this sentence {input}")
my_chain = LLMChain(llm=OpenAI(), prompt=prompt_template)

使用PromptTemplate类,将提示模板设置为一个变量input,指示用户输入应放置在提示中的位置。在PromptWatch块内,通过以输入提示作为示例调用LLMChain,演示了模型根据提供的提示生成响应的过程。

with PromptWatch() as pw:
    my_chain("The quick brown fox jumped over")

图 9.8:PromptWatch.io 上的提示跟踪。

图 9.8:PromptWatch.io 上的提示跟踪。

这看起来非常有用。通过利用 PromptWatch.io,开发人员和数据科学家可以有效地监视和分析 LLM 的提示、输出和成本在实际场景中的情况。PromptWatch.io 为 LLM 提供了全面的链执行跟踪和监控功能。使用 PromptWatch.io,您可以跟踪 LLM 链的所有方面,包括操作、检索文档、输入、输出、执行时间、工具详细信息等,以完全了解您的系统。该平台通过提供用户友好的可视界面,使用户能够识别问题的根本原因并优化提示模板,从而进行深入分析和故障排除。PromptWatch.io 还可以帮助进行单元测试和版本化提示模板。让我们总结本章!

摘要

成功部署 LLMs 和其他生成式 AI 模型在生产环境中是一个复杂但可管理的任务,需要仔细考虑许多因素。这需要解决与数据质量、偏见、伦理、监管合规性、可解释性、资源需求以及持续监控和维护等挑战相关的问题。LLMs 的评估是评估其性能和质量的重要步骤。LangChain 支持模型之间的比较评估,检查输出是否符合标准,简单的字符串匹配以及语义相似性度量。这些提供了对模型质量、准确性和适当生成的不同见解。系统化评估是确保大型语言模型产生有用、相关和明智输出的关键。监控 LLMs 是部署和维护这些复杂系统的重要方面。随着 LLMs 在各种应用中的日益普及,确保它们的性能、有效性和可靠性至关重要。我们已经讨论了监控 LLMs 的重要性,强调了跟踪全面监控策略的关键指标,并举例说明了如何在实践中跟踪指标。LangSmith 提供了强大的功能,用于跟踪、基准测试和优化使用 LangChain 构建的大型语言模型。其自动评估器、指标和可视化帮助加速 LLM 的开发和验证。让我们看看你是否记得本章的要点!

问题

请看看你是否能回答这些问题。如果你对任何问题不确定,你可能需要参考本章的相应部分:

  1. 在你看来,什么是描述语言模型的操作化、LLM 应用程序或依赖生成模型的应用程序的最佳术语?

  2. 我们如何评估 LLM 应用程序?

  3. 哪些工具可以帮助评估 LLM 应用程序?

  4. 生产部署代理的考虑因素是什么?

  5. 列举一些部署工具的名称?

  6. 在生产环境中监控 LLMs 的重要指标是什么?

  7. 我们如何监控这些模型?

  8. 什么是 LangSmith?

十、生成模型的未来

在这本书中,到目前为止,我们已经讨论了用于构建应用程序的生成模型。我们探讨了 LLMs 和图像模型用于内容创作,工具使用,代理策略,检索增强生成的语义搜索,以及使用提示和微调来调节模型。此外,我们实现了一些简单的应用程序,例如为开发人员和数据科学家。在本章中,我们将讨论这给我们留下了什么,未来将引领我们走向何方。人工智能领域的进展速度在过去一年中急剧加快,像 DALL-E,Midjourney 和 ChatGPT 这样的突破性成果产生了惊人的结果。这些生成式人工智能模型可以创建逼真的图像,撰写文章和代码,并具有超越大多数人类的对话能力。2022 年,生成式人工智能初创公司的风险投资激增,几乎与前五年的总投资额相匹配。最近,像 Salesforce 和 Accenture 这样的主要参与者已经做出了数十亿美元的投资承诺。为特定用例定制基础模型被视为真正的价值创造机会。但目前尚不清楚哪些实体 - 大型科技公司,初创公司或基础模型开发者 - 将获得最大的上行空间。在技术层面上,像 ChatGPT 这样的生成模型通常作为黑匣子运作,对其决策过程的透明度有限。模型可解释性的缺乏使得完全理解模型行为或控制输出变得困难。还存在潜在偏见可能由于不完善的训练数据而出现的担忧。在实际层面上,生成模型需要大量的计算资源进行训练和部署。对于许多组织来说,获取基础设施以有效利用这些人工智能系统仍然是一道障碍。在积极的一面,人工智能可以使技能民主化,使业余爱好者能够在设计,写作等方面产生专业质量的输出。企业可以从更快,更便宜,按需的工作中受益。然而,人们对工作岗位流失存在重大担忧,特别是对于像平面设计师,律师和医生这样的专业中产阶级角色。他们的工作正在被自动化,而低技能工人则学会利用人工智能作为超能力。更令人不安的是,人工智能可能被军事,恐怖分子,犯罪分子和政府用于宣传和影响。实时生成的 Deepfakes 将促使欺诈活动泛滥,并侵蚀信任。前进的道路在热情和实用性之间取得平衡,优先考虑人类尊严。通过承认风险,促进开放讨论,并实施周到的政策,我们可以建立一个由人工智能激发的公平未来。本章的主要部分包括:

  • 当前生成式人工智能的状态

  • 可能的未来能力

  • 社会影响

  • 实际实施

  • 未来之路

让我们从当前模型的状态和它们的能力开始。

当前生成式人工智能的状态

正如本书所讨论的,在最近几年,生成式人工智能模型在跨越文本、图像、音频和视频等多种形式的人类内容生成方面取得了新的里程碑。领先的模型如 OpenAI 的 GPT-4 和 DALL-E 2,Google 的 Imagen 和 Parti,以及 Anthropic 的 Claude 在语言生成方面展现出令人印象深刻的流畅性和创造性视觉艺术。在 2022 年至 2023 年之间,模型取得了长足的进步。如果生成模型以前只能生成难以理解的文本或模糊的图像,现在我们看到高质量的 3D 模型、视频,并生成连贯和上下文相关的散文和对话,与人类的流畅水平相媲美甚至超越。这些人工智能模型利用庞大的数据集和计算规模,使它们能够捕捉复杂的语言模式,展现对世界知识的细致理解,翻译文本,总结内容,回答自然语言问题,创作吸引人的视觉艺术,并获得描述图像的能力。看似像魔术一样,人工智能生成的输出模仿了人类的创造力 - 绘制原创艺术,写诗,生成人类水平的散文,甚至从不同来源进行复杂的信息聚合和综合。但让我们更加细致一些。生成模型也有弱点,不仅有优势。与人类认知相比,仍然存在缺陷,包括频繁生成似是而非或荒谬的陈述。幻觉显示缺乏现实基础,因为它们基于数据中的模式而不是对真实世界的理解。此外,模型在执行数学、逻辑或因果推理方面存在困难。它们很容易被复杂的推理问题搞混,这可能限制它们在某些工作领域的适用性。预测的不可解释性黑匣子问题以及模型本身阻碍了故障排除工作,控制模型行为在期望参数内仍然具有挑战性。人工智能模型可能表现出有害的意外偏见,引发重大的伦理关切 - 这个问题很大程度上是由训练数据中存在的偏见所致。这种偏见不仅扭曲输出,还可能传播和放大社会差距。下面是一个表格,将当前 LLMs 的关键优势和缺陷与人类认知进行了对比:

LLMs 的优势LLMs 的缺陷
语言流畅性 - 能够生成语法连贯、上下文相关的散文和对话。GPT-4 能够生成人类水平的散文。事实准确性 - 语言模型经常生成似是而非或荒谬的陈述。缺乏现实基础。
知识综合 - 从多样化来源聚合和呈现信息的复杂过程。逻辑推理 - 无法进行数学、逻辑或因果推理。容易被复杂的推理问题所困扰。
创造性输出 - 反映人类创造力的想象力和原创文本、艺术、音乐。克劳德写诗,DALL-E 2 绘制原创艺术。可控性 - 难以约束模型在期望参数内的行为。可能展示有害的意外偏见。
偏见 - 有可能传播和放大训练数据中存在的社会偏见。引发道德关切。
透明度 - 模型预测缺乏可解释性。"黑匣子"问题限制了故障排除。

图 10.1:LLM 的优势和不足。

尽管生成式人工智能的能力已经取得了长足进步,但它们的问题领域需要解决,以便这些技术在未来有效地发挥作用。尽管如此,它们的深远潜力表明,如果负责任地开发和监管,将会有一个令人兴奋的未来。生成模型的弱点定义了一些技术挑战,我们现在将看到。

技术挑战

尽管取得了快速进展,但要安全、负责地实现生成式人工智能的全部潜力仍然存在重大技术障碍。正如前面提到的,生成式人工智能模型尽管取得了可观的进步,但仍在应对需要克服的重大技术挑战,以允许其安全、负责地发挥全部潜力。我们已经在前几章讨论了一些这些问题和潜在解决方案。这个表格总结了其中一些挑战以及解决它们的技术方法:

挑战描述潜在解决方案
生成真实和多样化内容现有模型在逻辑一致性和事实合理性方面存在困难。生成的样本重复、乏味,缺乏人类细微差别。从人类反馈中强化学习数据增强和合成技术模块化领域知识
输出质量控制缺乏可靠约束生成内容属性的机制。模型偶尔会产生有害、偏见或荒谬的结果。有限的优化目标调节系统中断和纠正技术
避免偏见模型无意中放大了训练数据中存在的社会偏见。开发技术来遏制偏见仍然困难。平衡和代表性的训练数据偏见缓解算法持续测试和审计
事实准确性无法推理客观真理限制了在现实世界应用中的可靠性。将模型基于常识和物理知识是一个未解之谜。结合知识库混合神经符号结构检索增强生成
可解释性大型神经网络的不透明行为对故障排除或偏见提出了障碍,需要可解释的人工智能技术。模型内省技术概念归因方法简化模型架构
数据隐私收集和处理大规模数据集带来了关于同意、匿名化、访问控制和数据滥用的挑战。差分隐私和安全多方计算合成数据生成联邦学习
延迟和计算部署庞大模型需要大量计算资源,延迟了许多应用程序所需的实时交互性。模型压缩为更小的形式优化推理引擎专用人工智能硬件加速器
数据许可组织可能需要获得商业许可来使用现有数据集或构建定制数据集以训练生成模型。这可能是一个复杂和耗时的过程。开源和合成数据

图 10.2:技术挑战和潜在解决方案。

主要问题在于,这些模型生成的内容往往缺乏现实感和多样性。虽然它们展示了模仿人类语言和创造力的令人印象深刻的能力,但在产生逻辑一致和事实可信的内容方面仍然表现不佳。它们的输出往往缺乏人类的细微差别,变得相当重复和乏味。潜在的解决方案包括通过人类反馈进行强化学习以提高连贯性和细微差别,控制数据增强和合成技术,以及融合模块化领域知识的架构。另一个关键障碍是控制输出质量。尽管经过严格的训练和开发,现有的人工智能机制在可靠地约束生成内容的属性方面仍然存在不足。这导致内容的零星生产可能是有害的、带有偏见的或完全荒谬的,对其更广泛的接受和应用构成风险。有希望的方法包括受限制的优化目标、人机协同的调节系统以及在生成过程中中断和纠正模型输出的技术。这些人工智能模型存在偏见的问题确实是一个重要问题,因为它们经常无意中放大其训练数据中存在的社会偏见。开发纠正偏见的技术仍然是一个复杂的问题。诸如平衡和代表性训练数据、偏见缓解算法以及为公平性进行持续测试和审计的策略旨在解决这一问题。这些人工智能模型无法推理客观真理的能力明显限制了它们在现实世界应用中的可靠性。将这些模型基于常识和物理学进行基础化代表着人工智能社区仍在努力解决的一个悬而未决的问题。混合神经符号架构、知识库的整合以及检索增强生成提供了有希望的方向。人工智能的黑匣子性质带来了另一个复杂的挑战:可解释性。大型神经网络的不透明行为给故障排除或偏见带来了障碍,这强调了更透明的人工智能技术的需求。模型内省、概念归因方法以及简化的模型架构可能提供解决方案。此外,由于收集和处理大量数据集,数据隐私问题变得突出。这一方面引入了关于同意、匿名化、访问控制和数据滥用的挑战。差分隐私、安全多方计算、合成数据生成和联邦学习等技术可能有助于解决隐私风险。最后但并非最不重要的是,部署这些庞大模型需要大量的计算资源,导致显著的延迟和计算问题。这可能会延迟许多应用所需的实时互动性,表明效率改进至关重要。解决方案涉及将模型精简为更小的形式因子、优化推理引擎以及专用人工智能硬件加速器。展望未来,生成式人工智能系统有望变得更加强大和多样化。让我们拭目以待!

可能的未来能力

目前非常大型模型的训练计算翻倍时间约为 8 个月,超过了摩尔定律(晶体管密度成本每约 18 个月增加一倍)或洛克定律(像 GPU 和 TPU 这样的硬件成本每 4 年减半)等缩放定律。这张图表展示了大型模型训练计算的这一趋势(来源:Epoch,《机器学习中的参数、计算和数据趋势》。在线发表于 epochai.org。检索自:epochai.org/mlinputs/vi…

图 10.3:知名人工智能系统的训练 FLOPs。

图 10.3:知名人工智能系统的训练 FLOPs。

正如第一章讨论的那样,大型系统的参数大小增长速度与训练计算相似,这意味着如果这种增长持续下去,我们可能会看到更大更昂贵的系统。经验推导的缩放定律根据训练预算、数据集大小和参数数量预测了 LLMs 的性能。这可能意味着高度强大的系统将集中在大科技公司手中。

KM 缩放定律,由卡普兰和同事提出,通过对模型性能与不同数据大小、模型大小和训练计算进行经验分析和拟合得出,呈现出幂律关系,表明模型性能与模型大小、数据集大小和训练计算等因素之间存在强烈依赖关系。

Chinchilla 缩放定律,由谷歌 DeepMind 团队开发,涉及对更广泛范围的模型大小和数据大小进行实验,并建议将计算预算最优分配给模型大小和数据大小,这可以通过在约束条件下优化特定损失函数来确定。

然而,未来的进展可能更多地取决于数据效率和模型质量,而不是纯粹的规模大小。尽管庞大的模型抓住了头条,但计算能力和能源限制限制了模型无限增长的可能性。未来将会看到庞大的通用模型与更小、可访问的专业化细分模型共存,这些模型提供更快、更便宜的训练、维护和推理。已经有证据表明,更小的专业化模型可以表现出很高的性能。我们最近看到了像 phi-1(只需教科书,2023 年,Gunasekar 和同事)这样的模型,拥有约 10 亿个参数,尽管规模较小,但在评估基准上取得了高准确度。作者建议,改善数据质量可以显著改变规模定律的形状。更多的工作表明,模型可以大幅缩小,只有轻微的准确度下降(只需一个宽度前馈,Pessoa Pires 等人,2023 年),这支持了模型训练和访问的民主化的论点。此外,转移学习、蒸馏和提示技术等技术可以使更小的模型利用大型基础的能力,而不会复制它们的成本。为了弥补限制,搜索引擎和计算器等工具已经被整合到代理人和多步推理策略、插件和扩展中,这些工具可能越来越多地用于扩展功能。由于不同因素的影响,AI 训练成本正在下降 - 根据 ARK Investment Management LLC 的数据,每年约下降 70%。最近发布的 Mosaic ML 的 AI 训练工具可以将语言模型训练到 GPT-3 级别的性能,成本大约是两年前估计的 460 万美元的十分之一。这将促进实验,但进步将越来越多地来自训练制度、数据质量和新颖的架构,而不仅仅是模型大小。在由资源丰富的大型科技公司主导的军备竞赛之后,负责任、经济的创新可能成为优先考虑的事项。在 3-5 年的时间范围内(2025-2027 年),围绕计算和人才可用性的限制可能会大大缓解,侵蚀中心化的壕沟。具体来说,如果云计算成本如预期般下降,而通过教育和自动化工具使 AI 技能更加普及,自我训练定制的 LLM 可能对许多公司变得可行。这可以更好地满足个性化和数据隐私的需求。然而,一些能力,如上下文学习,根据规模定律是不可预测的,只会在大型模型中出现。进一步推测,即使在更多数据上训练的巨大模型可能会展现出更多的行为和技能,极端扩展最终可能会产生人工通用智能AGI)- 推理能力与甚至超越人类智慧。然而,从神经科学的角度来看,AGI 接管世界的威胁在我们目前的技术阶段似乎被高度夸大(参见 Jaan Aru 等人,通过神经科学的视角探讨人工意识的可行性;2023 年)。

  • 缺乏具体化、嵌入式信息:今天的 LLM 仅仅是在文本数据上进行训练,而不是像人类那样通过丰富的多模态输入来发展对物理世界的常识推理。这种缺乏基础学习对于发展人类水平的智能构成了重大障碍。

  • 与生物大脑不同的架构:像 GPT-4 这样的模型使用的相对简单的堆叠变压器架构缺乏被认为能够使人类具有意识和一般推理能力的复杂的循环和分层结构。

  • 狭窄的能力:现有模型仍然专门针对特定领域(如文本)而设计,在灵活性、因果推理、规划、社交技能和一般问题解决智能方面存在不足。这可能会随着工具使用的增加或模型的根本性变化而改变。

  • 社交能力或意图的最小化:当前的人工智能系统没有固有的动机、社交智能或超出其训练目标的意图。对恶意目标或对统治欲望的担忧似乎是没有根据的。

  • 有限的现实世界知识:尽管摄入了大量数据集,大型模型的事实知识和常识与人类相比仍然非常有限。这阻碍了在现实世界中的适用性。

  • 数据驱动的局限性:依赖于训练数据中的模式识别,而不是结构化知识,使得可靠地推广到新情况变得困难。

鉴于这些论点,今天的人工智能迅速演变为恶意超级智能的风险似乎是极不可能的。尽管如此,随着能力的不断提升,深思熟虑地处理长期安全研究和伦理问题仍然是明智的。但是,根据神经科学或当前模型能力的证据,对即将到来的世界占领的恐惧并没有实质性的支持。因此,对必然、即将到来的人工通用智能的断言缺乏严格的支持。然而,快速的进步速度引发了对人类过时和工作岗位流失的担忧,这可能进一步分化经济阶层。与过去的物理自动化不同,生成式人工智能威胁到以前被认为不会被自动化取代的认知工作类别。以道德和公平的方式管理这种工作力量的过渡将需要远见和规划。关于人工智能是否应该创作反映人类状况的艺术、文学或音乐也存在哲学上的争论。让我们更广泛地思考社会影响吧!

社会影响

高度能力的生成式人工智能的出现可能会在未来几年改变社会的许多方面。随着生成模型的不断发展并为企业和创意项目增加价值,生成式人工智能将塑造技术和人类互动在各个领域的未来。尽管它们的广泛采用为企业和个人带来了许多好处和机会,但关键是要解决由于在各个领域对 AI 模型的依赖增加而引起的伦理和社会问题。如果慎重部署,生成式人工智能在个人、社会和工业领域都具有巨大的潜在好处。在个人层面,这些模型可以增强创造力和生产力,并增加对医疗保健、教育和金融等服务的可访问性。通过民主化获取知识资源,它们可以帮助学生学习或帮助专业人士通过综合专业知识做出决策。作为虚拟助手,它们提供即时、定制的信息以便于完成日常任务。通过自动化机械性任务,它们可能释放出人类时间用于更有价值的工作,从而提高经济产出。在经济上,生产率的增长很可能会导致某些工作类别的巨大变革。新的行业和工作可能会出现以支持 AI 系统。慎重考虑和解决这些变化是至关重要的。随着模型变得更好,运行它们变得更便宜,这可能会引发生成式人工智能和 LLM 应用到新领域的大规模扩展。除了硬件成本的降低外,根据赖特定律,随着每累积生产的 AI 系统翻倍,成本可能会降低 10-30%。这种成本曲线反映了代码、工具和技术的重复使用等效率。随着成本的降低扩大采用,进一步降低成本的循环将产生良性循环。这将导致更多效率驱动更多使用,进而驱动更多效率的反馈循环。

赖特定律,也被称为经验曲线效应,是经济学和商业领域的一个观察,它指出对于许多产品,每当累积生产翻倍时,成本都会按固定百分比下降。具体来说,它指出每当生产累积翻倍时,成本往往会按固定百分比(通常在 10-30%之间)下降。

该定律以西奥多·保罗·赖特(Theodore Paul Wright)的名字命名,他是一位美国飞机工程师,1936 年首次观察到这一现象,当时他分析了飞机生产成本的趋势。赖特注意到,每当飞机机身的累积生产翻倍时,生产所需的劳动力就会减少 10-15%。

这种关系可以用数学方式表达为:

其中C[1]代表生产第一单位的成本,C[x]代表生产第 x 单位的成本,b 是进步比率,据估计在许多行业中介于 0.75 至 0.9 之间。

Wright 定律背后的逻辑是随着生产量的增加,工人通过实践、标准化工作流程以及开发更好的工具和流程,在制造产品方面变得更加高效。公司还会找到优化供应链、物流和资源利用的方法,以降低成本。

在工业领域,这些模型为增强人类能力和重塑工作流程带来了广泛的机会。在内容生产方面,生成式人工智能可以比人类更快地起草营销活动或新闻报道的初始版本,从而实现更大的创造力和定制化。对于开发人员,自动生成的代码和快速迭代加速了软件构建。研究人员可以快速从论文中综合发现以推动科学进步。生成式人工智能还为消费者提供了规模化的新个性化水平。推荐可以量身定制到个人。跨领域和地理区域的营销可以定制。总的来说,这些模型可以提高从工业设计到供应链等各个领域的生产率。至于技术的传播,存在两种主要情景。在第一种情景中,每家公司或个人使用其专有数据训练自己定制的模型。然而,这需要相当多的人工智能/机器学习专业知识来正确开发、训练和部署这些系统 - 目前这种人才仍然稀缺且昂贵。计算成本也非常高,专门的硬件如 GPU 集群的成本巨大,只有大型实体才能承担。当模型基于敏感信息进行训练时,还存在数据隐私合规方面的风险。如果能够克服围绕专业知识、计算需求和数据隐私的障碍,针对组织特定目标和数据进行微调的个性化 LLMs 可以通过自动化例行任务和提供定制的见解显著提高其生产力和效率。然而,一个缺点是基于小型私有数据集训练的模型可能缺乏那些基于更大、更多样化的公共语料库训练的模型的泛化能力。集中化和自助式模型可以共存,为不同的用例提供服务。在短期内,大型科技公司在提供行业特定的微调服务方面具有优势。但随着时间的推移,更多的内部培训可能会出现,受定制化和隐私需求驱动。在降低成本、传播专业知识和解决稳健性挑战方面的进展速度将决定任何集中化优势持续存在的时间。在这些领域的快速创新有利于消除壕沟,但围绕主导框架、数据集和模型的平台效应可能使当前领导者继续集中。如果出现简化和自动化人工智能开发的强大工具,定制的生成模型甚至可能适用于地方政府、社区团体和个人解决超局部挑战。尽管目前大型科技公司受益于规模经济,但来自较小实体的分布式创新可能会释放生成式人工智能在社会各个领域的全部潜力。最后,生成式人工智能的出现与我们如何生产和消费创意作品的更广泛转变相交汇。互联网已经培育了一个混搭文化,其中衍生作品和协作内容创作司空见惯。当人工智能���型通过重新组合现有材料生成新的作品时,它们符合混搭文化的迭代、集体生产原则。然而,生成模型可以合成和重新利用受版权保护内容的规模引发了复杂的法律问题。随着模型在大量书籍、文章、图片等数据集上进行训练,归因权和版税可能变得极其复杂。目前的检测机制无法以高于偶然水平的准确率找到由生成式人工智能创作的内容。这反映了围绕作者身份和版权法的更广泛辩论。让我们看看生成模型将在哪些方面产生深远的近期影响,从创意努力开始。

创意产业和广告

游戏和娱乐行业正在利用生成式人工智能来打造独特沉浸式的用户体验。通过自动化创意任务,可以实现主要效率提升,增加在线休闲时间。生成式人工智能可以使机器通过学习模式和示例生成新的原创内容,如艺术、音乐和文学。这对创意产业有着重要影响,因为它可以增强创意过程,潜在地创造新的收入来源。它还为媒体、电影和广告开启了新的个性化、动态内容创作规模。然而,在完全部署之前,生成内容需要围绕准确性和消除偏见进行广泛的质量控制。对于媒体、电影和广告,人工智能开启了新的个性化、动态内容创作规模。在新闻业中,利用大规模数据集自动生成文章可以释放记者,让他们专注于更复杂的调查报道。AI 生成内容AIGC)在转变媒体制作和传递方面发挥着越来越重要的作用,提高了效率和多样性。在新闻业中,文本生成工具自动化了传统由人类记者完成的写作任务,显著提高了生产率,同时保持及时性。像美联社这样的媒体机构每年利用 AIGC 生成数千篇报道。像洛杉矶时报的 Quakebot 这样的机器记者可以迅速撰写有关突发新闻的文章。其他应用包括彭博新闻的 Butletin 服务,其中聊天机器人创建个性化的一句新闻摘要。AIGC 还可以实现 AI 新闻主播,通过模仿人类外观和从文本输入中产生的语音与真实主播一起共同主持广播。中国新闻机构新华社的虚拟主持人辛小薇就是一个例子,以不同角度呈现广播,产生沉浸式效果。AIGC 正在从剧本创作到后期制作改变电影创作。AI 剧本创作工具分析数据以生成优化的剧本。视觉效果团队将 AI 增强的数字环境和去老化技术与实景影像融合,产生沉浸式视觉效果。深度伪造技术可以逼真地重现或复活角色。AI 还可以实现自动生成字幕,甚至通过在广泛音频样本上训练模型来预测无声电影中的对话。这通过字幕扩大了可访问性,并重新创建与场景同步的配音。在后期制作中,AI 调色和编辑工具如 Colourlab.Ai 和 Descript 使用算法简化了诸如颜色校正之类的流程。在广告领域,AIGC 开启了有效、定制广告创意和个性化的新潜力。AI 生成内容使广告商能够以规模化的方式创建个性化、引人入胜的广告,针对个别消费者。像创意广告系统(CAS)和个性化广告文案智能生成系统(SGS-PAC)这样的平台利用数据自动生成针对特定用户需求和兴趣的广告信息。AI 还协助广���创意和设计——像 Vinci 这样的工具可以根据产品图像和口号生成定制的吸引人海报,而像 Brandmark.io 这样的公司则根据用户偏好生成标志变体。GAN 技术自动化产品清单生成,为有效的点对点营销提供关键词。合成广告制作也在兴起,实现高度个性化、可扩展的广告活动,节省时间。在音乐领域,像谷歌的 Magenta、IBM 的 Watson Beat 或索尼 CSL 的 Flow Machine 可以生成原创旋律和作曲。AIVA 同样可以根据用户调整的参数创建独特的作品。LANDR 的 AI 母带使用机器学习处理和改善音频质量,为音乐人提供帮助。在视觉艺术领域,MidJourney 使用神经网络生成启发性图像,可以启动绘画项目。艺术家们已经利用其输出创作了获奖作品。DeepDream 的算法在图像上施加模式,创造出迷幻艺术。GAN 可以生成符合所需风格的抽象画作。AI 绘画修复分析艺术品以数字修复损坏并恢复作品。动画工具如 Adobe 的 Character Animator 或 Anthropic 的 Claude 可以帮助生成定制角色、场景和动作序列,为非专业人士打开动画潜力。ControlNet 添加约束以引导扩散模型,增加输出的变化性。对于所有这些应用,先进的人工智能通过生成内容和数据驱动的见解扩展了创意可能性。然而,值得注意的是,生成内容在完全部署之前需要围绕准确性和消除偏见进行广泛的质量控制。对于广告业,消费者数据的道德使用和人类监督仍然很重要。在所有情况下,正确归因于人类艺术家、开发人员和训练数据的贡献仍然是一个持续的挑战,因为采用范围不断扩大。

经济

部署生成式人工智能和其他技术可以帮助加快生产力增长,部分弥补就业增长下降并促进整体经济增长。假设能源和计算能够可持续扩展,将生成式人工智能整合到业务流程中所带来的巨大生产力增益似乎可能在未来十年内推动许多任务的自动化。然而,这种转变可能会扰乱劳动力市场,需要进行调整。麦肯锡公司的研究估计,到 2030-2060 年,当前工作活动的 30-50%可能会被自动化。生成式人工智能到 2030 年每年可能会为全球生产力增长 6-8 万亿美元,为人工智能经济影响的先前估计增加 15-40%。根据 Tyna Eloundou 及其同事的研究(GPTs are GPTs: An Early Look at the Labor Market Impact Potential of Large Language Models, 2023),大约 80%的美国工人的工作任务至少有 10%受到大型语言模型的影响,而 19%可能有超过 50%的任务受到影响。影响涵盖所有工资水平,高薪工作面临更多风险。仅有 15%的美国工人任务可以通过大型语言模型显著加快完成。但是,通过大型语言模型驱动的软件,这一比例增加到所有任务的 47-56%,显示了辅助技术的巨大影响。从地理角度来看,生成式人工智能的外部私人投资主要来自科技巨头和风险投资公司,主要集中在北美,反映了该大陆目前在整体人工智能投资领域的主导地位。总部位于美国的生成式人工智能相关公司在 2020 年至 2022 年期间筹集了约 80 亿美元,占该期间此类公司总投资的 75%。自动化采用在发达经济体中可能会更快,因为较高的工资将使其更早地在经济上可行。工作自动化的规模并不直接等同于失业。与其他技术一样,生成式人工智能通常使职业中的个别活动自动化,而不是整个职业。然而,组织可能会决定通过减少某些工作类别的就业来实现增加生产力的好处。在过去 30 年中,生产力增长一直是 GDP 增长的主要引擎,但在过去十年中放缓。部署生成式人工智能和其他技术可以帮助加快生产力增长,部分弥补就业增长下降并促进整体经济增长。根据麦肯锡公司分析师的估计,从 2023 年到 2040 年,个别工作活动的自动化可能会为全球经济每年提供 0.2 至 3.3%的生产力提升,取决于自动化采用率,然而,前提是受到技术影响的个人能够转移到其他工作活动,至少与他们 2022 年的生产力水平相匹配。

教育

一个潜在的近期未来场景是,个性化人工智能导师和导师的崛起可能使得对齐人工智能驱动经济的高需求技能的教育变得民主化。在教育领域,生成式人工智能已经在改变我们的教学和学习方式。像 ChatGPT 这样的工具可以用来自动生成个性化课程和定制内容给个别学生。这通过自动化重复的教学任务大大减轻了教师的工作量。人工智能导师可以对学生的写作作业提供实时反馈,让教师有更多时间专注于更复杂的技能。由生成式人工智能驱动的虚拟模拟也可以创造引人入胜、量身定制的学习体验,适应不同学习者的需求和兴趣。然而,随着这些技术的发展,需要进一步研究围绕着持续存在偏见和传播错误信息的风险。知识的加速增长和科学发现的过时意味着培养孩子们的好奇心驱动学习应该专注于发展启动和维持好奇心所涉及的认知机制,比如意识到知识空白和使用适当策略来解决它们。虽然为每个学生量身定制的人工智能导师可能会增强结果和参与度,但贫困学校可能会被落下,加剧不平等。政府应该促进平等获取,以防止生成式人工智能成为富裕阶层的特权。民主化机会对所有学生仍然至关重要。如果经过深思熟虑实施,个性化人工智能驱动的教育可以使任何有学习动力的人获得关键技能。交互式人工智能助手可以根据学生的优势、需求和兴趣调整课程,使学习高效、引人入胜和公平。但是,需要解决关于获取、偏见和社会化的挑战。

工作

假设能源和计算能够可持续扩展,将生成 AI 整合到业务流程中带来的巨大生产力增益似乎可能在未来十年内推动许多任务的自动化。这种转变可能会扰乱劳动力市场,需要进行调整。由 AI 实现的自动化可能会在短期内取代许多行政、客户服务、写作、法律和创意工作,而农业和建筑行业的专业可能几乎不受影响。然而,过去的工业革命最终导致了新类型的工作和产业,尽管劳动力转变困难。相同的动态可能会在长期内随着 AI 自动化发生变化。这将在某种程度上影响几乎所有职业,尽管有些受影响更严重。生成 AI 分析和生成自然语言内容的能力可能会显著增加像沟通、协作和报告等许多白领职业的自动化潜力。然而,整个工作被消除的程度仍然不确定。过去的技术创新最终创造了新类型的工作,即使转变困难。根据麦肯锡公司的研究,生成 AI 用例可能提供的价值约 75%分布在四个领域:客户运营、市场营销和销售、软件工程和研发。突出的例子包括生成 AI 支持与客户互动、为市场营销生成创意内容以及根据自然语言提示起草计算机代码,以及许多其他任务。语言模型和生成 AI 具有颠覆和自动化传统由人类执行的各行业任务的潜力。至于不同的角色,这些预测似乎可信:

  • 初级软件工程师可能会被 AI 编码助手增强或取代。

  • 分析师和顾问利用 AI 数据洞察。客户服务代理被对话 AI 取代。

  • 技术撰稿人和记者受益于 AI 内容生成。

  • 教师利用 AI 进行课程准备和个性化辅导。

  • 法律助理利用 AI 进行摘要和文件审查。

  • 图形设计师将受益于 AI 图像生成,然而,使图像创建和处理对更多人可用也可能对工资产生影响。

  • 然而,对于开发专门的 AI 解决方案和系统的高级软件工程师的需求将保持强劲。

  • 数据科学家可能会从构建预测模型转向更多地专注于验证、调试和从 AI 系统中最大化价值。

  • 程序员将越来越多地编写工具来辅助 AI 开发。

  • 新角色如提示工程师已经开始出现。

人工智能可以执行一些任务,涵盖自然语言处理、内容创作,甚至复杂的创意工作,效率高,错误少于人类。技能较低的人可能能够执行更高技能的工作,而技能较高的人可能会面临较少的工作机会。例如,法律助理使用模板文件并填写必要信息以满足客户需求。拥有广泛法律文件、法规、大学课程、期刊、新闻文章和法院案例知识的人工智能,可以比法律助理做得更好。结果可能是对初级律师起草工作需求的潜在减少,法律助理使用人工智能软件来传达客户特定需求。软件开发人员和数据科学家都可以从 LLMs 的潜力中受益,但必须仔细考虑其能力和限制以实现最佳利用。对于初级开发人员和数据科学家,LLMs 可以自动化例行任务,提供基本解决方案,减少错误,通过释放更多时间进行更复杂的工作来加速学习。然而,仅依赖人工智能可能会阻碍更深入的技术增长,因此 LLMs 应被视为支持性工具,同时积极开发实践经验。高级开发人员和数据科学家拥有超出当前人工智能能力的领域知识和解决问题能力。虽然自动化标准解决方案可能节省一些时间,但他们的专业知识对于指导人工智能工具、确保可靠和可扩展的结果至关重要。人工智能生产力的激增意味着公司急需人工智能人才,对于招聘和留住这些人才的竞争激烈。还将需要更多能够保护人工智能系统免受攻击的网络安全专业人员。此外,随着人工智能系统变得更加普及,可能会在人工智能伦理、监管和公共政策等领域出现更多工作。因此,吸引和培养这类人才对于公司在这个快速发展的领域保持相关性至关重要。所有领域的创作者都将受到影响。在音乐领域,人工智能正在帮助音乐人完成整个创作过程,从创作歌词和旋律到数字化母带处理和增强音频。生成艺术工具允许视觉艺术家尝试定制绘画,以迎合其独特风格。2023 年 3 月高盛的一项研究表明,行政和法律角色最容易受到影响。他们估计约三分之二的当前工作岗位将面临人工智能自动化,得出结论称生成人工智能工具可能会影响全球 3 亿全职工作岗位,占当前劳动力的 20%以上。采用速度是一个关键未知因素。麦肯锡分析师估计,自动化可能吸收员工工作时间的 60%至 70%,因此在 2030 年至 2060 年间,大约有一半的今天的工作活动可能会被自动化。根据普华永道的数据,到 2030 年代中期,高达 30%的工作可能是可自动化的。但现实世界的采用取决于许多难以预测的因素,如监管、社会接受和再培训政策。软件和应用开发等知识工作领域已经看到了这种转变的影响。生成人工智能已被用于简化从初始代码生成到图像编辑和设计的任务。它减少了开发人员和设计师的重复手动工作,使他们能够将精力集中在更有价值的创新上。然而,对自动生成输出中的错误进行细致监控和迭代更正仍然至关重要。大规模自动化工作活动可能导致劳动力需求的重大转变,从而导致职业发生重大变化,迫使员工获得新技能。由于它们的能力基本上是为了执行认知任务而设计的,生成人工智能可能会对知识工作产生最大影响,特别是涉及决策和协作的活动,这些活动以前的自动化潜力最低。以前,自动化的影响主要集中在中低收入五分位数,此外,生成人工智能可能会对高薪工作的活动产生最大影响。大量工人将需要在现有职业或新职业中进行实质性的工作变革。他们还需要支持来进行过渡到新活动。管理这种变革将需要政策远见,以最小化对被解雇工人的困难,通过再培训计划、创造就业激励措施和可转移的福利。如果能够很好地重新投资人工智能自动化带来的效率收益,长期内可能会创造新的产业和就业机会。但顺利的劳动力转变将需要政策远见和员工培训。总之,虽然在短期内可能会有一些工作被人工智能取代,特别是例行认知任务,但它可能会自动化某些活动,而不是消灭整个职业。数据科学家和程序员等技术专家将继续是开发人工智能工具和实现其完整商业潜力的关键。

法律

生成模型如 LLMs 可以自动化例行法律任务,如合同审查、文件生成和简要准备。它们还可以加快全面的法律研究和分析。其他应用包括用通俗语言解释复杂的法律概念,以及利用案例数据预测诉讼结果。然而,考虑到透明度、公平性和问责制等因素,负责任和道德的使用仍然至关重要。总体而言,正确实施的人工智能工具有望提高法律生产力和司法准入,同时需要持续审查可靠性和伦理问题。

制造业

在汽车行业,它们被用于生成用于模拟的 3D 环境,并帮助汽车的开发。此外,生成式人工智能被用于使用合成数据对自动驾驶车辆进行道路测试。这些模型还可以处理物体信息以理解周围环境,通过对话了解人类意图,生成对人类输入的自然语言响应,并制定操纵计划以协助人类完成各种任务。

医学

一个能够准确预测基因序列中的物理特性的模型将是医学上的重大突破,并可能对社会产生深远影响。它还可以进一步加速药物发现和精准医学,实现更早的疾病预测和预防,提供对复杂疾病的更深入理解,并改善基因治疗。然而,这也引发了围绕基因工程的重大伦理关切,并可能加剧社会不平等。神经网络已经被用于降低长读 DNA 测序错误率(Baid 等人;DeepConsensus 改进了具有间隙感知序列变换器的序列的准确性,2022 年 9 月),根据 ARK 投资管理公司的报告(2023 年),在短期内,这样的技术已经可以以不到 1000 美元的价格交付第一个高质量的完整长读基因组。这意味着大规模的基因到表达模型也可能不会太远。

军事

全球各军事力量正在投资研究开发致命的自主武器系统(LAWS)。机器人和无人机可以在没有任何人类监督的情况下识别目标并部署致命力量。机器可以比人类更快地处理信息并做出反应,从致命决策中消除情感。然而,这引发了重大的道德问题。让机器决定是否应该夺取生命越过了一个令人不安的界限。即使使用了复杂的人工智能,战争中的比例和平民与战斗人员之间的区别等复杂因素仍需要人类判断。如果部署,完全自主的致命武器将代表放弃对生死决策的控制迈出令人震惊的一步。它们可能违反国际人道主义法,或被专制政权用来恐吓人口。一旦完全独立释放,自主杀手机器人的行动将无法预测或约束。

虚假信息和网络安全

人工智能对抗虚假信息具有双刃剑的作用。虽然它能够实现可扩展的检测,但自动化使得传播复杂、个性化的宣传更加容易。人工智能的使用可能有助于或有害于安全,取决于是否负责任地使用。它增加了对使用生成式黑客和社会工程技术进行网络攻击的虚假信息的脆弱性。与微目标定位和深度伪造等人工智能技术相关的重大威胁。强大的人工智能可以在心理上对用户进行个性化分析,传递便于隐蔽操纵、避免广泛审查的虚假信息。大数据和人工智能可以被利用来利用心理漏洞,渗透在线论坛,攻击和传播阴谋论。虚假信息已经转变为一个多方面的现象,涉及偏见信息、操纵、宣传以及意图影响政治行为。例如,在 COVID-19 大流行期间,虚假信息和信息疫情的传播一直是一个重大挑战。人工智能有潜力影响公众对选举、战争或外国势力等主题的观点。它还可以生成虚假的音频/视频内容来损害声誉并制造混乱。国家和非国家行为者正在武器化这些能力进行宣传,损害声誉并制造混乱。政党、政府、犯罪团伙甚至法律系统都可以利用人工智能发起诉讼并获取金钱。这可能会在各个领域产生深远的影响。大部分互联网用户可能正在获取所需信息而无需访问外部网站。大型企业成为信息的守门人并控制公众舆论的危险,实际上能够限制某些行动或观点。谨慎的治理和数字素养对于建立抵抗力至关重要。虽然没有单一的解决方案,但促进负责任的人工智能发展的集体努力可以帮助民主社会应对新兴威胁。

实施挑战

负责任地实现生成式人工智能的潜力涉及解决许多实际的法律、伦理和监管问题:

  • 法律:关于人工智能生成内容,版权法仍存在模糊不清的问题。谁拥有产出物 - 模型创建者、训练数据贡献者还是最终用户?在训练中复制受版权保护的数据也引发了需要澄清的公平使用争议。

  • 数据保护:收集、处理和存储训练高级模型所需的大规模数据集会带来数据隐私和安全风险。确保同意、匿名性和安全访问的治理模型至关重要。

  • 监督和法规:呼吁加强监督,确保先进人工智能系统不歧视、准确和负责任。但是需要灵活的政策来平衡创新和风险,而不是繁琐的官僚主义。

  • 伦理学:引导发展朝着有益结果的框架是不可或缺的。通过专注于透明性、可解释性和人类监督的设计实践来整合伦理有助于建立信任。

总的来说,政策制定者、研究人员和公民社会之间的积极合作对于解决围绕权利、伦理和治理尚未解决的问题至关重要。在制定务实的监管措施的同时,生成模型可以实现其承诺,同时减少伤害。但公众利益必须始终是引导人工智能进步的指南。对算法透明性的需求日益增长。这意味着科技公司和开发者应该揭示其系统的源代码和内部运作方式。然而,这些公司和开发者认为披露专有信息会损害其竞争优势,因此存在抵制。开源模型将继续蓬勃发展,欧盟和其他国家的地方立法将推动人工智能的透明使用。人工智能偏见的后果包括由人工智能系统做出的偏见决策可能对个人或群体造成潜在伤害。将伦理培训纳入计算机科学课程可以帮助减少人工智能代码中的偏见。通过教导开发者如何构建以伦理为设计基础的应用程序,可以最大程度地减少将偏见嵌入代码的可能性。为了走上正确的道路,组织需要优先考虑透明度、问责制和监管措施,以防止其人工智能系统中存在偏见。人工智能偏见预防是许多组织的长期优先事项,然而,如果没有立法推动,引入可能需要时间。例如,欧盟国家的地方立法,如欧洲委员会关于人工智能监管规则的提案,将推动更具伦理性的语言和形象使用。德国目前关于虚假新闻的法律规定,要求平台在 24 小时内删除虚假新闻和仇恨言论,对于大型和小型平台都是不切实际的。此外,较小平台有限的资源使得他们无法监管所有内容变得不切实际。此外,在线平台不应该拥有确定什么是真相的唯一权威,因为这可能导致过度审查。需要更加细致的政策来平衡言论自由、问责制和各种技术平台遵守的可行性。仅依靠私营公司来监管在线内容引发了对监督和正当程序不足的担忧。政府、公民社会、学术界和行业之间更广泛的合作可以制定更有效的框架来对抗错误信息,同时保护权利。

未来之路

未来的生成式人工智能模型时代提供了大量引人入胜的机遇和无与伦比的进展,然而其中夹杂着许多不确定性。正如本书所讨论的,近年来取得了许多突破,但连续的挑战仍然存在,主要涉及这些模型的精度、理性能力、可控性以及根深蒂固的偏见。虽然有人对即将到来的超智能人工智能的宏伟声明可能显得言过其实,但持续的趋势预示着在未来几十年内将出现复杂的能力。在个人层面上,生成内容的泛滥引发了关于误导、学术抄袭以及在线空间中的冒名顶替的合理担忧。随着这些模型在模仿人类表达方面变得更加娴熟,人们可能难以分辨是人类生成还是人工智能生成的内容,从而为新形式的欺骗创造了可能性。人们还担心生成模型加剧社交媒体成瘾,因为它们能够生成无穷无尽的定制内容。从社会角度来看,快速发展的速度引发了人类过时和工作岗位流失的不安,这可能进一步分化经济阶层。与过去的物理自动化不同,生成式人工智能威胁到以前被认为不会受到自动化影响的认知工作类别。以道德和公平的方式管理这种工作力量的转变将需要远见和规划。围绕 AI 是否应该创作反映人类状况的艺术、文学或音乐也存在着哲学上的争论。对于企业来说,尚未建立有效的治理框架来规范可接受的用例。生成模型放大了滥用的风险,从制造深度伪造等误导性信息到生成不安全的医疗建议。内容许可和知识产权方面出现了法律问题。虽然这些模型可以提高业务生产力,但质量控制和偏见缓解会增加额外成本。尽管大型科技公司目前主导着生成式人工智能的研究和开发,但较小的实体最终可能从这些技术中获益最多。随着计算、数据存储和人工智能人才成本的降低,为中小型公司进行定制预训练专业模型可能变得可行。与依赖大型科技公司的通用模型不同,针对特定数据集进行细化调整的生成式人工智能���能更好地满足独特需求。初创公司和非营利组织通常擅长快速迭代,为专业领域构建尖端解决方案。通过成本降低实现的民主化访问可能使这些专注的参与者能够训练性能模型,超越通用系统的能力。随着生成式人工智能工具相对容易地构建,关于模型和工具的定制化将促进价值创造,但尚不清楚谁将获得最大的好处。尽管当前市场炒作很高,但投资者在 2021 年人工智能繁荣/衰退周期之后对较低的估值和怀疑进行了调整。长期市场影响和获胜的生成式人工智能商业模式尚未揭晓。

2021 年人工智能繁荣/衰退周期指的是人工智能初创公司领域投资和增长的快速加速,随后在 2022 年市场降温和稳定,因为预期未能实现,估值下降。

以下是一个快速摘要:

繁荣阶段(2020-2021 年):

对于提供创新能力的人工智能初创公司,如计算机视觉、自然语言处理、机器人技术和机器学习平台,市场出现了巨大的兴趣和投资热潮。根据 Pitchbook 的数据,2021 年全球人工智能初创公司的总融资额达到创纪录的 730 亿美元以上。在这一时期,数百家人工智能初创公司应运而生并获得了资金支持。

破灭阶段(2022 年):

在 2022 年,市场经历了一次修正,人工智能初创公司的估值从 2021 年的高点大幅下跌。一些知名的人工智能初创公司,如 Anthropic 和 Cohere,面临了估值下调。许多投资者对资助人工智能初创公司变得更加谨慎和选择性。更广泛的科技行业市场调整也促成了这一繁荣的结束。

关键因素:

过度炒作、不切实际的增长预期、2021 年历史上高企的估值以及更广泛的经济状况都导致了这一繁荣-衰退周期。这一周期遵循了先前在互联网泡沫和区块链等领域中看到的经典模式。

展望几十年后,也许最深远的挑战是伦理问题。随着人工智能被委托处理更为重要的决策,与人类价值观的一致性变得至关重要。虽然准确性、推理能力、可控性和减少偏见仍然是技术上的重点,但其他重点应包括加强模型的稳健性、促进透明度并确保与人类价值观的一致性。为了最大化利益,公司需要确保人类监督、多样性和开发过程的透明度。政策制定者可能需要实施防止滥用的限制措施,同时为工人提供支持以适应活动的转变。通过负责任的实施,生成式人工智能可以推动社会的增长、创造力和可访问性。及早解决潜在风险并确保公共利益设计的利益公平分配将培养利益相关者的信任,例如:

  • 进步的动态:调整转型的速度对于避免任何不良后果至关重要。此外,过于缓慢的发展可能会扼杀创新,因此通过包容性的公共讨论确定理想的速度是至关重要的。

  • 人工智能与人类的共生:与其追求完全自动化,更有利的系统将整合和补充人类的创造力与人工智能的生产效率。这样的混合模式将确保最佳监督。

  • 促进获取和包容性:对人工智能资源、相关教育和各种机会的平等获取对抵消差距的扩大至关重要。代表性和多样性应该得到优先考虑。

  • 预防措施和风险管理:通过跨学科的洞察力不断评估新兴能力是必要的,以避免未来的危险。然而,过度的担忧不应阻碍潜在的进步。

  • 维护民主规范:合作讨论、共同努力和达成妥协必然比由一个孤立实体强加的单方面法令更有建设性地定义人工智能未来发展方向。公共利益必须优先考虑。

虽然未来的能力仍然不确定,但积极的治理和获取的民主化对于引导这些技术走向公平、善意的结果至关重要。研究人员、政策制定者和公民社会围绕透明度、问责制和伦理问题展开合作,可以帮助将新兴创新与共同的人类价值观对齐。目标应该是赋予人类潜力,而不仅仅是技术进步。