{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "17f26fdc-8aaa-47c9-85ab-156608c39cc9",
   "metadata": {},
   "source": [
    "## 基础API调用介绍"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "25ef0667-6af9-4378-a23e-cb4a63b80d01",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:31:03.922781Z",
     "iopub.status.busy": "2026-03-17T13:31:03.922613Z",
     "iopub.status.idle": "2026-03-17T13:31:04.327795Z",
     "shell.execute_reply": "2026-03-17T13:31:04.327256Z",
     "shell.execute_reply.started": "2026-03-17T13:31:03.922765Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# python包引入\n",
    "import os\n",
    "from openai import OpenAI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "fa1b4be4-c4ed-4076-9bba-6dd1927edee6",
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:31:33.254927Z",
     "iopub.status.busy": "2026-03-17T13:31:33.254743Z",
     "iopub.status.idle": "2026-03-17T13:31:33.303571Z",
     "shell.execute_reply": "2026-03-17T13:31:33.302961Z",
     "shell.execute_reply.started": "2026-03-17T13:31:33.254909Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 获取api_key\n",
    "api_key = os.getenv(\"OPENAI_API_KEY\", \"sk-q4U13e0730fabd22176af25b9454c7896610386fc114fi4t\")\n",
    "base_urls = [\"https://api.gptsapi.net/v1\"]\n",
    "client = OpenAI(api_key=api_key, base_url=base_urls[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ba0d2663-69d6-445e-a079-c365871b49d0",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:32:12.223720Z",
     "iopub.status.busy": "2026-03-17T13:32:12.223548Z",
     "iopub.status.idle": "2026-03-17T13:32:12.226608Z",
     "shell.execute_reply": "2026-03-17T13:32:12.226137Z",
     "shell.execute_reply.started": "2026-03-17T13:32:12.223703Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 问答函数定义\n",
    "def chat(model=\"gpt-4o-mini\", messages=[], temperature=0.7):\n",
    "    completion = client.chat.completions.create(\n",
    "    model=model,\n",
    "    messages=messages,\n",
    "    temperature=temperature,\n",
    "    )\n",
    "    return completion.choices[0].message.content"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "1a1093cc-d006-4d88-9524-3feaa4835818",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:32:13.243340Z",
     "iopub.status.busy": "2026-03-17T13:32:13.243136Z",
     "iopub.status.idle": "2026-03-17T13:32:21.186780Z",
     "shell.execute_reply": "2026-03-17T13:32:21.186174Z",
     "shell.execute_reply.started": "2026-03-17T13:32:13.243320Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "当然可以！以下是一些减肥的基本知识和建议：\n",
      "\n",
      "1. **饮食控制**：\n",
      "   - **热量赤字**：减肥的关键是消耗的热量要超过摄入的热量。计算每日所需热量并确保摄入量低于此值。\n",
      "   - **均衡饮食**：确保摄入足够的蛋白质、健康脂肪和碳水化合物。多吃水果、蔬菜和全谷物。\n",
      "   - **控制份量**：注意每餐的份量，避免暴饮暴食。\n",
      "\n",
      "2. **运动锻炼**：\n",
      "   - **有氧运动**：如步行、跑步、游泳和骑自行车等，能有效燃烧热量。\n",
      "   - **力量训练**：增加肌肉量可以提高基础代谢率，帮助燃烧更多的卡路里。\n",
      "   - **规律性**：每周至少150分钟的中等强度锻炼，或者75分钟的高强度锻炼。\n",
      "\n",
      "3. **保持水分**：\n",
      "   - 多喝水可以帮助控制食欲，有时人们会将口渴误认为饥饿。\n",
      "   - 尽量避免高糖饮料和酒精。\n",
      "\n",
      "4. **充足睡眠**：\n",
      "   - 睡眠不足会影响荷尔蒙水平，增加饥饿感和食欲。\n",
      "   - 每晚建议至少7-8小时的优质睡眠。\n",
      "\n",
      "5. **心理健康**：\n",
      "   - 设定合理的目标，关注过程而不是仅仅结果。\n",
      "   - 寻找支持系统，如朋友或减肥小组，分享经验和鼓励。\n",
      "\n",
      "6. **记录进展**：\n",
      "   - 记录饮食和锻炼情况可以帮助你保持动力并了解自己的习惯。\n",
      "\n",
      "7. **避免极端饮食**：\n",
      "   - 极端饮食可能导致营养不良和反弹，选择可持续的健康饮食方式更为重要。\n",
      "\n",
      "重要的是，减肥是一个渐进的过程，找到适合自己的方法最为关键。如果有健康问题或需要个性化建议，建议咨询专业医生或营养师。\n"
     ]
    }
   ],
   "source": [
    "# 发起询问\n",
    "messages = [{'role': 'user', 'content': '能告诉我一些减肥知识吗'}]\n",
    "res = chat(model=\"gpt-4o-mini\", messages=messages)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1a97de0-b610-42de-b533-007327eceb7a",
   "metadata": {},
   "source": [
    "## 基础问答实操\n",
    "- 1、内容创作与编辑\n",
    "    - 生成一篇关于人工智能在医疗健康领域应用的文章。\n",
    "- 2、学习辅助\n",
    "    - 提供一份高中数学函数章节的学习指南，包括重点概念、公式和练习题。\n",
    "- 3、编程帮助\n",
    "    - 写一个Python脚本，用于从网站上抓取特定类型的数据（如天气预报），并将其保存到CSV文件中。\n",
    "- 4、日常生活建议\n",
    "    - 给出一周内适合家庭健身的锻炼计划，考虑到不同的健身目标（如减脂、增肌等）。根据提供的食材清单，推荐几款营养均衡的晚餐食谱。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "c0df6765-bf7c-4c45-a2b3-131f172cfbb4",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:32:23.645824Z",
     "iopub.status.busy": "2026-03-17T13:32:23.645604Z",
     "iopub.status.idle": "2026-03-17T13:32:31.103871Z",
     "shell.execute_reply": "2026-03-17T13:32:31.103204Z",
     "shell.execute_reply.started": "2026-03-17T13:32:23.645804Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "下面是一个简单的Python脚本，用于从天气预报网站抓取天气数据并将其保存到CSV文件中。此示例使用`requests`库获取网页内容，使用`BeautifulSoup`库解析HTML，并将数据保存到CSV文件中。\n",
      "\n",
      "确保您已安装所需的库。如果还没有安装，可以使用以下命令：\n",
      "\n",
      "```bash\n",
      "pip install requests beautifulsoup4 pandas\n",
      "```\n",
      "\n",
      "以下是示例脚本：\n",
      "\n",
      "```python\n",
      "import requests\n",
      "from bs4 import BeautifulSoup\n",
      "import pandas as pd\n",
      "\n",
      "# 定义抓取的URL（这里以一个假设的天气网站为例）\n",
      "url = 'https://example.com/weather'  # 替换为实际的天气网站URL\n",
      "\n",
      "# 发送请求获取网页内容\n",
      "response = requests.get(url)\n",
      "response.raise_for_status()  # 确保请求成功\n",
      "\n",
      "# 解析HTML\n",
      "soup = BeautifulSoup(response.text, 'html.parser')\n",
      "\n",
      "# 找到包含天气数据的元素\n",
      "# 请根据实际网站的结构调整选择器\n",
      "weather_data = []\n",
      "for item in soup.select('.weather-item'):  # 替换为实际的CSS选择器\n",
      "    date = item.select_one('.date').get_text(strip=True)  # 替换为实际的选择器\n",
      "    temperature = item.select_one('.temperature').get_text(strip=True)  # 替换为实际的选择器\n",
      "    condition = item.select_one('.condition').get_text(strip=True)  # 替换为实际的选择器\n",
      "    weather_data.append({\n",
      "        'Date': date,\n",
      "        'Temperature': temperature,\n",
      "        'Condition': condition\n",
      "    })\n",
      "\n",
      "# 将数据保存到CSV文件\n",
      "df = pd.DataFrame(weather_data)\n",
      "df.to_csv('weather_forecast.csv', index=False, encoding='utf-8')\n",
      "\n",
      "print('天气数据已保存到 weather_forecast.csv')\n",
      "```\n",
      "\n",
      "### 注意事项：\n",
      "1. **URL和选择器**：您需要根据实际抓取的网站更新`url`和CSS选择器。可以使用浏览器的开发者工具（F12）来查看网页结构并找到合适的选择器。\n",
      "2. **网页内容**：确保您遵守网站的`robots.txt`文件和相关的使用条款，避免违反网站的抓取政策。\n",
      "3. **异常处理**：在实际应用中，建议添加异常处理，以应对网络请求失败或解析失败的情况。\n",
      "4. **数据清理和格式化**：根据需要对抓取的数据进行进一步的清理和格式化。\n",
      "\n",
      "请根据您的需求进一步修改和扩展此脚本！\n"
     ]
    }
   ],
   "source": [
    "messages = [{'role': 'user', 'content': '写一个Python脚本，用于从网站上抓取特定类型的数据（如天气预报），并将其保存到CSV文件中。'}]\n",
    "res = chat(model=\"gpt-4o-mini\", messages=messages)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e53cab3a-23bb-4629-a17c-44f4905e35ef",
   "metadata": {},
   "source": [
    "## 进阶问答"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "34fc016b-e3d9-4cfc-8d69-457c2bd42d4b",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:32:33.064433Z",
     "iopub.status.busy": "2026-03-17T13:32:33.064265Z",
     "iopub.status.idle": "2026-03-17T13:32:33.068340Z",
     "shell.execute_reply": "2026-03-17T13:32:33.067751Z",
     "shell.execute_reply.started": "2026-03-17T13:32:33.064417Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# ====================\n",
    "# 进阶功能示例\n",
    "# ====================\n",
    "def advanced_chat(messages, \n",
    "                 model=\"gpt-4o-mini\", \n",
    "                 max_tokens=500, \n",
    "                 temperature=0.5):\n",
    "    \"\"\"\n",
    "    进阶对话函数\n",
    "    :param messages: 完整的对话历史\n",
    "    :param model: 模型版本\n",
    "    :param max_tokens: 最大输出长度\n",
    "    :param temperature: 生成温度\n",
    "    :return: 完整响应对象\n",
    "    \"\"\"\n",
    "    response = client.chat.completions.create(\n",
    "            model=model,\n",
    "            messages=messages,\n",
    "            temperature=temperature,\n",
    "            max_tokens=max_tokens,\n",
    "            top_p=0.9,          # 核采样参数\n",
    "            frequency_penalty=0.5  # 减少重复内容\n",
    "    )\n",
    "    return response.choices[0].message.content"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "8a203e15-008a-4761-a883-aa193120f7c8",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:32:35.088147Z",
     "iopub.status.busy": "2026-03-17T13:32:35.087977Z",
     "iopub.status.idle": "2026-03-17T13:32:51.917790Z",
     "shell.execute_reply": "2026-03-17T13:32:51.917205Z",
     "shell.execute_reply.started": "2026-03-17T13:32:35.088131Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "进阶调用示例：\n",
      "当然可以！让我们逐个分析这些优化示例，以更好地理解它们背后的原理和优势。\n",
      "\n",
      "### 1. 使用内置函数和库\n",
      "\n",
      "**原始代码：**\n",
      "```python\n",
      "total = 0\n",
      "for i in range(1, 1000000):\n",
      "    total += i\n",
      "```\n",
      "\n",
      "**优化后的代码：**\n",
      "```python\n",
      "total = sum(range(1, 1000000))\n",
      "```\n",
      "\n",
      "**解释：**\n",
      "- 在原始代码中，我们使用循环手动累加数字。这种方式在Python中比较慢，因为每次迭代都涉及到Python的解释器。\n",
      "- 使用`sum()`函数直接对一个可迭代对象进行求和，Python会在底层以更高效的方式处理数据，通常会显著提高性能。\n",
      "\n",
      "### 2. 列表推导式\n",
      "\n",
      "**原始代码：**\n",
      "```python\n",
      "squares = []\n",
      "for i in range(10):\n",
      "    squares.append(i * i)\n",
      "```\n",
      "\n",
      "**优化后的代码：**\n",
      "```python\n",
      "squares = [i * i for i in range(10)]\n",
      "```\n",
      "\n",
      "**解释：**\n",
      "- 原始代码使用了显式的`for`循环和`append()`方法，这在每次添加元素时都涉及到多次方法调用。\n",
      "- 列表推导式是一种更简洁的语法，它不仅使代码更易读，而且由于其内部实现优化，通常比显式循环要快得多。\n",
      "\n",
      "### 3. 使用生成器\n",
      "\n",
      "**原始代码：**\n",
      "```python\n",
      "large_list = [i for i in range(1000000)]\n",
      "total = sum(large_list)\n",
      "```\n",
      "\n",
      "**优化后的代码：**\n",
      "```python\n",
      "total = sum(i for i in range(1000000))  # 使用生成器表达式\n",
      "```\n",
      "\n",
      "**解释：**\n",
      "- 在原始代码中，我们创建了一个包含一百万个整数的列表，这会消耗大量内存。\n",
      "- 优化后的版本使用生成器表达式，它不会立即创建整个列表，而是按需生成每个值。这减少了内存占用，并且在处理大数据集时可以显著提高性能。\n",
      "\n",
      "### 4. 避免不必要的计算\n",
      "\n",
      "**原始代码：**\n",
      "```python\n",
      "result = []\n",
      "for i in range(10000):\n",
      "    result.append(i * (3.14\n"
     ]
    }
   ],
   "source": [
    "# 多轮对话示例\n",
    "conversation = [\n",
    "    {\"role\": \"system\", \"content\": \"你是一个资深Python工程师\"},\n",
    "    {\"role\": \"user\", \"content\": \"如何优化Python代码的执行效率？\"},\n",
    "    {\"role\": \"assistant\", \"content\": \"可以使用内置函数替代循环...\"},\n",
    "    {\"role\": \"user\", \"content\": \"请给出具体的代码示例\"}\n",
    "]\n",
    "\n",
    "print(\"\\n进阶调用示例：\")\n",
    "result = advanced_chat(conversation)\n",
    "# print(result)\n",
    "conversation.append({\"role\": \"assistant\", \"content\": result})\n",
    "conversation.append({\"role\": \"user\", \"content\": \"请进一步解释这些样例\"})\n",
    "print(advanced_chat(conversation))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "dd570772-87f9-489c-8773-04fe7c3fc62d",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-23T13:36:01.187369Z",
     "iopub.status.busy": "2025-10-23T13:36:01.187146Z",
     "iopub.status.idle": "2025-10-23T13:36:01.191051Z",
     "shell.execute_reply": "2025-10-23T13:36:01.190628Z",
     "shell.execute_reply.started": "2025-10-23T13:36:01.187354Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# ====================\n",
    "# 流式输出处理\n",
    "# ====================\n",
    "def stream_response(model=\"gpt-4o-mini\", messages=[], temperature=0.7):\n",
    "    \"\"\"流式输出演示\"\"\"\n",
    "    try:\n",
    "        response = client.chat.completions.create(\n",
    "            model=model,\n",
    "            messages=messages,\n",
    "            stream=True  # 启用流式传输\n",
    "        )\n",
    "        \n",
    "        print(\"\\n流式输出示例：\")\n",
    "        for chunk in response:\n",
    "            if len(chunk.choices)>0:\n",
    "                content = chunk.choices[0].delta.content\n",
    "                print(content, end=\"\", flush=True)\n",
    "        print(\"\\n\")\n",
    "    except Exception as e:\n",
    "        print(f\"流式请求失败: {str(e)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "c51c811e-c247-4dbe-a09b-3061ba20012d",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-23T13:36:02.536710Z",
     "iopub.status.busy": "2025-10-23T13:36:02.536423Z",
     "iopub.status.idle": "2025-10-23T13:36:10.535924Z",
     "shell.execute_reply": "2025-10-23T13:36:10.535288Z",
     "shell.execute_reply.started": "2025-10-23T13:36:02.536688Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "流式输出示例：\n",
      "夏威夷的海滩宛如大自然的瑰宝，绵延的沙滩在阳光的照射下闪烁着金色的光芒，细腻的白沙如同粉末般柔软，踩上去仿佛踏在云朵上。海浪轻轻拍打着岸边，发出悦耳的低语，带着咸咸的海风，吹拂着游人脸颊，让人不禁沉醉其中。\n",
      "\n",
      "碧蓝的海水清澈透明，宛如一块巨大的蓝色宝石，映衬着天空的湛蓝。偶尔有小船悠然驶过，留下淡淡的涟漪，仿佛在为这片宁静增添几分故事性。海洋的另一边，珊瑚礁宛如刚刚醒来的梦境，各种色彩斑斓的热带鱼在其中穿梭，欢快地舞动，仿佛在迎接每一个探索的游客。\n",
      "\n",
      "而黄昏时分，夕阳缓缓下沉，天空被染成了火红和橙黄的色彩，海面则泛起一片金辉，如同天上掉下的星星，闪烁着神秘的光芒，令人心中升起一丝敬畏与感动。在这样的夏威夷海滩，时间仿佛都静止了，惬意与宁静交织成一幅美丽的画卷，令人不愿离去。None\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 流式调用示例（适合生成长内容）\n",
    "messages = [{'role': 'user', 'content': \"用生动的语言描述夏威夷的海滩\"}]\n",
    "stream_response(model=\"gpt-4o-mini\", messages=messages)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "1201e86d-abc3-4ecc-9758-4178f7ee2a78",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-23T13:36:18.265956Z",
     "iopub.status.busy": "2025-10-23T13:36:18.265741Z",
     "iopub.status.idle": "2025-10-23T13:36:32.553194Z",
     "shell.execute_reply": "2025-10-23T13:36:32.552755Z",
     "shell.execute_reply.started": "2025-10-23T13:36:18.265941Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "夏威夷的海滩宛如一幅色彩斑斓的画卷，碧蓝的海水在阳光的照耀下闪烁着耀眼的光芒，宛如撒满了无数颗钻石。细腻的白沙如同面粉般柔软，踩上去仿佛走在云端，温暖的阳光轻轻洒在肌肤上，带来无尽的舒适。\n",
      "\n",
      "海浪轻轻拍打着岸边，发出悦耳的低语声，有时涌起一朵朵洁白的浪花，像是海洋在欢快地舞蹈。远处，冲浪者在波涛中翩翩起舞，借助海浪的力量，勇敢地挑战着自然的脾性。\n",
      "\n",
      "海滩上，椰子树摇曳着翠绿的叶子，微风拂过，带来阵阵清凉。沙滩上五光十色的遮阳伞和沙滩椅，伴随着欢声笑语，形成了一个欢乐的乐园。孩子们在沙滩上堆砌着沙堡，嬉戏的笑声在空气中回荡，仿佛时间在这里凝固，只有快乐与宁静。\n",
      "\n",
      "夕阳渐渐西沉，天际被染成温暖的橙色和紫色，海面上泛起金色的涟漪，仿佛大海也在为这美丽的时刻而陶醉。此时，夏威夷的海滩不仅仅是一个度假胜地，更是一个梦幻的乐土，让人心醉神迷，流连忘返。\n"
     ]
    }
   ],
   "source": [
    "# 非流式调用示例\n",
    "messages = [{'role': 'user', 'content': \"用生动的语言描述夏威夷的海滩\"}]\n",
    "res = chat(model=\"gpt-4o-mini\", messages=messages)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "33a9ee71-84d3-4901-951f-e6684347f0bf",
   "metadata": {
    "tags": []
   },
   "source": [
    "## 习题\n",
    "### 习题 1: 基本调用\n",
    "题目: 调用 advanced_chat 函数，传入一个多轮医学对话历史 messages，要求模型生成一段不超过 150 个 token 的回复。对话历史如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "9d2d261a-9cd9-47ac-ba18-06b9fcb1206a",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-23T13:36:35.886528Z",
     "iopub.status.busy": "2025-10-23T13:36:35.886324Z",
     "iopub.status.idle": "2025-10-23T13:36:39.825767Z",
     "shell.execute_reply": "2025-10-23T13:36:39.825364Z",
     "shell.execute_reply.started": "2025-10-23T13:36:35.886511Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "高血压在早期通常没有明显症状，因此常被称为“无声杀手”。然而，随着病情的发展，可能会出现一些症状，包括：\n",
      "\n",
      "1. **头痛**：尤其是后脑勺的钝痛。\n",
      "2. **眩晕或头晕**：感觉不稳或失去平衡。\n",
      "3. **心悸**：心跳加速或不规律。\n",
      "4. **呼吸困难**：在体力活动时感到呼吸急促。\n",
      "5. **视力模糊**：眼睛出现视力问题，如模糊或闪光。\n",
      "6. **鼻出血**：频繁的鼻出血可能与高血压有关。\n",
      "\n",
      "需要注意的是，这些症状并不是高血压特有的，很多其他疾病也可能引起类似的表现。因此，定期测量血压是早期发现和管理高血压的重要方法。如果怀疑自己有高血压或有相关症状，应及时就医进行评估和治疗。\n"
     ]
    }
   ],
   "source": [
    "conversation = [\n",
    "    {\"role\": \"system\", \"content\": \"你是一位资深医学专家\"},\n",
    "    {\"role\": \"user\", \"content\": \"什么是高血压？\"},\n",
    "    {\"role\": \"assistant\", \"content\": \"高血压是指血液在血管中的压力过高...\"},\n",
    "    {\"role\": \"user\", \"content\": \"高血压有哪些常见的症状？\"}\n",
    "]\n",
    "print(advanced_chat(messages = conversation, max_tokens = 500))\n",
    "# def advanced_chat(messages, \n",
    "#                  model=\"gpt-4o-mini\", \n",
    "#                  max_tokens=500, \n",
    "#                  temperature=0.5):\n",
    "# 提示: 你需要调用 advanced_chat 函数并传入 conversation 和 max_tokens 参数。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3567701-9067-41db-9512-08e7f280c220",
   "metadata": {},
   "source": [
    "### 习题 2: 调整生成温度\n",
    "题目: 调用 advanced_chat 函数，生成一段关于“糖尿病”的回复。要求生成的内容更具创造性，因此将 temperature 设置为 0.8。对话历史如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "b0e86d0d-d192-44e8-bf0f-5aa5d0c5b280",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-23T13:36:42.116265Z",
     "iopub.status.busy": "2025-10-23T13:36:42.116057Z",
     "iopub.status.idle": "2025-10-23T13:36:50.231341Z",
     "shell.execute_reply": "2025-10-23T13:36:50.230751Z",
     "shell.execute_reply.started": "2025-10-23T13:36:42.116250Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "糖尿病的预防措施主要包括以下几个方面：\n",
      "\n",
      "1. **健康饮食**：\n",
      "   - 选择低糖、低脂肪、高纤维的食物，如全谷物、蔬菜、水果和瘦肉。\n",
      "   - 控制碳水化合物的摄入量，避免高糖和高热量的食物。\n",
      "   - 定期进餐，避免暴饮暴食。\n",
      "\n",
      "2. **保持适当体重**：\n",
      "   - 通过合理饮食和锻炼来维持健康体重，减少肥胖风险。\n",
      "\n",
      "3. **定期锻炼**：\n",
      "   - 每周至少进行150分钟的中等强度有氧运动，如快走、游泳或骑自行车。\n",
      "   - 加入力量训练，每周至少两次，以增强肌肉和提高代谢率。\n",
      "\n",
      "4. **监测血糖水平**：\n",
      "   - 对于有糖尿病家族史或其他风险因素的人，定期检查血糖水平，以便及早发现问题。\n",
      "\n",
      "5. **戒烟限酒**：\n",
      "   - 戒烟可以降低多种疾病的风险，包括糖尿病。限制酒精摄入也有助于控制体重和血糖水平。\n",
      "\n",
      "6. **管理压力**：\n",
      "   - 学习放松技巧，如冥想、瑜伽或深呼吸，以帮助管理生活中的压力。\n",
      "\n",
      "7. **定期体检**：\n",
      "   - 定期进行健康检查，特别是对于有糖尿病风险的人群，可以及早发现潜在问题并采取措施。\n",
      "\n",
      "通过以上措施，可以有效降低患上2型糖尿病的风险。对于已经被诊断为前驱状态（如胰岛素抵抗或空腹血糖受损）的人，更应积极采取这些预防措施。\n"
     ]
    }
   ],
   "source": [
    "conversation = [\n",
    "    {\"role\": \"system\", \"content\": \"你是一位资深医学专家\"},\n",
    "    {\"role\": \"user\", \"content\": \"糖尿病是什么？\"},\n",
    "    {\"role\": \"assistant\", \"content\": \"糖尿病是一种代谢性疾病...\"},\n",
    "    {\"role\": \"user\", \"content\": \"糖尿病的预防措施有哪些？\"}\n",
    "]\n",
    "print(advanced_chat(messages = conversation, temperature = 0))\n",
    "# 提示: 你需要调整 temperature 参数来控制生成内容的创造性。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68074fc6-7588-4aff-9beb-25e3a698e06c",
   "metadata": {},
   "source": [
    "### 习题 3: 减少重复内容\n",
    "题目: 调用 advanced_chat 函数，生成一段关于“心脏病”的回复。要求生成的内容尽量减少重复，因此将 frequency_penalty 设置为 1.0。对话历史如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "ea024295-6102-4714-8db1-4b1f1fa48995",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-06-13T08:37:50.428023Z",
     "iopub.status.busy": "2025-06-13T08:37:50.427690Z",
     "iopub.status.idle": "2025-06-13T08:37:54.899514Z",
     "shell.execute_reply": "2025-06-13T08:37:54.898977Z",
     "shell.execute_reply.started": "2025-06-13T08:37:50.427984Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "心脏病的常见症状包括：\n",
      "\n",
      "1. **胸痛或不适**：可能表现为压迫感、紧缩感或疼痛，通常发生在胸部中央或左侧。\n",
      "2. **气短**：在活动时或休息时都可能出现，尤其是在剧烈运动后。\n",
      "3. **疲劳感**：即使在没有进行剧烈活动的情况下，也可能感到异常疲惫。\n",
      "4. **心悸**：感觉心跳不规律、过快或过慢。\n",
      "5. **头晕或眩晕**：有时会伴随失去平衡的感觉。\n",
      "6. **肢体水肿**：手脚、腿部等部位出现肿胀现象，通常与血液循环不良有关。\n",
      "7. **出汗增多**：特别是在没有明显原因的情况下（如运动）。\n",
      "8. **恶心或呕吐**：有些人可能会经历消化不良和恶心。\n",
      "\n",
      "不同类型的心脏病可能表现出不同的症状，因此如果出现上述任何症状，建议及时就医进行评估和诊断。\n"
     ]
    }
   ],
   "source": [
    "def advanced_chat(messages, \n",
    "                 model=\"gpt-4o-mini\", \n",
    "                 max_tokens=500, \n",
    "                 temperature=0.5,\n",
    "                 frequency_penalty = 0.5):\n",
    "    \"\"\"\n",
    "    进阶对话函数\n",
    "    :param messages: 完整的对话历史\n",
    "    :param model: 模型版本\n",
    "    :param max_tokens: 最大输出长度\n",
    "    :param temperature: 生成温度\n",
    "    :return: 完整响应对象\n",
    "    \"\"\"\n",
    "    response = client.chat.completions.create(\n",
    "            model=model,\n",
    "            messages=messages,\n",
    "            temperature=temperature,\n",
    "            max_tokens=max_tokens,\n",
    "            top_p=0.9,          # 核采样参数\n",
    "            frequency_penalty=frequency_penalty  # 减少重复内容\n",
    "    )\n",
    "    return response.choices[0].message.content\n",
    "\n",
    "conversation = [\n",
    "    {\"role\": \"system\", \"content\": \"你是一位资深医学专家\"},\n",
    "    {\"role\": \"user\", \"content\": \"心脏病是什么？\"},\n",
    "    {\"role\": \"assistant\", \"content\": \"心脏病是一类影响心脏功能的疾病...\"},\n",
    "    {\"role\": \"user\", \"content\": \"心脏病的常见症状有哪些？\"}\n",
    "]\n",
    "print(advanced_chat(conversation, frequency_penalty = 1.0))\n",
    "# 提示: 你需要调整 frequency_penalty 参数来减少生成内容中的重复。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e7911fa-bea4-427a-8982-04317c0cb6c0",
   "metadata": {},
   "source": [
    "### 习题 4: 综合应用\n",
    "题目: 调用 advanced_chat 函数，生成一段关于“新冠病毒”的回复。要求生成的内容不超过 200 个 token，且具有较高的创造性（temperature=0.7），同时尽量减少重复内容（frequency_penalty=0.8）。对话历史如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "4291effe-cded-431b-bcb5-18f130bcb110",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-23T13:37:03.988828Z",
     "iopub.status.busy": "2025-10-23T13:37:03.988600Z",
     "iopub.status.idle": "2025-10-23T13:37:06.958414Z",
     "shell.execute_reply": "2025-10-23T13:37:06.958029Z",
     "shell.execute_reply.started": "2025-10-23T13:37:03.988812Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'新冠病毒（SARS-CoV-2）的传播途径主要包括以下几种：\\n\\n1. **呼吸道飞沫传播**：当感染者咳嗽、打喷嚏、说话或呼吸时，释放出带有病毒的飞沫，这些飞沫可以被周围的人吸入。\\n\\n2. **接触传播**：病毒可以在物体表面存活一定时间，若健康人接触了被污染的物体表面后，再触摸自己的口、鼻或眼睛，也可能导致感染。\\n\\n3. **气溶胶传播**：在封闭或通风不良的环境中，较小的气溶胶颗粒可以悬浮在空气中较长时间，并被他人吸入，从而引发感染。\\n\\n4. **密切接触传播**：与感染者进行亲密接触，例如拥抱、握手'"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def advanced_chat(messages, \n",
    "                 model=\"gpt-4o-mini\", \n",
    "                 max_tokens=500, \n",
    "                 temperature=0.5,\n",
    "                 frequency_penalty = 0.5):\n",
    "    \"\"\"\n",
    "    进阶对话函数\n",
    "    :param messages: 完整的对话历史\n",
    "    :param model: 模型版本\n",
    "    :param max_tokens: 最大输出长度\n",
    "    :param temperature: 生成温度\n",
    "    :return: 完整响应对象\n",
    "    \"\"\"\n",
    "    response = client.chat.completions.create(\n",
    "            model=model,\n",
    "            messages=messages,\n",
    "            temperature=temperature,\n",
    "            max_tokens=max_tokens,\n",
    "            top_p=0.9,          # 核采样参数\n",
    "            frequency_penalty=frequency_penalty  # 减少重复内容\n",
    "    )\n",
    "    return response.choices[0].message.content\n",
    "\n",
    "conversation = [\n",
    "    {\"role\": \"system\", \"content\": \"你是一位资深医学专家\"},\n",
    "    {\"role\": \"user\", \"content\": \"新冠病毒是什么？\"},\n",
    "    {\"role\": \"assistant\", \"content\": \"新冠病毒是一种冠状病毒...\"},\n",
    "    {\"role\": \"user\", \"content\": \"新冠病毒的传播途径有哪些？\"}\n",
    "]\n",
    "# 要求: 设置 max_tokens=200，temperature=0.7，frequency_penalty=0.8，并保持其他参数为默认值。\n",
    "advanced_chat(conversation, max_tokens=200, temperature=0.7, frequency_penalty = 1.0)\n",
    "# 提示: 你需要同时调整多个参数来满足生成要求。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b57076c2-33c9-4538-890e-bd4e5716e10d",
   "metadata": {},
   "source": [
    "### 习题5: 生成医学建议\n",
    "题目: 调用 advanced_chat 函数，生成一段关于“健康饮食”的回复。要求且具有中等创造性（temperature=0.6），并将内容写入到本地文件\"healthy_diet.txt\"中，对话历史如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "fe775a5c-7380-4272-ac5d-a24ee0891dd7",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-23T13:37:09.204029Z",
     "iopub.status.busy": "2025-10-23T13:37:09.203811Z",
     "iopub.status.idle": "2025-10-23T13:37:28.059468Z",
     "shell.execute_reply": "2025-10-23T13:37:28.059041Z",
     "shell.execute_reply.started": "2025-10-23T13:37:09.204014Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "conversation = [\n",
    "    {\"role\": \"system\", \"content\": \"你是一位资深医学专家，能详细的回复用户的问题\"},\n",
    "    {\"role\": \"user\", \"content\": \"什么是健康饮食？\"},\n",
    "    {\"role\": \"assistant\", \"content\": \"健康饮食是指均衡摄入各种营养素...\"},\n",
    "    {\"role\": \"user\", \"content\": \"你能给我一些具体的健康饮食建议吗？\"}\n",
    "]\n",
    "res = advanced_chat(conversation, temperature = 0.6, max_tokens=1000)\n",
    "with open(\"healthy_diet.txt\",\"w\") as f:\n",
    "    f.write(res)\n",
    "# 要求: 设置temperature=0.6，并保持其他参数为默认值。\n",
    "# 提示: 你需要调整 temperature 参数，并将结果写入本地文件 healthy_diet.txt 中。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4c580cf3",
   "metadata": {},
   "source": [
    "### 习题6: 从本地读文件进行总结\n",
    "题目: 调用 advanced_chat 函数，从上一题中保存的本地文件\"healthy_diet.txt\"中读取内容，让LLM对内容进行总结，要求生成的内容不超过 150 个 token，且具有中等创造性（temperature=0.6），对话历史如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "78605379",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-23T13:37:28.060226Z",
     "iopub.status.busy": "2025-10-23T13:37:28.060087Z",
     "iopub.status.idle": "2025-10-23T13:37:32.777313Z",
     "shell.execute_reply": "2025-10-23T13:37:32.776883Z",
     "shell.execute_reply.started": "2025-10-23T13:37:28.060213Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "您提供的文档总结了健康饮食的具体建议，以下是要点：\n",
      "\n",
      "1. **多样化饮食**：确保摄入多种食物以获取全面营养。\n",
      "2. **增加水果和蔬菜**：每天至少五份，选择不同颜色和类型。\n",
      "3. **选择全谷物**：优先选择全谷物食品，富含纤维，助于消化与血糖控制。\n",
      "4. **适量蛋白质**：优先低脂肪蛋白来源，如鱼、鸡肉和豆类。\n",
      "5. **控制脂肪摄入**：减少饱和和反式脂肪，选择健康不饱和脂肪。\n",
      "6. **减少糖分摄入**：限制添加糖消费，选择天然甜味剂。\n",
      "7. **适量盐分摄入**：减少钠盐，每天少于2300毫克，多用香料调味。\n",
      "8. **保持水分**：每天至少喝8杯水，根据个人需求调整。\n",
      "9. **注意餐盘比例**：每餐保持合理比例，包括水果、蔬菜、蛋白质和全谷物。\n",
      "10. **定时定量进餐**：保持规律进餐时间，以控制体重和能量水平。\n",
      "11. **倾听身体信号**：识别饥饿与饱腹感，避免情绪性进食。\n",
      "12. **限制酒精消费**：适度饮酒，男性每日不超过两杯，女性不超过一杯。\n",
      "\n",
      "这些建议旨在促进整体健康，提高免疫力，并降低慢性疾病风险。根据个人情况进行调整或咨询专业营养师是推荐的做法。\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# 对话历史\n",
    "conversation = [\n",
    "    {\"role\": \"system\", \"content\": \"你是一位资深医学专家，能够帮我总结我上传的文档\"},\n",
    "]\n",
    "\n",
    "with open(\"healthy_diet.txt\",\"r\") as f:\n",
    "    content = f.read()\n",
    "conversation.append({\"role\": \"user\",\"content\":content})\n",
    "res = advanced_chat(conversation, temperature = 0.6, max_tokens=500)\n",
    "print(res)\n",
    "# 要求: 设置 max_tokens=150，temperature=0.6，并保持其他参数为默认值。\n",
    "# 提示: 你需要首先读取本地文件 healthy_diet.txt  并将文件内容发送给LLM，其次你需要调整 max_tokens 和 temperature 参数。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d7adaefe",
   "metadata": {},
   "source": [
    "### 习题7: 构建一个用户输入驱动的多轮对话脚本\n",
    "题目: 你需要完成 interactive_chat 函数，具体要求如下：\n",
    "- 每一轮对话中，用户手动输入问题，模型生成回答后将结果存入 conversation 中，并等待用户的下一次输入。\n",
    "- 当用户输入“退出”时，退出 interactive_chat 函数。\n",
    "- 确保对话历史 (conversation) 能够正确维护，以便模型能够基于上下文生成连贯的回答。\n",
    "- 打印每次模型的回复，并在用户退出时输出提示信息。\n",
    "\n",
    "**提示：**\n",
    "- 可以使用`user_input = input(\"用户: \")`获取用户的输入\n",
    "- 可以使用`While True`来模拟多轮对话，当用户输入为\"退出\"时，退出循环`break`\n",
    "- 你需要参考之前给出的对话历史`conversation`的格式，对于用户输入的存储格式为:`{\"role\": \"user\", \"content\": <用户输入>}`，对于大模型返回的存储格式为：`{\"role\": \"assistant\", \"content\": <大模型返回>}`。\n",
    "\n",
    "我们提供了一个interactive_chat实现的模板，请补充这个函数，能够完成上述功能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "569251bc",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-23T13:37:32.777841Z",
     "iopub.status.busy": "2025-10-23T13:37:32.777691Z",
     "iopub.status.idle": "2025-10-23T13:37:45.988736Z",
     "shell.execute_reply": "2025-10-23T13:37:45.988306Z",
     "shell.execute_reply.started": "2025-10-23T13:37:32.777827Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "欢迎进入多轮对话模式！输入 '退出' 结束对话。\n",
      "\n"
     ]
    },
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "用户:  hello\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "用户： hello\n",
      "模型: Hello! How can I assist you today?\n",
      "\n"
     ]
    },
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "用户:  退出\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "用户： 退出\n",
      "对话结束，感谢使用！\n"
     ]
    }
   ],
   "source": [
    "def interactive_chat():\n",
    "    \"\"\"\n",
    "    实现用户输入驱动的多轮对话。\n",
    "    \"\"\"\n",
    "    print(\"欢迎进入多轮对话模式！输入 '退出' 结束对话。\\n\")\n",
    "    \n",
    "    # 初始化对话历史\n",
    "    conversation = [\n",
    "        {\"role\": \"system\", \"content\": \"你是一个医疗助手\"},\n",
    "    ]\n",
    "    \n",
    "    # TODO 你需要在这补充循环，获取用户输入，放入conversation中，并调用advanced_chat，并将返回又增加到messages中\n",
    "    while True:\n",
    "        # 用户输入问题\n",
    "        user_input = input(\"用户: \")\n",
    "        print(f\"用户： {user_input}\")\n",
    "        # 检查是否退出\n",
    "        if user_input.strip().lower() == \"退出\":\n",
    "            print(\"对话结束，感谢使用！\")\n",
    "            break\n",
    "        \n",
    "        # 将用户输入添加到对话历史\n",
    "        conversation.append({\"role\": \"user\", \"content\": user_input})\n",
    "        \n",
    "        # 调用 advanced_chat 函数生成回答\n",
    "        response = advanced_chat(conversation, model=\"gpt-4o-mini\", max_tokens=200, temperature=0.5)\n",
    "        \n",
    "        # 打印模型的回答\n",
    "        print(f\"模型: {response}\\n\")\n",
    "        \n",
    "        # 将模型的回答添加到对话历史\n",
    "        conversation.append({\"role\": \"assistant\", \"content\": response})\n",
    "# 运行交互式多轮对话\n",
    "interactive_chat()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
