使用 Weights & Biases Weave 监控 OpenAI API

2023 年 10 月 4 日
在 Github 中打开

Weights & Biases Open In Colab

注意: 你将需要一个 OpenAI API 密钥 来运行此 colab。

使用 W&B OpenAI 集成来监控 OpenAI API 调用,并了解你的项目和团队如何利用 LLM。在此示例中,我们将生成模板化的 Weave Board:LLM 使用情况监控仪表板,你可以从 UI 中探索和自定义这些仪表板。

  • 自动跟踪 LLM 使用情况,并汇总有用的指标,例如跨项目/团队的成本、延迟和吞吐量
  • 动态查询并从所有 OpenAI API 调用的日志中获取见解
  • 以可视化方式迭代以切片、聚合和探索你的数据;自定义面板以关注有趣的模式;通过交互式仪表板更轻松地与你的团队分享进度

体验此 Weave Board 的实时版本 →

Weights & Biases 新手?-> 在此处注册帐户 <-

步骤 0:设置

安装依赖项,登录 W&B 以便你可以保存和分享你的工作,并使用 OpenAI 进行身份验证。

# if not already installed
!pip install -qqq weave openai tiktoken wandb
import wandb
wandb.login()
import weave
import os
WANDB_BASE_URL = "https://api.wandb.ai"
os.environ["WANDB_BASE_URL"] = WANDB_BASE_URL
# authenticate with OpenAI
from getpass import getpass

if os.getenv("OPENAI_API_KEY") is None:
  os.environ["OPENAI_API_KEY"] = getpass("Paste your OpenAI key from: https://platform.openai.com/account/api-keys\n")
assert os.getenv("OPENAI_API_KEY", "").startswith("sk-"), "This doesn't look like a valid OpenAI API key"
print("OpenAI API key configured")
WB_ENTITY = "" # set to your wandb username or team name
WB_PROJECT = "weave" # top-level directory for this work
STREAM_NAME = "openai_logs" # record table which stores the logs of OpenAI API calls as they stream in

步骤 2:调用 init_monitor()

要开始监控 OpenAI API 使用情况,请调用 init_monitor(<stream>),其中 <stream> 的形式为 <wandb_team_or_user>/<wandb_project>/<stream_name>。流记录并存储所有 OpenAI API 调用。

运行此单元格将打印出一个链接,以在 Weave UI 中查看当前项目。

from weave.monitoring import openai, init_monitor
m = init_monitor(f"{WB_ENTITY}/{WB_PROJECT}/{STREAM_NAME}")

# specifying a single model for simplicity
OPENAI_MODEL = 'gpt-3.5-turbo'

# prefill with some sample logs
r = openai.ChatCompletion.create(model=OPENAI_MODEL, messages=[{"role": "user", "content": "hello world!"}])
r = openai.ChatCompletion.create(model=OPENAI_MODEL, messages=[{"role": "user", "content": "what is 2+2?"}])

步骤 3:预览监控仪表板

单击上面的链接以预览数据流,然后单击右侧边栏中的“OpenAI 监控面板”以为此数据流创建 Weave Board。

步骤 4:探索和了解你的 LLM 使用情况

要保存你的工作,请单击页面顶部的自动生成的名称来重命名面板。要分享你的面板,请单击右上角的“发布”。

为了在你迭代时实时可视化你的工作,你可以

  • 在单独的选项卡中保持面板打开并刷新以查看最新数据
  • 随时重命名面板以便于参考,并“发布”该版本以与他人分享链接
  • 通过从 weave.wandb.ai 导航到相关的 W&B 实体和 W&B 项目名称来查找以前保存的面板
  • 或打开面板模板的新实例,以从迄今为止累积的所有数据重新开始

接下来,我们将说明几种你可以跟踪 OpenAI API 调用的方法。根据你的用例,还有更多可能性,我们迫不及待想看看你从这些入门模板中创建出什么。

示例

示例 0:记录提示及其完成

监控 ChatCompletion 请求并打印相应的响应,仅提取完成的文本。

response = openai.ChatCompletion.create(model=OPENAI_MODEL, messages=[
        {"role": "user", "content": f"What is the meaning of life, the universe, and everything?"},
    ])
print(response['choices'][0]['message']['content'])

示例 1:将相关参数作为属性跟踪

分解出感兴趣的参数,并将它们作为已记录记录的属性进行跟踪。这里我们将“系统提示”与“提示模板”和“方程式”参数分开跟踪。这次我们将打印来自 ChatCompletion 调用的完整结构化响应。

system_prompt = "you always write in bullet points"
prompt_template = 'solve the following equation step by step: {equation}'
params = {'equation': '4 * (3 - 1)'}
openai.ChatCompletion.create(model=OPENAI_MODEL,
                             messages=[
                                    {"role": "system", "content": system_prompt},
                                    {"role": "user", "content": prompt_template.format(**params)},
                                ],
                             # you can add additional attributes to the logged record
                             # see the monitor_api notebook for more examples
                             monitor_attributes={
                                 'system_prompt': system_prompt,
                                 'prompt_template': prompt_template,
                                 'params': params
                             })
from weave.monitoring.openai import message_from_stream
r = openai.ChatCompletion.create(model=OPENAI_MODEL, messages=[
        {"role": "system", "content": "You are a robot and only speak in robot, like beep bloop bop."},
        {"role": "user", "content": "Tell me a 50-word story."},
    ], stream=True)
for s in message_from_stream(r):
    print(s, end='')

示例 3:构建提示工程实验

在这里,我们比较了系统提示、用户问题和目标受众的一些玩具选项。尝试你自己的实验,看看当你探索面板并按不同参数分组时,是否会出现任何有趣的见解。

def explain_math(system_prompt, prompt_template, params):
    openai.ChatCompletion.create(model=OPENAI_MODEL,
                             messages=[
                                    {"role": "system", "content": system_prompt},
                                    {"role": "user", "content": prompt_template.format(**params)},
                                ],
                             # you can add additional attributes to the logged record
                             # see the monitor_api notebook for more examples
                             monitor_attributes={
                                 'system_prompt': system_prompt,
                                 'prompt_template': prompt_template,
                                 'params': params
                             })
# feel free to substitute your own prompts :)
system_prompts = ["you're extremely flowery and poetic", "you're very direct and precise", "balance brevity with insight"]
prompt_template = 'explain the solution of the following to a {audience}: {equation}'
equations = ['x^2 + 4x + 9 = 0', '15 * (2 - 6) / 4']
audience = ["new student", "math genius"]

for system_prompt in system_prompts:
    for equation in equations:
        for person in audience:
            params = {"equation" : equation, "audience" : person}
            explain_math(system_prompt, prompt_template, params)