使用 W&B Weave 进行 OpenAI API 监控
注意: 运行此 Colab 需要 OpenAI API 密钥。
使用 W&B OpenAI 集成来监控 OpenAI API 调用,并了解您的项目和团队如何利用 LLM。 在此示例中,我们将生成模板化的 Weave Boards:LLM 使用情况监控仪表板,您可以从 UI 中进行探索和自定义。
- 自动跟踪 LLM 使用情况,并聚合有用的指标,如成本、延迟和跨项目/团队的吞吐量
- 动态查询并从所有 OpenAI API 调用的日志中提取见解
- 在视觉上进行迭代,以切片、聚合和探索数据;自定义面板以关注有趣的模式;通过交互式仪表板更轻松地与团队共享进度
刚开始使用 Weights & Biases?-> 在此处注册一个帐户 <-
第 0 步:设置
安装依赖项,登录 W&B 以便您可以保存和共享您的工作,并进行 OpenAI 身份验证。
# 如果尚未安装
!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
# 使用 OpenAI 进行身份验证
from getpass import getpass
if os.getenv("OPENAI_API_KEY") is None:
os.environ["OPENAI_API_KEY"] = getpass("粘贴您的 OpenAI 密钥,网址为:https://platform.openai.com/account/api-keys\n")
assert os.getenv("OPENAI_API_KEY", "").startswith("sk-"), "这看起来不像一个有效的 OpenAI API 密钥"
print("OpenAI API 密钥已配置")
第 1 步:在 W&B 中配置数据流和存储
将 WB_ENTITY 设置为您的 wandb 用户名或团队名称。登录 W&B 并导航到 wandb.ai/home 上的主页,以在左侧边栏中查看您的“个人资料”和“团队”下的有效选项。
WB_ENTITY = "" # 设置为您的 wandb 用户名或团队名称
WB_PROJECT = "weave" # 此工作的顶级目录
STREAM_NAME = "openai_logs" # 存储 OpenAI API 调用日志的记录表,在它们流式传输时进行记录
第 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}")
# 为简化起见,指定单个模型
OPENAI_MODEL = 'gpt-3.5-turbo'
# 预填充一些示例日志
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 Monitor Board”为该数据流创建一个 Weave Board。
第 4 步:探索和理解您的 LLM 使用情况
要保存您的工作,请通过单击页面顶部自动生成的名称来重命名该 Board。要共享您的 Board,请单击右上角的“Publish”。
要实时可视化您的工作并进行迭代,您可以:
- 在单独的选项卡中保持 Board 打开状态,并刷新以查看最新数据
- 随时重命名 Board 以便参考,并“Publish”该版本以与他人共享链接
- 通过从 weave.wandb.ai 导航到相关的 W&B 实体和 W&B 项目名称来查找以前保存的 Boards
- 或者打开一个 Board 模板的新实例,以累积至今的所有数据开始
接下来,我们将说明几种跟踪 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)},
],
# 您可以向记录的记录添加其他属性
# 有关更多示例,请参阅 monitor_api notebook
monitor_attributes={
'system_prompt': system_prompt,
'prompt_template': prompt_template,
'params': params
})
示例 2:记录消息的连续流
监控消息流并将结果记录为单个记录。注意:此格式不计算 token。
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:构建提示工程实验
在这里,我们比较了系统提示、用户问题和目标受众的几个示例选项。尝试您自己的实验,看看在 Board 中探索和按不同参数分组时是否会出现任何有趣的见解。
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)},
],
# 您可以向记录的记录添加其他属性
# 有关更多示例,请参阅 monitor_api notebook
monitor_attributes={
'system_prompt': system_prompt,
'prompt_template': prompt_template,
'params': params
})
# 随意替换您自己的提示 :)
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)