{ "cells": [ { "cell_type": "markdown", "id": "181574eb-16d2-4bae-bd4c-b583fbc01df3", "metadata": {}, "source": [ "# 使用 API 快速搭建你的第一个 AI 应用\n", "> [HW3:以 AI 搭建自己的應用](https://colab.research.google.com/drive/15jh4v_TBPsTyIBhi0Fz46gEkjvhzGaBR?usp=sharing)中文镜像版\n", "> \n", "> 指导文章:[02. 简单入门:通过 API 与 Gradio 构建 AI 应用](https://github.com/Hoper-J/LLM-Guide-and-Demos/blob/master/Guide/02.%20简单入门:通过%20API%20与%20Gradio%20构建%20AI%20应用.md)\n", "\n", "目标:了解如何通过使用 API 和 Prompt 来构建自己的语言模型应用。\n", "\n", "在线链接:[Colab](https://colab.research.google.com/drive/1xR9BS1sD7htg7gaoEtNSIO7Ir3qC7_ec?usp=sharing)\n", "\n" ] }, { "cell_type": "markdown", "id": "625d15d0-bc47-4c04-8eec-779df027a447", "metadata": {}, "source": [ "# 安装库" ] }, { "cell_type": "code", "execution_count": null, "id": "4392ac0a-4964-4801-bbff-bcf49af8049b", "metadata": { "scrolled": true }, "outputs": [], "source": [ "%pip install openai\n", "%pip install gradio\n", "%pip install numpy" ] }, { "cell_type": "markdown", "id": "4f4f1afe-84b6-4456-97e8-f74bae95bad1", "metadata": {}, "source": [ "# 导入与设置" ] }, { "cell_type": "code", "execution_count": null, "id": "ba854a1c-f84e-4f1d-b0c5-c0674a42dfa7", "metadata": {}, "outputs": [], "source": [ "import os\n", "import json\n", "from typing import List, Dict, Tuple\n", "\n", "import openai\n", "import gradio as gr" ] }, { "cell_type": "code", "execution_count": null, "id": "68af81ab-e1bb-45d1-9393-f171e756146c", "metadata": {}, "outputs": [], "source": [ "# TODO: 设置你的 OPENAI API 密钥,这里假设 DashScope API 被配置在了 OPENAI_API_KEY 环境变量中\n", "OPENAI_API_KEY = \"\"\n", "# 不填写则默认使用环境变量\n", "if not OPENAI_API_KEY:\n", " OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')\n", "\n", "# 初始化 OpenAI 客户端,使用阿里云 DashScope API\n", "client = openai.OpenAI(\n", " api_key=OPENAI_API_KEY,\n", " base_url=\"https://dashscope.aliyuncs.com/compatible-mode/v1\", # 阿里云的 API 地址\n", ")\n", "\n", "# 检查 API 设置是否正确\n", "try:\n", " response = client.chat.completions.create(\n", " model=\"qwen-turbo\", # 使用通义千问-Turbo 大模型,可以替换为 Deepseek 系列:deepseek-v3 / deepseek-r1\n", " messages=[{'role': 'user', 'content': \"测试\"}],\n", " max_tokens=1,\n", " )\n", " print(\"API 设置成功!!\")\n", "except Exception as e:\n", " print(f\"API 可能有问题,请检查:{e}\")" ] }, { "cell_type": "markdown", "id": "60d0e850-70c4-4fae-a79c-5a9dae3200bb", "metadata": {}, "source": [ "## 第1部分:文章摘要(单轮对话应用)\n", "\n", "在此任务中,你需要将你的聊天机器人变为一个**摘要器**。它的工作是当用户输入一篇文章时,能够为用户总结该文章的内容。\n", "\n", "你需要完成以下步骤:\n", "\n", "1. 设计一个用于生成摘要的提示词,并填写在 **prompt_for_summarization** 中。\n", "2. **点击运行按钮**, 这将弹出一个可交互的界面。\n", "3. 你可以找到一篇文章或使用当前的示例文章:《从百草园到三味书屋》,并将其填写在标记为“文章”的输入框中。\n", "4. 点击“发送”按钮生成文章的摘要。(你可以使用“温度”滑块来控制输出的创造性,温度越高,输出越具创造性)。\n", "5. 如果你**想更改提示词**,可以停止单元格,返回到TODO部分进行更改,然后再次运行。\n", "7. 在你获得满意的结果后,点击“导出”按钮保存结果。文件列表中将出现一个名为 **part1.json** 的文件。\n", "\n", "注意:\n", "\n", "- **如果你再次点击“导出”按钮,之前的结果将被覆盖。**\n", "- **即使使用相同的提示词,输出的结果可能仍然不同。**\n", "\n", "------\n", "\n", "在运行此单元格之前,请确保已运行 **安装包** 和 **导入与设置**。\n", "\n", "**记得在进行下一步前停止此单元格。**\n" ] }, { "cell_type": "code", "execution_count": null, "id": "d7fb78cb-43a6-48cf-8d48-832ee7cbd1d3", "metadata": {}, "outputs": [], "source": [ "# TODO: 修改提示词以满足你的摘要需求\n", "PROMPT_FOR_SUMMARIZATION = \"请将以下文章概括成几句话。\"\n", "\n", "def reset():\n", " \"\"\"\n", " 清空对话记录\n", "\n", " 返回:\n", " List: 空的对话记录列表\n", " \"\"\"\n", " return []\n", "\n", "def interact_summarization(prompt, article, temp=1.0):\n", " \"\"\"\n", " 调用模型生成摘要。\n", "\n", " 参数:\n", " prompt (str): 用于摘要的提示词\n", " article (str): 需要摘要的文章内容\n", " temp (float): 模型温度,控制输出创造性(默认 1.0)\n", "\n", " 返回:\n", " List[Tuple[str, str]]: 对话记录,包含输入文本与模型输出\n", " \"\"\"\n", " # 合成请求文本\n", " input_text = f\"{prompt}\\n{article}\"\n", " \n", " response = client.chat.completions.create(\n", " model=\"qwen-turbo\", # 使用通义千问-Turbo大模型\n", " messages=[{'role': 'user', 'content': input_text}],\n", " temperature=temp,\n", " )\n", " return [(input_text, response.choices[0].message.content)]\n", "\n", "def export_summarization(chatbot, article):\n", " \"\"\"\n", " 导出摘要任务的对话记录和文章内容到 JSON 文件。\n", "\n", " 参数:\n", " chatbot (List[Tuple[str, str]]): 模型对话记录\n", " article (str): 文章内容\n", " \"\"\"\n", " target = {\"chatbot\": chatbot, \"article\": article}\n", " with open(\"files/part1.json\", \"w\", encoding=\"utf-8\") as file:\n", " json.dump(target, file, ensure_ascii=False, indent=4)\n", "\n", "# 构建 Gradio UI 界面\n", "with gr.Blocks() as demo:\n", " gr.Markdown(\"# 第1部分:摘要\\n填写任何你喜欢的文章,让聊天机器人为你总结!\")\n", " chatbot = gr.Chatbot(type=\"tuples\")\n", " prompt_textbox = gr.Textbox(label=\"提示词\", value=PROMPT_FOR_SUMMARIZATION, visible=False)\n", " article_textbox = gr.Textbox(label=\"文章\", interactive=True, value=\"填充\")\n", " \n", " with gr.Column():\n", " gr.Markdown(\"# 温度调节\\n温度用于控制聊天机器人的输出,温度越高,响应越具创造性。\")\n", " temperature_slider = gr.Slider(0.0, 1.99, 1.0, step=0.01, label=\"温度\")\n", " \n", " with gr.Row():\n", " send_button = gr.Button(value=\"发送\")\n", " reset_button = gr.Button(value=\"重置\")\n", " \n", " with gr.Column():\n", " gr.Markdown(\"# 保存结果\\n当你对结果满意后,点击导出按钮保存结果。\")\n", " export_button = gr.Button(value=\"导出\")\n", " \n", " # 绑定按钮与回调函数\n", " send_button.click(interact_summarization,\n", " inputs=[prompt_textbox, article_textbox, temperature_slider],\n", " outputs=[chatbot])\n", " reset_button.click(reset, outputs=[chatbot])\n", " export_button.click(export_summarization, inputs=[chatbot, article_textbox])\n", "\n", "# 启动 Gradio 应用\n", "demo.launch(debug=True)" ] }, { "cell_type": "markdown", "id": "5d239804-f4e2-46c8-b31c-83a21d7c0f46", "metadata": {}, "source": [ "### 检查并打印你的结果\n", "\n", "此部分用于检查你的“part1.json”文件是否包含所有正确的上下文,或者用于查看我们提供的示例文件。\n", "\n", "你需要:\n", "\n", "1. 确保文件列表中有你保存的 **part1.json** 文件。\n", "2. 点击运行按钮。它将显示一个**冻结的** Gradio 界面,重现你的摘要结果。\n", "\n", "---\n", "\n", "在运行此单元格之前,请确保已运行 **安装库** 和 **导入与设置**。\n", "\n", "**记得在进行下一步前停止此单元格。**" ] }, { "cell_type": "code", "execution_count": null, "id": "d4a2fde6-aa69-41bc-bd59-27a87330d1fa", "metadata": {}, "outputs": [], "source": [ "# 加载对话记录的 JSON 文件\n", "with open(\"files/part1.json\", \"r\") as f:\n", " context = json.load(f)\n", "\n", "chatbot = context['chatbot'] # 获取对话记录\n", "article = context['article'] # 获取原始文章\n", "summarization = chatbot[0][-1] # 获取摘要结果\n", "\n", "# 构建 Gradio UI 界面\n", "with gr.Blocks() as demo:\n", " gr.Markdown(\"# 第1部分:摘要\\n你可以查看文章和摘要!\")\n", " chatbot = gr.Chatbot(type=\"tuples\", value=context['chatbot']) # 加载对话历史\n", " article_textbox = gr.Textbox(label=\"文章\", interactive=False, value=context['article']) # 显示原始文章\n", "\n", " # 构建展示摘要和原文的部分\n", " with gr.Column():\n", " gr.Markdown(\"# 只是一个检查\")\n", " gr.Textbox(label=\"文章\", value=article, show_copy_button=True) # 显示并允许复制原文\n", " gr.Textbox(label=\"摘要\", value=summarization, show_copy_button=True) # 显示并允许复制摘要\n", "\n", "# 启动 Gradio 应用\n", "demo.launch(debug=True)" ] }, { "cell_type": "markdown", "id": "9ba0c022-60e1-4efa-840e-158e41688ba1", "metadata": {}, "source": [ "## 第2部分:角色扮演(多轮对话应用)\n", "\n", "在此任务中,你需要将聊天机器人设定为**角色扮演模式**。你应该为它指定一个角色,然后通过提示让它进入该角色的状态。\n", "\n", "你需要完成以下步骤:\n", "\n", "1. 想出一个你希望聊天机器人扮演的**角色**,以及一个使聊天机器人进入该角色的提示词。在 **character_for_chatbot** 中填写角色,在 **prompt_for_roleplay** 中填写提示词。\n", "2. **点击运行按钮,界面将弹出一个可交互的界面。**\n", "3. **与聊天机器人进行** 2 轮 **互动**。在标为“输入”的框中输入你想说的话,然后点击“发送”按钮。(你可以使用“温度”滑块来控制输出的创造性。)\n", "4. 如果你**想更改提示词或角色**,可以停止单元格,返回TODO重新设置,然后重新运行单元格。\n", "5. 在你获得满意的结果后,点击“导出”按钮保存结果。文件列表中将出现一个名为 **part2.json** 的文件。\n", "\n", "注意:\n", "\n", "- **如果你再次点击“导出”按钮,之前的结果将被覆盖。**\n", "- **即使使用相同的提示词,输出的结果可能仍然不同。**\n", "\n", "------\n", "\n", "在运行此单元格之前,请确保已运行 **安装包** 和 **导入与设置**。\n", "\n", "**记得在进行下一步前停止此单元格。**\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "54852754-e02b-449d-8805-237ed1cb07fb", "metadata": {}, "outputs": [], "source": [ "# TODO: 修改以下变量以定义角色和角色提示词\n", "CHARACTER_FOR_CHATBOT = \"面试官\" # 机器人扮演的角色,注意,真正起作用的实际是提示词,因为并没有预设 system 角色\n", "PROMPT_FOR_ROLEPLAY = \"我需要你面试我有关AI的知识,仅提出问题\" # 指定角色提示词\n", "\n", "# 清除对话的函数\n", "def reset():\n", " \"\"\"\n", " 清空对话记录。\n", "\n", " 返回:\n", " List: 空的对话记录列表\n", " \"\"\"\n", " return []\n", "\n", "# 调用模型生成对话的函数\n", "def interact_roleplay(chatbot, user_input, temp=1.0):\n", " \"\"\"\n", " 处理角色扮演多轮对话,调用模型生成回复。\n", "\n", " 参数:\n", " chatbot (List[Tuple[str, str]]): 对话历史记录(用户与模型回复)\n", " user_input (str): 当前用户输入\n", " temp (float): 模型温度参数(默认 1.0)\n", "\n", " 返回:\n", " List[Tuple[str, str]]: 更新后的对话记录\n", " \"\"\"\n", " try:\n", " # 构建包含历史对话的消息列表\n", " messages = []\n", " for input_text, response_text in chatbot:\n", " messages.append({'role': 'user', 'content': input_text})\n", " messages.append({'role': 'assistant', 'content': response_text})\n", " \n", " # 添加当前用户输入\n", " messages.append({'role': 'user', 'content': user_input})\n", " \n", " # 调用 API 获取回复\n", " response = client.chat.completions.create(\n", " model=\"qwen-turbo\",\n", " messages=messages,\n", " temperature=temp,\n", " )\n", " chatbot.append((user_input, response.choices[0].message.content))\n", "\n", " except Exception as e:\n", " print(f\"发生错误:{e}\")\n", " chatbot.append((user_input, f\"抱歉,发生了错误:{e}\"))\n", " \n", " return chatbot\n", "\n", "def export_roleplay(chatbot, description):\n", " \"\"\"\n", " 导出角色扮演对话记录及任务描述到 JSON 文件。\n", "\n", " 参数:\n", " chatbot (List[Tuple[str, str]]): 对话记录\n", " description (str): 任务描述\n", " \"\"\"\n", " target = {\"chatbot\": chatbot, \"description\": description}\n", " with open(\"files/part2.json\", \"w\", encoding=\"utf-8\") as file:\n", " json.dump(target, file, ensure_ascii=False, indent=4)\n", "\n", "# 进行第一次对话:设定角色提示\n", "first_dialogue = interact_roleplay([], PROMPT_FOR_ROLEPLAY)\n", "\n", "# 构建 Gradio UI 界面\n", "with gr.Blocks() as demo:\n", " gr.Markdown(\"# 第2部分:角色扮演\\n与聊天机器人进行角色扮演互动!\")\n", " chatbot = gr.Chatbot(type=\"tuples\", value=first_dialogue)\n", " description_textbox = gr.Textbox(label=\"机器人扮演的角色\", interactive=False, value=CHARACTER_FOR_CHATBOT)\n", " input_textbox = gr.Textbox(label=\"输入\", value=\"\")\n", " \n", " with gr.Column():\n", " gr.Markdown(\"# 温度调节\\n温度控制聊天机器人的响应创造性。\")\n", " temperature_slider = gr.Slider(0.0, 1.99, 1.0, step=0.01, label=\"温度\")\n", " \n", " with gr.Row():\n", " send_button = gr.Button(value=\"发送\")\n", " reset_button = gr.Button(value=\"重置\")\n", " \n", " with gr.Column():\n", " gr.Markdown(\"# 保存结果\\n点击导出按钮保存对话记录。\")\n", " export_button = gr.Button(value=\"导出\")\n", " \n", " # 绑定按钮与回调函数\n", " send_button.click(interact_roleplay, inputs=[chatbot, input_textbox, temperature_slider], outputs=[chatbot])\n", " reset_button.click(reset, outputs=[chatbot])\n", " export_button.click(export_roleplay, inputs=[chatbot, description_textbox])\n", " \n", "# 启动 Gradio 应用\n", "demo.launch(debug=True)" ] }, { "cell_type": "markdown", "id": "852dee4b-c026-4afb-be0e-22feaf1953e7", "metadata": {}, "source": [ "### 检查并打印你的结果\n", "\n", "此部分用于检查你的 \"part2.json\" 文件是否包含所有正确的上下文信息,或者用于查看我们提供的示例文件。\n", "\n", "你需要:\n", "\n", "1. 确保文件列表中有你保存的 **part2.json** 文件。\n", "2. 点击运行按钮。它将显示一个**冻结的** Gradio 界面,重现你的摘要结果。\n", "\n", "------\n", "\n", "在运行此单元格之前,请确保已运行 **安装库** 和 **导入与设置**。\n", "\n", "**记得在进行下一步前停止此单元格。**\n" ] }, { "cell_type": "code", "execution_count": null, "id": "41090de2-f1e8-476f-a40f-edac95938772", "metadata": {}, "outputs": [], "source": [ "# 加载对话记录的 JSON 文件\n", "with open(\"files/part2.json\", \"r\") as f:\n", " context = json.load(f)\n", "\n", "# 遍历对话记录并正确存储\n", "chatbot = context['chatbot']\n", "role = context['description'] # 机器人扮演的角色\n", "dialogue = \"\" # 对话的完整记录\n", "for i, (user, bot) in enumerate(chatbot):\n", " if i != 0:\n", " dialogue += f\"用户: {user}\\n\" # 用户输入\n", " dialogue += f\"机器人: {bot}\\n\" # 机器人回复\n", "\n", "# 构建 Gradio UI 界面\n", "with gr.Blocks() as demo:\n", " gr.Markdown(f\"# 第2部分:角色扮演\\n聊天机器人和你玩了一个角色扮演游戏,查看结果吧!\")\n", " chatbot = gr.Chatbot(type=\"tuples\", value=context['chatbot']) # 加载之前的对话记录\n", " description_textbox = gr.Textbox(label=\"机器人扮演的角色\", interactive=False, value=context['description']) # 显示角色\n", " with gr.Column():\n", " gr.Markdown(\"# 只是一个检查\")\n", " gr.Textbox(label=\"角色\", value=role, show_copy_button=True) # 显示并允许复制角色信息\n", " gr.Textbox(label=\"对话\", value=dialogue, show_copy_button=True) # 显示并允许复制完整对话\n", "\n", "# 启动 Gradio 应用\n", "demo.launch(debug=True)" ] }, { "cell_type": "markdown", "id": "197d2ec4-7353-40dd-9683-9ed9bf7122a9", "metadata": {}, "source": [ "## 第3部分:定制化任务(多轮对话应用)\n", "\n", "在本任务中,你需要提示聊天机器人执行某项特定任务。你应该首先设计一个你希望聊天机器人执行的任务,然后为它提供合适的提示词以引导其完成该任务。\n", "\n", "你需要完成以下步骤:\n", "\n", "1. 设计一个任务,并根据任务写一个提示词。将任务描述填写在 **chatbot_task** 中,并将提示词填写在 **prompt_for_task** 中。\n", "2. **点击运行按钮**,与聊天机器人进行互动。在 \"输入\" 框中输入你的内容,然后点击 \"发送\" 按钮。(你可以使用 \"温度\" 滑块来控制输出的创造性。)\n", "3. 如果你**想更改提示词或任务名称**,可以停止单元格,返回TODO重新设置,然后重新运行单元格。\n", "4. 在你获得满意的结果后,点击 \"导出\" 按钮保存结果。文件列表中将出现一个名为 **part3.json** 的文件。\n", "\n", "注意:\n", "\n", "- **如果你再次点击 \"导出\" 按钮,之前的结果将被覆盖。**\n", "- **即使使用相同的提示词,输出的结果可能仍然不同。**\n", "- 实际上,这和第2部分是完全一致的,只是将提前预进行的prompt延后到了用户点击发送的时候,使得更像是一个通用的范例,隐藏了角色扮演的属性,但仅仅是隐藏,本质并没有改变。\n", "\n", "---\n", "\n", "在运行此单元格之前,请确保已运行 **安装包** 和 **导入与设置**。\n" ] }, { "cell_type": "code", "execution_count": null, "id": "28501b1b-2218-47d2-949b-5dd922cd0194", "metadata": {}, "outputs": [], "source": [ "# TODO: 修改以下变量以定义任务描述与任务提示词\n", "CHATBOT_TASK = \"小学数学老师(输入“开始”)\" # 用于告诉用户聊天机器人可以执行的任务\n", "PROMPT_FOR_TASK = \"现在开始,你将扮演一个出小学数学题的老师,当我说开始时提供一个简单的数学题,接收到正确回答后进行下一题,否则给我答案\"\n", "\n", "def reset():\n", " \"\"\"\n", " 清空对话记录。\n", "\n", " 返回:\n", " List: 空的对话记录列表\n", " \"\"\"\n", " return []\n", "\n", "def interact_customize(chatbot, prompt, user_input, temp=1.0):\n", " \"\"\"\n", " 调用模型处理定制化任务对话。\n", "\n", " 参数:\n", " chatbot (List[Tuple[str, str]]): 历史对话记录\n", " prompt (str): 指定任务的提示词\n", " user_input (str): 当前用户输入\n", " temp (float): 模型温度参数(默认 1.0)\n", "\n", " 返回:\n", " List[Tuple[str, str]]: 更新后的对话记录\n", " \"\"\"\n", " try:\n", " messages = []\n", " # 添加任务提示\n", " messages.append({'role': 'user', 'content': prompt})\n", " \n", " # 构建历史对话记录\n", " for input_text, response_text in chatbot:\n", " messages.append({'role': 'user', 'content': input_text})\n", " messages.append({'role': 'assistant', 'content': response_text})\n", "\n", " # 添加当前用户输入\n", " messages.append({'role': 'user', 'content': user_input})\n", "\n", " response = client.chat.completions.create(\n", " model=\"qwen-turbo\",\n", " messages=messages,\n", " temperature=temp,\n", " max_tokens=200, # 修改这个看看\n", " )\n", "\n", " chatbot.append((user_input, response.choices[0].message.content))\n", "\n", " except Exception as e:\n", " print(f\"发生错误:{e}\")\n", " chatbot.append((user_input, f\"抱歉,发生了错误:{e}\"))\n", " \n", " return chatbot\n", "\n", "def export_customized(chatbot, description):\n", " \"\"\"\n", " 导出定制化任务对话记录及任务描述到 JSON 文件。\n", "\n", " 参数:\n", " chatbot (List[Tuple[str, str]]): 对话记录\n", " description (str): 任务描述\n", " \"\"\"\n", " target = {\"chatbot\": chatbot, \"description\": description}\n", " with open(\"files/part3.json\", \"w\", encoding=\"utf-8\") as file:\n", " json.dump(target, file, ensure_ascii=False, indent=4)\n", "\n", "# 构建 Gradio UI 界面\n", "with gr.Blocks() as demo:\n", " gr.Markdown(\"# 第3部分:定制化任务\\n聊天机器人可以执行某项任务,试着与它互动吧!\")\n", " chatbot = gr.Chatbot(type=\"tuples\")\n", " desc_textbox = gr.Textbox(label=\"任务描述\", value=CHATBOT_TASK, interactive=False)\n", " prompt_textbox = gr.Textbox(label=\"提示词\", value=PROMPT_FOR_TASK, visible=False)\n", " input_textbox = gr.Textbox(label=\"输入\", value=\"\")\n", " \n", " with gr.Column():\n", " gr.Markdown(\"# 温度调节\\n温度用于控制聊天机器人的输出,温度越高响应越具创造性。\")\n", " temperature_slider = gr.Slider(0.0, 1.99, 1.0, step=0.01, label=\"温度\")\n", " \n", " with gr.Row():\n", " send_button = gr.Button(value=\"发送\")\n", " reset_button = gr.Button(value=\"重置\")\n", " \n", " with gr.Column():\n", " gr.Markdown(\"# 保存结果\\n当你对结果满意后,点击导出按钮保存结果。\")\n", " export_button = gr.Button(value=\"导出\")\n", " \n", " # 绑定按钮与回调函数\n", " send_button.click(interact_customize, inputs=[chatbot, prompt_textbox, input_textbox, temperature_slider], outputs=[chatbot])\n", " reset_button.click(reset, outputs=[chatbot])\n", " export_button.click(export_customized, inputs=[chatbot, desc_textbox])\n", " \n", "# 启动 Gradio 应用\n", "demo.launch(debug=True)" ] }, { "cell_type": "markdown", "id": "a8173473-5912-46cd-9d2f-99389289ed7a", "metadata": {}, "source": [ "### 检查并打印你的结果\n", "\n", "此部分用于检查你的 \"part3.json\" 文件是否包含所有正确的上下文信息,或者用于查看我们提供的示例文件。\n", "\n", "你需要:\n", "\n", "1. 确保文件列表中有你保存的 **part3.json** 文件。\n", "2. 点击运行按钮。它将显示一个**冻结的** Gradio 界面,重现你的摘要结果。\n", "\n", "------\n", "\n", "在运行此单元格之前,请确保已运行 **安装库** 和 **导入与设置**。\n", "\n", "**记得在进行下一步前停止此单元格。**\n" ] }, { "cell_type": "code", "execution_count": null, "id": "29bb52a9-2a22-49c9-95db-7a6124fc54ee", "metadata": {}, "outputs": [], "source": [ "# 加载对话记录的 JSON 文件\n", "with open(\"files/part3.json\", \"r\") as f:\n", " context = json.load(f)\n", "\n", "# 遍历并加载对话记录\n", "chatbot = context['chatbot']\n", "desc = context['description']\n", "dialogue = \"\"\n", "for user, bot in chatbot:\n", " dialogue += f\"用户: {user}\\n\"\n", " dialogue += f\"机器人: {bot}\\n\"\n", "\n", "# 构建 Gradio UI 界面\n", "with gr.Blocks() as demo:\n", " gr.Markdown(\"# 第3部分:定制化任务\\n聊天机器人可以执行特定任务,试着与它互动吧!\")\n", " chatbot = gr.Chatbot(type=\"tuples\", value=context['chatbot']) # 显示聊天记录\n", " desc_textbox = gr.Textbox(label=\"任务描述\", value=context['description'], interactive=False) # 显示任务描述\n", " \n", " with gr.Column():\n", " gr.Markdown(\"# 只是一个检查\")\n", " gr.Textbox(label=\"任务描述\", value=desc, show_copy_button=True) # 显示并允许复制任务描述\n", " gr.Textbox(label=\"对话记录\", value=dialogue, show_copy_button=True) # 显示并允许复制对话记录\n", "\n", "# 启动 Gradio 应用\n", "demo.launch(debug=True)" ] }, { "cell_type": "code", "execution_count": null, "id": "aec5293d-0c75-4bee-b7d4-72f1dc08788e", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "ai", "language": "python", "name": "ai" }, "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.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }