{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "11482e6a-4300-4edd-bb28-a98ad45daa18",
   "metadata": {
    "tags": []
   },
   "source": [
    "## 基本问答函数回顾"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d19b6070-7d22-437c-b5de-3aed67227f0a",
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:39:22.774473Z",
     "iopub.status.busy": "2026-03-17T13:39:22.774303Z",
     "iopub.status.idle": "2026-03-17T13:39:23.252937Z",
     "shell.execute_reply": "2026-03-17T13:39:23.251253Z",
     "shell.execute_reply.started": "2026-03-17T13:39:22.774457Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# python包引入\n",
    "import os\n",
    "from openai import OpenAI\n",
    "\n",
    "# 获取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])\n",
    "\n",
    "\n",
    "# 问答函数定义\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\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9be2350-ef9d-4334-9dea-01a5bb95bb13",
   "metadata": {
    "tags": []
   },
   "source": [
    "## 零样本提示词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "66bda8e7-9d5c-4cd2-9b64-c3be28514e10",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:39:24.755861Z",
     "iopub.status.busy": "2026-03-17T13:39:24.755624Z",
     "iopub.status.idle": "2026-03-17T13:39:27.278055Z",
     "shell.execute_reply": "2026-03-17T13:39:27.277514Z",
     "shell.execute_reply.started": "2026-03-17T13:39:24.755842Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "小明最初有5个苹果，吃掉2个后剩下：\n",
      "\n",
      "5 - 2 = 3\n",
      "\n",
      "然后他又买了3个苹果：\n",
      "\n",
      "3 + 3 = 6\n",
      "\n",
      "所以，小明现在还剩下6个苹果。\n"
     ]
    }
   ],
   "source": [
    "## 简单数学计算任务\n",
    "prompt = \"小明有五个苹果，吃掉2个后买了三个，现在还剩多少？\" #提示词\n",
    "\n",
    "messages = [{'role': 'user', 'content': prompt}]\n",
    "res = chat(model=\"gpt-4o-mini\", messages=messages)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "176ed0e0-9d6c-4cd5-a029-b06a755da812",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:39:30.088461Z",
     "iopub.status.busy": "2026-03-17T13:39:30.088274Z",
     "iopub.status.idle": "2026-03-17T13:39:31.482752Z",
     "shell.execute_reply": "2026-03-17T13:39:31.482227Z",
     "shell.execute_reply.started": "2026-03-17T13:39:30.088444Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "情感：中性\n"
     ]
    }
   ],
   "source": [
    "## 简单文本分类任务\n",
    "prompt = \"\"\"\n",
    "将文本分类为中性、负面或正面。\n",
    "文本：我认为这次假期还可以。\n",
    "情感：\n",
    "\"\"\"\n",
    "\n",
    "messages = [{'role': 'user', 'content': prompt}]\n",
    "res = chat(model=\"gpt-4o-mini\", messages=messages)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06c750ad-7ee3-4889-9e57-e9ef0d0479d7",
   "metadata": {
    "tags": []
   },
   "source": [
    "## 少样本提示词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "05597337-b90b-4cee-80f3-6f872bcdd055",
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:39:33.563464Z",
     "iopub.status.busy": "2026-03-17T13:39:33.563254Z",
     "iopub.status.idle": "2026-03-17T13:39:34.829139Z",
     "shell.execute_reply": "2026-03-17T13:39:34.828536Z",
     "shell.execute_reply.started": "2026-03-17T13:39:33.563442Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "这太棒了！// Negative\n",
      "这太糟糕了！// Positive\n",
      "哇，那部电影太棒了！// Positive\n",
      "多么可怕的节目！//\n",
      "\n",
      "多么可怕的节目！// Negative\n"
     ]
    }
   ],
   "source": [
    "# 从样例中学习任务要求：“文本情感分类”\n",
    "\n",
    "example_1 = \"这太棒了！// Negative\"\n",
    "example_2 = \"这太糟糕了！// Positive\"\n",
    "example_3 = \"哇，那部电影太棒了！// Positive\"\n",
    "\n",
    "\n",
    "prompt = f\"\"\"\n",
    "\n",
    "{example_1}\n",
    "{example_2}\n",
    "{example_3}\n",
    "多么可怕的节目！//\n",
    "\"\"\"\n",
    "print(prompt)\n",
    "\n",
    "# prompt = example_1+example_2+example_3+prompt\n",
    "\n",
    "messages = [{'role': 'user', 'content': prompt}]\n",
    "res = chat(model=\"gpt-4o-mini\", messages=messages)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "961788f9-ca0b-4c45-a094-acb5ea36f9e7",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:39:37.712345Z",
     "iopub.status.busy": "2026-03-17T13:39:37.712143Z",
     "iopub.status.idle": "2026-03-17T13:39:39.779941Z",
     "shell.execute_reply": "2026-03-17T13:39:39.779367Z",
     "shell.execute_reply.started": "2026-03-17T13:39:37.712324Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "当孩子们在公园里玩耍时，他们不停地farduddle，欢声笑语充满了整个场地。\n"
     ]
    }
   ],
   "source": [
    "# 可以从样例中限制LLM回答任务时的思考方式：“造中文的例子”\n",
    "prompt = \"\"\"\n",
    "“whatpu”是坦桑尼亚的一种小型毛茸茸的动物。一个使用whatpu这个词的句子的例子是：\n",
    "我们在非洲旅行时看到了这些非常可爱的whatpus。\n",
    "“farduddle”是指快速跳上跳下。一个使用farduddle这个词的句子的例子是：\n",
    "\"\"\"\n",
    "\n",
    "messages = [{'role': 'user', 'content': prompt}]\n",
    "res = chat(model=\"gpt-4o-mini\", messages=messages)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cea8b46b-775c-43f3-8435-e8247013b989",
   "metadata": {
    "tags": []
   },
   "source": [
    "## 思维链提示词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "28dbfb25-224b-4737-8490-40610a3fd1e3",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:39:41.942455Z",
     "iopub.status.busy": "2026-03-17T13:39:41.942252Z",
     "iopub.status.idle": "2026-03-17T13:39:44.968182Z",
     "shell.execute_reply": "2026-03-17T13:39:44.967618Z",
     "shell.execute_reply.started": "2026-03-17T13:39:41.942436Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们来分析这组数中的奇数：15、5、13、7、1。\n",
      "\n",
      "将它们相加：\n",
      "\\[ 15 + 5 + 13 + 7 + 1 = 41 \\]\n",
      "\n",
      "41是一个奇数，因此这组数中的奇数加起来不是偶数。\n",
      "\n",
      "所以答案为False。\n"
     ]
    }
   ],
   "source": [
    "prompt = \"\"\"\n",
    "这组数中的奇数加起来是偶数：4、8、9、15、12、2、1。\n",
    "A：将所有奇数相加（9、15、1）得到25。答案为False。\n",
    "这组数中的奇数加起来是偶数：17、10、19、4、8、12、24。\n",
    "A：将所有奇数相加（17、19）得到36。答案为True。\n",
    "这组数中的奇数加起来是偶数：16、11、14、4、8、13、24。\n",
    "A：将所有奇数相加（11、13）得到24。答案为True。\n",
    "这组数中的奇数加起来是偶数：17、9、10、12、13、4、2。\n",
    "A：将所有奇数相加（17、9、13）得到39。答案为False。\n",
    "这组数中的奇数加起来是偶数：15、32、5、13、82、7、1。\n",
    "A：\n",
    "\"\"\"\n",
    "\n",
    "messages = [{'role': 'user', 'content': prompt}]\n",
    "res = chat(model=\"gpt-4o-mini\", messages=messages)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "78ba0c26-4d71-4194-8558-bdc1541e7a7a",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-24T13:43:02.574745Z",
     "iopub.status.busy": "2025-10-24T13:43:02.574543Z",
     "iopub.status.idle": "2025-10-24T13:43:12.616961Z",
     "shell.execute_reply": "2025-10-24T13:43:12.616551Z",
     "shell.execute_reply.started": "2025-10-24T13:43:02.574730Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "不含CoT的提示词输出：\n",
      "根据您的描述，您身上出现了红色的疹子并伴有明显的瘙痒，主要集中在手臂和腿部，同时您最近吃了海鲜，这可能与过敏有关。以下是一些导诊建议：\n",
      "\n",
      "1. **就医建议**：建议您尽快去皮肤科就诊。医生可以通过检查疹子的特征和分布情况，帮助您判断是否为过敏反应或其他皮肤疾病。\n",
      "\n",
      "2. **记录症状**：在就医前，请尽量记录下疹子的出现时间、症状变化、瘙痒的程度以及您最近的饮食和生活习惯，这将有助于医生做出更准确的判断。\n",
      "\n",
      "3. **避免抓挠**：为了防止皮肤进一步损伤和感染，尽量避免抓挠疹子。\n",
      "\n",
      "4. **服用抗过敏药物**：如果您有过敏史，可以考虑服用一些非处方的抗过敏药物（如氯雷他定），但最好在医生建议下使用。\n",
      "\n",
      "5. **观察其他症状**：注意是否伴随有其他症状，如呼吸困难、肿胀等，如果出现这些严重症状，请立即就医。\n",
      "\n",
      "希望您能尽快就医，早日恢复健康！\n",
      "\n",
      "含CoT的提示词输出：\n",
      "根据患者的描述，我们可以按照步骤进行分析：\n",
      "\n",
      "1. **提取关键症状**：\n",
      "   - 红色疹子\n",
      "   - 特别痒\n",
      "   - 主要集中在手臂和腿上\n",
      "\n",
      "2. **分析可能原因**：\n",
      "   - 过敏反应：最近吃了海鲜，可能导致皮肤过敏。\n",
      "   - 湿疹：可能是由于皮肤干燥或者其他刺激因素引起的。\n",
      "   - 其他皮肤病：如荨麻疹、皮肤感染等。\n",
      "\n",
      "3. **排除法**：\n",
      "   - 如果疹子没有伴随发热、全身不适或其他系统性症状，可能性较低的原因包括严重感染或系统性疾病。\n",
      "   - 如果疹子仅限于手臂和腿，可能性较低的原因是全身性疾病（如系统性红斑狼疮等）。\n",
      "\n",
      "4. **初步判断**：\n",
      "   - 患者的症状表现出可能是海鲜过敏引起的皮肤反应，尤其是考虑到最近的饮食变化。\n",
      "   - 建议患者避免继续食用海鲜，并观察是否有改善。\n",
      "   - 若症状持续或加重，建议就医，进行过敏原检测或皮肤科检查。\n",
      "\n",
      "**导诊建议**：\n",
      "- 请患者尽量避免接触海鲜及其他可能的过敏原。\n",
      "- 可以使用一些抗过敏药物（如抗组胺药）来缓解瘙痒。\n",
      "- 如果症状没有改善或出现呼吸困难、面部肿胀等严重反应，建议立即就医。\n",
      "\n"
     ]
    }
   ],
   "source": [
    "## 医学导诊实操\n",
    "\n",
    "description = \"我身上长了一些红色的疹子，特别痒，主要集中在手臂和腿上。这两天吃了海鲜，不知道是不是过敏。\"\n",
    "### 不含CoT的提示词\n",
    "prompt = f\"\"\"\n",
    "请根据患者生成对应的导诊建议，患者描述：{description}\n",
    "\"\"\"\n",
    "messages = [{'role': 'user', 'content': prompt}]\n",
    "res = chat(model=\"gpt-4o-mini\", messages=messages)\n",
    "print(f\"不含CoT的提示词输出：\\n{res}\\n\")\n",
    "\n",
    "\n",
    "### 含CoT的提示词\n",
    "prompt = f\"\"\"\n",
    "请根据患者生成对应的导诊建议，分析时请参考以下步骤逐步推理：\n",
    "\t1、提取关键症状：提取患者描述中提到的关键症状 \n",
    "\t2、分析可能原因：分析可能导致症状的原因\n",
    "\t3、排除法：排除不可能的症状原因\n",
    "\t4、初步判断：病情进行初步判断和总结 \n",
    "患者描述:{description}\n",
    "\"\"\"\n",
    "\n",
    "messages = [{'role': 'user', 'content': prompt}]\n",
    "res = chat(model=\"gpt-4o-mini\", messages=messages)\n",
    "print(f\"含CoT的提示词输出：\\n{res}\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "74953cef-3fcc-4431-97ac-b7e9e7c05ed5",
   "metadata": {
    "tags": []
   },
   "source": [
    "## 医学诊断实操"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e5e73e59-1e64-4f3e-a3e4-a350cfa964e2",
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:40:00.355874Z",
     "iopub.status.busy": "2026-03-17T13:40:00.355629Z",
     "iopub.status.idle": "2026-03-17T13:40:00.407489Z",
     "shell.execute_reply": "2026-03-17T13:40:00.407006Z",
     "shell.execute_reply.started": "2026-03-17T13:40:00.355853Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# python包引入\n",
    "import os\n",
    "from openai import OpenAI\n",
    "\n",
    "# 获取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])\n",
    "\n",
    "\n",
    "# 问答函数定义\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": 8,
   "id": "2645e89f-a6de-4e94-90c8-76770c890786",
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:40:12.712132Z",
     "iopub.status.busy": "2026-03-17T13:40:12.711955Z",
     "iopub.status.idle": "2026-03-17T13:40:24.094176Z",
     "shell.execute_reply": "2026-03-17T13:40:24.093527Z",
     "shell.execute_reply.started": "2026-03-17T13:40:12.712116Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "少样本提示结果： 患者男性，28岁，发热咳嗽3天，黄痰，右肺湿啰音，白细胞计数（WBC）升高（12×10^9/L），提示存在感染性炎症。\n",
      "\n",
      "结合临床表现和体征，最可能的诊断是：\n",
      "\n",
      "**社区获得性肺炎（CAP）——右肺区细菌性肺炎**\n",
      "\n",
      "理由：\n",
      "- 发热、咳嗽、黄色脓痰提示呼吸道感染；\n",
      "- 右肺湿啰音提示局限性肺部炎症或积液；\n",
      "- 白细胞升高提示细菌感染。\n",
      "\n",
      "建议进一步胸部影像学检查（如X线胸片）确诊，并根据病原学特点进行抗菌治疗。\n",
      "\n",
      "无少样本提示结果: 患者男，28岁，发热3天，咳嗽伴黄痰，右肺有湿啰音，白细胞计数升高（WBC 12×10^9/L），提示存在感染性炎症，结合临床表现和体征，最可能的诊断是：\n",
      "\n",
      "**社区获得性肺炎（CAP）——右肺炎症感染**\n",
      "\n",
      "理由如下：\n",
      "1. 发热、咳嗽、黄痰提示呼吸道感染，黄痰提示细菌感染可能性大。\n",
      "2. 右肺湿啰音提示右肺有炎症性分泌物积聚。\n",
      "3. 白细胞升高反映机体对感染的炎症反应。\n",
      "  \n",
      "建议：\n",
      "- 进一步做胸部X线检查确认肺部炎症范围及性质。\n",
      "- 根据病情选择合适的抗生素治疗。\n",
      "- 监测病情变化及实验室指标。\n",
      "\n",
      "总结：该患者临床表现及实验室检查符合右肺社区获得性细菌性肺炎的诊断。\n"
     ]
    }
   ],
   "source": [
    "# 1. 少样本提示 (Few-Shot Prompting) - 医学诊断案例\n",
    "few_shot_prompt = [\n",
    "    {\"role\": \"user\", \"content\": \"患者：女，65岁，多饮多尿3个月，体重下降5kg，空腹血糖8.9mmol/L。可能的诊断是？\"},\n",
    "    {\"role\": \"assistant\", \"content\": \"该患者符合糖尿病典型症状：1. 三多一少症状 2. 空腹血糖≥7.0mmol/L。初步诊断：2型糖尿病\"},\n",
    "    {\"role\": \"user\", \"content\": \"患者：男，28岁，发热咳嗽3天，黄痰，右肺湿啰音，WBC 12×10^9/L。可能的诊断是？\"}\n",
    "]\n",
    "\n",
    "response = chat(model=\"gpt-3.5-turbo\", messages=few_shot_prompt)\n",
    "print(\"少样本提示结果：\", response)\n",
    "\n",
    "messages = [\n",
    "    {\"role\": \"user\", \"content\": \"患者：男，28岁，发热咳嗽3天，黄痰，右肺湿啰音，WBC 12×10^9/L。可能的诊断是？\"}\n",
    "]\n",
    "response = chat(model=\"gpt-3.5-turbo\", messages=messages)\n",
    "print(\"\\n无少样本提示结果:\",response)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "544f2be6-ee66-4fb6-a2a7-366d7c0ced48",
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "execution": {
     "iopub.execute_input": "2025-10-24T13:43:31.665775Z",
     "iopub.status.busy": "2025-10-24T13:43:31.665571Z",
     "iopub.status.idle": "2025-10-24T13:43:38.033326Z",
     "shell.execute_reply": "2025-10-24T13:43:38.032917Z",
     "shell.execute_reply.started": "2025-10-24T13:43:31.665760Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "思维链结果： 分步分析如下：\n",
      "\n",
      "1. 首先需要排除的最危急情况是心肌梗死。胸痛持续时间较长，呈压榨性，向左肩放射，伴大汗，高血压病史，心电图显示ST段抬高，这些都是心肌梗死的典型表现。\n",
      "\n",
      "2. 需要立即进行心肌酶检查（如肌钙蛋白、肌酸激酶-MB等），心电图监测，血液生化检查（包括心肌标志物、电解质、肝肾功能等）以及冠状动脉造影等检查。\n",
      "\n",
      "3. 可能的鉴别诊断包括心绞痛、主动脉夹层、心包炎、肺栓塞等。心绞痛的特点是胸痛发作较短，通常在休息或药物后缓解；主动脉夹层常伴有急性剧烈的背部疼痛；心包炎可出现胸痛、呼吸困难等症状；肺栓塞可出现胸痛、呼吸困难、咯血等症状。\n",
      "\n",
      "4. 最可能的诊断是急性心肌梗死。根据患者的病史、症状以及心电图表现，急性心肌梗死的可能性最高。需要立即进行相关检查以确认诊断，并尽早进行治疗以减少心肌损伤。\n",
      "\n",
      "无思维链结果: 可能的诊断是急性心肌梗死。\n"
     ]
    }
   ],
   "source": [
    "# 2. 思维链 (Chain-of-Thought) - 临床推理案例\n",
    "\n",
    "# with open(\"patient.txt\",\"r\") as f:\n",
    "#     patients = f.readlines()\n",
    "#     cnt = 1\n",
    "#     for p in patients:\n",
    "#         print(f\"患者:{cnt},病情记录:{p}\")\n",
    "#         cnt+=1\n",
    "\n",
    "cot_prompt = \"\"\"请分步骤分析以下病例：\n",
    "患者女，42岁，主诉胸痛2小时。疼痛呈压榨性，向左肩放射，伴大汗。有高血压病史5年。心电图显示II、III、aVF导联ST段抬高。\n",
    "\n",
    "请逐步思考：\n",
    "1. 首先需要排除的最危急情况是什么？\n",
    "2. 需要立即进行哪些检查？\n",
    "3. 可能的鉴别诊断有哪些？\n",
    "4. 给出最可能的诊断\"\"\"\n",
    "\n",
    "messages = [{\"role\": \"user\", \"content\": cot_prompt}]\n",
    "print(\"\\n思维链结果：\", chat(model=\"gpt-3.5-turbo\", messages=messages))\n",
    "\n",
    "messages = [\n",
    "    {\"role\": \"user\", \"content\": \"患者女，42岁，主诉胸痛2小时。疼痛呈压榨性，向左肩放射，伴大汗。有高血压病史5年。心电图显示II、III、aVF导联ST段抬高。可能的诊断是？\"}\n",
    "]\n",
    "response = chat(model=\"gpt-3.5-turbo\", messages=messages)\n",
    "print(\"\\n无思维链结果:\",response)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cd10190a-9167-4ed5-b5e2-436d7bdf53bf",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-10-24T13:43:52.566213Z",
     "iopub.status.busy": "2025-10-24T13:43:52.566003Z"
    },
    "scrolled": true,
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 3. 自我一致性 (Self-Consistency) - 治疗方案选择\n",
    "self_consistency_prompt = \"\"\"对于初诊的2型糖尿病患者（HbA1c 8.5%），给出三种不同的合理治疗方案，并说明理由：\n",
    "方案1: \n",
    "方案2: \n",
    "方案3: \"\"\"\n",
    "\n",
    "responses = [chat(model=\"gpt-4o-mini\", \n",
    "                messages=[{\"role\": \"user\", \"content\": self_consistency_prompt}],\n",
    "                temperature=0.9) for _ in range(3)]\n",
    "\n",
    "print(\"\\n自我一致性结果：\")\n",
    "for i, res in enumerate(responses):\n",
    "    print(f\"\\n尝试{i}: {res}\\n\")  # 截取部分内容展示"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "746f2829-b7dd-461a-8508-638f586ca226",
   "metadata": {},
   "source": [
    "## 拓展：利用思维树解决数学小游戏"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e8e6ea4f-4ca4-4510-83c2-de1a295747af",
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:41:50.949110Z",
     "iopub.status.busy": "2026-03-17T13:41:50.948914Z",
     "iopub.status.idle": "2026-03-17T13:41:51.002613Z",
     "shell.execute_reply": "2026-03-17T13:41:51.001990Z",
     "shell.execute_reply.started": "2026-03-17T13:41:50.949091Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import itertools\n",
    "import re\n",
    "from openai import OpenAI\n",
    "import os\n",
    "\n",
    "# 获取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])\n",
    "\n",
    "import re\n",
    "import json\n",
    "from openai import OpenAI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "fddbccbc-8e94-48a0-908b-ccb7b5862a72",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:41:52.207075Z",
     "iopub.status.busy": "2026-03-17T13:41:52.206897Z",
     "iopub.status.idle": "2026-03-17T13:41:52.211553Z",
     "shell.execute_reply": "2026-03-17T13:41:52.210965Z",
     "shell.execute_reply.started": "2026-03-17T13:41:52.207057Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import json\n",
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "class Expert:\n",
    "    \"\"\"专家类，代表一个独立的思考者\"\"\"\n",
    "    \n",
    "    def __init__(self, expert_id, target, numbers):\n",
    "        \"\"\"\n",
    "        初始化专家实例\n",
    "        :param expert_id: 专家编号（0-2）\n",
    "        :param target: 目标数字\n",
    "        :param numbers: 当前处理的数字列表\n",
    "        \"\"\"\n",
    "        self.id = expert_id  # 专家唯一标识\n",
    "        self.target = target  # 目标数字\n",
    "        self.numbers = numbers  # 当前处理的数字\n",
    "        self.steps = []  # 专家提出的步骤记录\n",
    "        self.active = True  # 专家是否仍在参与思考\n",
    "        self.role = self._assign_role()  # 分配专家角色\n",
    "\n",
    "    def _assign_role(self):\n",
    "        \"\"\"为专家分配特定角色，以引导不同的思考方向\"\"\"\n",
    "        roles = {\n",
    "            0: \"加法专家：擅长通过加法组合数字\",\n",
    "            1: \"乘法专家：擅长通过乘法组合数字\",\n",
    "            2: \"综合专家：擅长结合加法和乘法\"\n",
    "        }\n",
    "        return roles.get(self.id, \"普通专家\")\n",
    "\n",
    "    def add_step(self, step):\n",
    "        \"\"\"记录专家提出的步骤\"\"\"\n",
    "        self.steps.append(step)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d6dd13e5-0bf3-4d77-be54-3b07a259d539",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:41:54.747890Z",
     "iopub.status.busy": "2026-03-17T13:41:54.747687Z",
     "iopub.status.idle": "2026-03-17T13:41:54.760703Z",
     "shell.execute_reply": "2026-03-17T13:41:54.759691Z",
     "shell.execute_reply.started": "2026-03-17T13:41:54.747871Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "class SimpleMathSolver:\n",
    "    \"\"\"简单数学等式求解器，采用思维树方法\"\"\"\n",
    "    \n",
    "    def __init__(self, target, numbers):\n",
    "        \"\"\"\n",
    "        初始化求解器\n",
    "        :param target: 目标数字\n",
    "        :param numbers: 需要处理的数字列表\n",
    "        \"\"\"\n",
    "        self.target = target  # 目标数字\n",
    "        self.numbers = numbers  # 原始数字\n",
    "        self.experts = [Expert(i, target, numbers) for i in range(3)]  # 创建3位专家\n",
    "        self.shared_steps = []  # 专家共享的步骤池\n",
    "        self.solution = None  # 最终解决方案\n",
    "        self.history = set()  # 记录历史步骤，避免重复\n",
    "\n",
    "    def _generate_prompt(self, expert):\n",
    "        \"\"\"\n",
    "        为指定专家生成提示词\n",
    "        :param expert: 当前专家实例\n",
    "        :return: 构造好的提示词字符串\n",
    "        \"\"\"\n",
    "        prompt = f\"\"\"你是一位{expert.role}，正在和其他两位专家协作解决简单数学等式问题。目标数字：{self.target}，当前数字：{self.numbers}\n",
    "\n",
    "已共享的思考步骤（最新三条）：\n",
    "{self.shared_steps[-3:] if self.shared_steps else '无'}\n",
    "\n",
    "历史尝试（避免重复）：\n",
    "{self.history if self.history else '无'}\n",
    "\n",
    "请按以下格式进行思考：\n",
    "1. 分析当前数字特征或已有步骤\n",
    "2. 提出具体的加法或乘法运算建议\n",
    "3. 说明这个步骤的合理性\n",
    "4. 检查步骤是否符合规则（使用所有数字且结果为{self.target}）\n",
    "\n",
    "请用JSON格式返回你的下一步思考：\n",
    "{{\"analysis\": \"分析内容\", \"operation\": \"具体运算步骤\", \"reason\": \"理由说明\"}}\"\"\"\n",
    "        return prompt\n",
    "\n",
    "    def _validate_step(self, step):\n",
    "        \"\"\"\n",
    "        验证步骤的有效性\n",
    "        :param step: 待验证的步骤字符串\n",
    "        :return: 是否有效\n",
    "        \"\"\"\n",
    "        try:\n",
    "            # 提取表达式中的数字\n",
    "            expr = step.split(\"=\")[0].strip()\n",
    "            used_numbers = [float(n) for n in re.findall(r'\\d+\\.?\\d*', expr)]\n",
    "            # 验证数字是否匹配且数量正确\n",
    "            return sorted(used_numbers) == sorted(self.numbers)\n",
    "        except:\n",
    "            return False\n",
    "\n",
    "    def _execute_step(self, expert):\n",
    "        \"\"\"\n",
    "        执行专家的一个思考步骤\n",
    "        :param expert: 当前专家实例\n",
    "        :return: 是否找到解决方案\n",
    "        \"\"\"\n",
    "        try:\n",
    "            # 调用大模型生成思考步骤\n",
    "            response = client.chat.completions.create(\n",
    "                model=\"gpt-4o-mini\",\n",
    "                messages=[{\"role\": \"user\", \"content\": self._generate_prompt(expert)}],\n",
    "                temperature=0.7,\n",
    "                max_tokens=300\n",
    "            )\n",
    "            # 解析模型返回的内容\n",
    "            content = json.loads(response.choices[0].message.content)\n",
    "            step = f\"专家{expert.id}：{content['operation']}（理由：{content['reason']}）\"\n",
    "            \n",
    "            # 检查步骤是否重复\n",
    "            if step in self.history:\n",
    "                expert.active = False\n",
    "                return False\n",
    "            \n",
    "            # 记录历史步骤\n",
    "            self.history.add(step)\n",
    "            \n",
    "            # 验证步骤有效性\n",
    "            if self._validate_step(content['operation']):\n",
    "                # 将有效步骤加入共享池\n",
    "                self.shared_steps.append(step)\n",
    "                expert.add_step(step)\n",
    "                \n",
    "                # 检查是否找到最终解\n",
    "                if self._check_solution(content['operation']):\n",
    "                    self.solution = content['operation']\n",
    "                    return True\n",
    "            else:\n",
    "                # 无效步骤淘汰专家\n",
    "                expert.active = False\n",
    "        except:\n",
    "            # 异常情况淘汰专家\n",
    "            expert.active = False\n",
    "        return False\n",
    "\n",
    "    def _check_solution(self, expr):\n",
    "        \"\"\"\n",
    "        检查表达式是否等于目标数字\n",
    "        :param expr: 待检查的表达式\n",
    "        :return: 是否等于目标数字\n",
    "        \"\"\"\n",
    "        try:\n",
    "            return abs(eval(expr.split(\"=\")[0]) - self.target) < 1e-6\n",
    "        except:\n",
    "            return False\n",
    "\n",
    "    def solve(self, max_steps=6):\n",
    "        \"\"\"\n",
    "        主求解方法\n",
    "        :param max_steps: 最大迭代次数\n",
    "        \"\"\"\n",
    "        for _ in range(max_steps):\n",
    "            if self.solution:\n",
    "                break\n",
    "            \n",
    "            # 获取仍在活动的专家\n",
    "            active_experts = [e for e in self.experts if e.active]\n",
    "            if not active_experts:\n",
    "                break\n",
    "\n",
    "            # 让每个专家执行一步思考\n",
    "            for expert in active_experts:\n",
    "                if self._execute_step(expert):\n",
    "                    return\n",
    "\n",
    "        # 最终检查所有专家的步骤\n",
    "        for expert in self.experts:\n",
    "            for step in expert.steps:\n",
    "                if self._check_solution(step):\n",
    "                    self.solution = step.split(\"：\")[1]\n",
    "                    return"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "8eaa6449-1f55-41a1-b1dd-ab4a46994bb8",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2026-03-17T13:41:59.282474Z",
     "iopub.status.busy": "2026-03-17T13:41:59.282308Z",
     "iopub.status.idle": "2026-03-17T13:42:15.057066Z",
     "shell.execute_reply": "2026-03-17T13:42:15.056143Z",
     "shell.execute_reply.started": "2026-03-17T13:41:59.282459Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "请输入目标数字： 10\n",
      "请输入一组数字（用空格分隔）： 2 3\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "未找到有效解法\n"
     ]
    }
   ],
   "source": [
    "if __name__ == \"__main__\":\n",
    "    # 用户输入处理\n",
    "    target = float(input(\"请输入目标数字：\"))\n",
    "    numbers = input(\"请输入一组数字（用空格分隔）：\").split()\n",
    "    numbers = [float(n) for n in numbers]\n",
    "    \n",
    "    # 创建求解器并求解\n",
    "    solver = SimpleMathSolver(target, numbers)\n",
    "    solver.solve()\n",
    "    \n",
    "    # 输出结果\n",
    "    if solver.solution:\n",
    "        print(f\"\\n找到解法：{solver.solution} = {target}\")\n",
    "        print(\"\\n协作过程记录：\")\n",
    "        for idx, step in enumerate(solver.shared_steps, 1):\n",
    "            print(f\"步骤{idx}: {step}\")\n",
    "    else:\n",
    "        print(\"未找到有效解法\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5d094648-ece9-4a4e-bcd3-be6c367f83ce",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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
}
