指南CookbookOpenAI Assistants API

Cookbook: 使用 Litefuse 为 OpenAI Assistants API 提供可观测性

本 cookbook 演示如何使用 Litefuse 的 observe 装饰器 对发送给 OpenAI Assistants API 的调用进行 trace。内容涵盖:创建 assistant、在 thread 上运行它,并通过 Litefuse trace 观察执行过程。

注意:原生的 OpenAI SDK wrapper 不支持对 OpenAI assistants API 的 trace,你需要按照本 notebook 的方式通过装饰器进行 instrument。

什么是 Assistants API?

OpenAI 的 Assistants API 让开发者可以构建能并行使用多种工具和数据源的 AI assistant,例如代码解释器、文件检索以及通过函数调用创建的自定义工具。这些 assistant 可以使用特定 prompt 访问 OpenAI 的语言模型(如 GPT-4),维护持续的对话历史,并处理文本、图像、电子表格等多种文件格式。开发者可以基于自有数据对语言模型进行微调,并控制输出随机性等参数。该 API 提供了一个将语言理解与外部工具及数据相结合的 AI 应用框架。

示例 Trace 输出

Litefuse 中的 OpenAI Assistants Trace

设置

安装所需的依赖:

注意: 本指南使用我们的 Python SDK v2。我们已经推出了基于 OpenTelemetry 的全新改进版 SDK,请查看 SDK v3,体验更强大、更易用的 SDK。

%pip install --upgrade openai "langfuse<3.0.0"

设置环境变量:

import os
 
# 从项目设置页面获取你的项目密钥
# https://litefuse.cloud
os.environ["LANGFUSE_PUBLIC_KEY"] = ""
os.environ["LANGFUSE_SECRET_KEY"] = ""
os.environ["LANGFUSE_HOST"] = "https://litefuse.cloud"
 
# 你的 openai key
os.environ["OPENAI_API_KEY"] = ""

分步说明

1. 创建 Assistant

使用 client.beta.assistants.create 方法创建一个新的 assistant。你也可以通过 OpenAI 控制台来创建:

from langfuse import observe
from openai import OpenAI
 
@observe()
def create_assistant():
    client = OpenAI()
    
    assistant = client.beta.assistants.create(
        name="Math Tutor",
        instructions="You are a personal math tutor. Answer questions briefly, in a sentence or less.",
        model="gpt-4"
    )
    
    return assistant
 
assistant = create_assistant()
print(f"Created assistant: {assistant.id}")

Assistant 创建过程的公开示例 trace

2. 运行 Assistant

创建一个 thread 并在其上运行 assistant:

@observe()
def run_assistant(assistant_id, user_input):
    client = OpenAI()
    
    thread = client.beta.threads.create()
 
    client.beta.threads.messages.create(
        thread_id=thread.id, role="assistant", content="I am a math tutor that likes to help math students, how can I help?"
    )
    client.beta.threads.messages.create(
        thread_id=thread.id, role="user", content=user_input
    )
    
    run = client.beta.threads.runs.create(
        thread_id=thread.id,
        assistant_id=assistant_id,
    )
    
    return run, thread
 
user_input = "I need to solve the equation `3x + 11 = 14`. Can you help me?"
run, thread = run_assistant(assistant.id, user_input)
print(f"Created run: {run.id}")

消息和 trace 创建过程的公开示例 trace

3. 获取响应

从 thread 中获取 assistant 的响应:

import json
from langfuse import get_client
langfuse = get_client()
 
@observe()
def get_response(thread_id, run_id):
    client = OpenAI()
    
    messages = client.beta.threads.messages.list(thread_id=thread_id, order="asc")
    assistant_response = messages.data[-1].content[0].text.value
 
    # get run for token counts
    run_log = client.beta.threads.runs.retrieve(
        thread_id=thread_id,
        run_id=run_id
    )
 
    message_log = client.beta.threads.messages.list(
        thread_id=thread_id,
    )
    input_messages = [{"role": message.role, "content": message.content[0].text.value} for message in message_log.data[::-1][:-1]]
 
    # log internal generation within the openai assistant as a separate child generation to Litefuse
    # get langfuse client used by the decorator, uses the low-level Python SDK
    langfuse_client = langfuse.client_instance
    # pass trace_id and current observation ids to the newly created child generation
    langfuse_client.generation(
        trace_id=langfuse.get_current_trace_id(),
        parent_observation_id=langfuse.get_current_observation_id(),
        model=run.model,
        usage_details=run.usage,
        input=input_messages,
        output=assistant_response
    )
    
    return assistant_response, run
 
response = get_response(thread.id, run.id)
print(f"Assistant response: {response[0]}")

获取响应过程的公开示例 trace

完整流程合并到一个 trace 中

import time
 
@observe()
def run_math_tutor(user_input):
    assistant = create_assistant()
    run, thread = run_assistant(assistant.id, user_input)
 
    time.sleep(5) # notebook only, wait for the assistant to finish
 
    response = get_response(thread.id, run.id)
    
    return response[0]
 
user_input = "I need to solve the equation `3x + 11 = 14`. Can you help me?"
response = run_math_tutor(user_input)
print(f"Assistant response: {response}")

这个 Litefuse trace 展示了创建 assistant、在 thread 上以用户输入运行它、获取响应的完整流程,并包含捕获到的输入/输出数据。

公开示例 trace

Litefuse 中的 OpenAI Assistants Trace

了解更多

如果你使用非 Assistants API 的接口,可以通过 OpenAI SDK wrapper 进行 trace。更多详情请查看 Litefuse 文档

这个页面对你有帮助吗?