跳到内容

Parea:用于观察、测试和微调 Instructor

Parea 是一个平台,使团队能够监控、协作、测试和标记 LLM 应用程序。在本博客中,我们将探讨如何使用 Parea 增强 OpenAI 客户端并结合 instructor 来调试和改进 instructor 调用。Parea 具有一些使其对 instructor 特别有用的特性:

  • 它会自动将因重试而产生的任何 LLM 调用归入一个单一的跟踪中
  • 它会自动跟踪在使用 instructor 时发生的任何验证错误计数和字段
  • 它提供了一个 UI,允许用户通过填写表单而不是编辑 JSON 对象来标记 JSON 响应
配置 Parea

在开始本教程之前,请确保您已注册 Parea 账户。您还需要创建一个 API 密钥

示例:使用 Instructor 文档中的 URL 编写电子邮件

我们将演示如何使用 instructor 结合 Parea 来编写只包含 instructor 文档中 URL 的电子邮件。在继续之前,我们需要安装依赖项,只需运行以下命令即可。

pip install -U parea-ai instructor

Parea 的集成非常简单——只需要两行代码,我们就可以完成设置。

import os

import instructor
from dotenv import load_dotenv
from openai import OpenAI
from parea import Parea  # (1)!

load_dotenv()

client = OpenAI()

p = Parea(api_key=os.getenv("PAREA_API_KEY"))  # (2)!
p.wrap_openai_client(client, "instructor")

client = instructor.from_openai(client)
  1. parea 模块导入 Parea
  2. 使用 Parea 与 instructor 的原生集成设置跟踪

在此示例中,我们将探讨如何编写只包含 instructor 文档链接的电子邮件。为此,我们可以定义一个简单的 Pydantic 模型,如下所示。

class Email(BaseModel):
    subject: str
    body: str = Field(
        ...,
        description="Email body, Should contain links to instructor documentation. ",
    )

    @field_validator("body")
    def check_urls(cls, v):
        urls = re.findall(r"https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+", v)
        errors = []
        for url in urls:
            if not url.startswith("https://python.instructor.net.cn"):
                errors.append(
                    f"URL {url} is not from useinstructor.com, Only include URLs that include use instructor.com. "
                )
            response = requests.get(url)
            if response.status_code != 200:
                errors.append(
                    f"URL {url} returned status code {response.status_code}. Only include valid URLs that exist."
                )
            elif "404" in response.text:
                errors.append(
                    f"URL {url} contained '404' in the body. Only include valid URLs that exist."
                )
        if errors:
            raise ValueError("\n".join(errors))
        return

现在我们可以使用上面的 Pydantic 模型来创建一封电子邮件。

email = client.messages.create(
    model="gpt-3.5-turbo",
    max_tokens=1024,
    max_retries=3,
    messages=[  # (1)!
        {
            "role": "user",
            "content": "I'm responding to a student's question. Here is the link to the documentation: {{doc_link1}} and {{doc_link2}}",
        }
    ],
    template_inputs={
        "doc_link1": "https://python.instructor.net.cn/docs/tutorial/tutorial-1",
        "doc_link2": "https://jxnl.github.io/docs/tutorial/tutorial-2",
    },
    response_model=Email,
)
print(email)
  1. Parea 支持在 messages 参数中使用 {{...}} 语法创建模板化提示。我们可以将模板输入作为一个字典传递给 template_inputs 参数。

如果您按照我们所做的操作,Parea 已经包装了客户端,并且我们编写了一封包含 instructor 文档链接的电子邮件。

验证错误跟踪

要查看此执行的跟踪,请查看下面的截图。值得注意的有:

  • 左侧边栏:所有相关的 LLM 调用都分组在一个名为 instructor 的跟踪下
  • 中间部分:根跟踪将 templated_inputs 作为输入,并将创建的 Email 对象作为输出进行可视化
  • 右侧边栏底部:任何验证错误都会被捕获并作为该跟踪的分数进行跟踪,这使得可以在仪表板中可视化它们并在表格中按它们进行过滤

从上面我们可以看到,虽然电子邮件成功创建了,但出现了一个验证错误,这意味着由于最初的验证失败,引入了额外的成本和延迟。下面我们可以看到随着时间推移,我们的 instructor 使用的平均验证错误计数的可视化图表。

标记响应用于微调

有时,您可能希望让主题专家 (SME) 标记响应,以便将其用于微调。Parea 提供了一种通过注释队列来实现此目的的方法。编辑原始 JSON 对象来纠正工具使用和函数调用响应可能容易出错,特别是对于非开发人员。为此,Parea 提供了一个所谓的“表单模式”,允许用户安全地填写表单而不是编辑 JSON 对象。然后可以将标记的数据导出并用于微调。

Form Mode

导出标记数据并进行微调

标记数据后,您可以将其导出为 JSONL 文件

from parea import Parea

p = Parea(api_key=os.getenv("PAREA_API_KEY"))

dataset = p.get_collection(DATASET_ID)  # (1)!
dataset.write_to_finetune_jsonl("finetune.jsonl")  # (2)!
  1. 将 DATASET_ID 替换为实际的数据集 ID
  2. 将数据集写入 JSONL 文件

现在我们可以使用 instructor 来微调模型

instructor jobs create-from-file finetune.jsonl