{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 使用 GPT-4o 模型生成结构化输出\n\n本指南演示了如何使用 GPT-4o 模型获取结构化输出。OpenAI beta 客户端 SDK 提供了一个解析助手,允许您使用自己的 Pydantic 模型,从而无需定义 JSON 模式。对于受支持的模型,推荐使用此方法。\n\n目前支持此功能的模型有:\n\n- OpenAI 上的 gpt-4o-mini\n- OpenAI 上的 gpt-4o-2024-08-06\n- Azure 上的 gpt-4o-2024-08-06\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "让我们定义一个简单的消息类型,用于携带数学问题的解释和输出\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from pydantic import BaseModel\n", "\n", "\n", "class MathReasoning(BaseModel):\n", " class Step(BaseModel):\n", " explanation: str\n", " output: str\n", "\n", " steps: list[Step]\n", " final_answer: str" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "# 设置环境变量\n", "os.environ[\"AZURE_OPENAI_ENDPOINT\"] = \"https://YOUR_ENDPOINT_DETAILS.openai.azure.com/\"\n", "os.environ[\"AZURE_OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n", "os.environ[\"AZURE_OPENAI_DEPLOYMENT_NAME\"] = \"gpt-4o-2024-08-06\"\n", "os.environ[\"AZURE_OPENAI_API_VERSION\"] = \"2024-08-01-preview\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import json\n", "import os\n", "from typing import Optional\n", "\n", "from autogen_core.models import UserMessage\n", "from autogen_ext.models.openai import AzureOpenAIChatCompletionClient\n", "\n", "\n", "# 获取环境变量并确保其不为 None 的函数\n", "def get_env_variable(name: str) -> str:\n", " value = os.getenv(name)\n", " if value is None:\n", " raise ValueError(f\"Environment variable {name} is not set\")\n", " return value\n", "\n", "\n", "# 使用经过类型检查的环境变量创建客户端\n", "client = AzureOpenAIChatCompletionClient(\n", " azure_deployment=get_env_variable(\"AZURE_OPENAI_DEPLOYMENT_NAME\"),\n", " model=get_env_variable(\"AZURE_OPENAI_MODEL\"),\n", " api_version=get_env_variable(\"AZURE_OPENAI_API_VERSION\"),\n", " azure_endpoint=get_env_variable(\"AZURE_OPENAI_ENDPOINT\"),\n", " api_key=get_env_variable(\"AZURE_OPENAI_API_KEY\"),\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'steps': [{'explanation': 'Start by aligning the numbers vertically.', 'output': '\\n 16\\n+ 32'}, {'explanation': 'Add the units digits: 6 + 2 = 8.', 'output': '\\n 16\\n+ 32\\n 8'}, {'explanation': 'Add the tens digits: 1 + 3 = 4.', 'output': '\\n 16\\n+ 32\\n 48'}], 'final_answer': '48'}\n" ] }, { "data": { "text/plain": [ "MathReasoning(steps=[Step(explanation='Start by aligning the numbers vertically.', output='\\n 16\\n+ 32'), Step(explanation='Add the units digits: 6 + 2 = 8.', output='\\n 16\\n+ 32\\n 8'), Step(explanation='Add the tens digits: 1 + 3 = 4.', output='\\n 16\\n+ 32\\n 48')], final_answer='48')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 定义用户消息\n", "messages = [\n", " UserMessage(content=\"What is 16 + 32?\", source=\"user\"),\n", "]\n", "\n", "# 在客户端调用create方法,传入消息和额外参数。\n", "# extra_create_args字典包含我们上面定义的MathReasoning模型作为响应格式。\n", "# 提供响应格式和pydantic模型将使用beta SDK中的新parse方法\n", "response = await client.create(messages=messages, extra_create_args={\"response_format\": MathReasoning})\n", "\n", "# 在加载前确保响应内容是有效的JSON字符串\n", "response_content: Optional[str] = response.content if isinstance(response.content, str) else None\n", "if response_content is None:\n", " raise ValueError(\"Response content is not a valid JSON string\")\n", "\n", "# 将响应内容作为JSON加载后打印出来\n", "print(json.loads(response_content))\n", "\n", "# 使用MathReasoning模型验证响应内容\n", "MathReasoning.model_validate(json.loads(response_content))" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.7" } }, "nbformat": 4, "nbformat_minor": 2 }