|
@@ -2,6 +2,7 @@
|
|
|
"cells": [
|
|
"cells": [
|
|
|
{
|
|
{
|
|
|
"cell_type": "code",
|
|
"cell_type": "code",
|
|
|
|
|
+ "execution_count": null,
|
|
|
"id": "938b2e36-f95c-4b0f-8770-335c6bb5bc0e",
|
|
"id": "938b2e36-f95c-4b0f-8770-335c6bb5bc0e",
|
|
|
"metadata": {
|
|
"metadata": {
|
|
|
"ExecuteTime": {
|
|
"ExecuteTime": {
|
|
@@ -9,6 +10,7 @@
|
|
|
"start_time": "2026-01-14T15:56:53.608893241Z"
|
|
"start_time": "2026-01-14T15:56:53.608893241Z"
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+ "outputs": [],
|
|
|
"source": [
|
|
"source": [
|
|
|
"import requests\n",
|
|
"import requests\n",
|
|
|
"import os\n",
|
|
"import os\n",
|
|
@@ -36,23 +38,28 @@
|
|
|
"- `get_weather(city: str)`: 查询指定城市的实时天气。\n",
|
|
"- `get_weather(city: str)`: 查询指定城市的实时天气。\n",
|
|
|
"- `get_attraction(city: str, weather: str)`: 根据城市和天气搜索推荐的旅游景点。\n",
|
|
"- `get_attraction(city: str, weather: str)`: 根据城市和天气搜索推荐的旅游景点。\n",
|
|
|
"\n",
|
|
"\n",
|
|
|
- "# 行动格式:\n",
|
|
|
|
|
- "你的回答必须严格遵循以下格式。首先是你的思考过程,然后是你要执行的具体行动,每次回复只输出一对Thought-Action:\n",
|
|
|
|
|
- "Thought: [这里是你的思考过程和下一步计划]\n",
|
|
|
|
|
- "Action: 你决定采取的行动,必须是以下格式之一:\n",
|
|
|
|
|
- "- `function_name(arg_name=\"arg_value\")`:调用一个可用工具。\n",
|
|
|
|
|
- "- `Finish[最终答案]`:当你认为已经获得最终答案时。\n",
|
|
|
|
|
- "- 当你收集到足够的信息,能够回答用户的最终问题时,你必须在Action:字段后使用 Finish[最终答案] 来输出最终答案。\n",
|
|
|
|
|
|
|
+ "# 输出格式要求:\n",
|
|
|
|
|
+ "你的每次回复必须严格遵循以下格式,包含一对Thought和Action:\n",
|
|
|
|
|
+ "\n",
|
|
|
|
|
+ "Thought: [你的思考过程和下一步计划]\n",
|
|
|
|
|
+ "Action: [你要执行的具体行动]\n",
|
|
|
"\n",
|
|
"\n",
|
|
|
|
|
+ "Action的格式必须是以下之一:\n",
|
|
|
|
|
+ "1. 调用工具:function_name(arg_name=\"arg_value\")\n",
|
|
|
|
|
+ "2. 结束任务:Finish[最终答案]\n",
|
|
|
|
|
+ "\n",
|
|
|
|
|
+ "# 重要提示:\n",
|
|
|
|
|
+ "- 每次只输出一对Thought-Action\n",
|
|
|
|
|
+ "- Action必须在同一行,不要换行\n",
|
|
|
|
|
+ "- 当收集到足够信息可以回答用户问题时,必须使用 Action: Finish[最终答案] 格式结束\n",
|
|
|
"\n",
|
|
"\n",
|
|
|
"请开始吧!\n",
|
|
"请开始吧!\n",
|
|
|
- "\"\"\""
|
|
|
|
|
- ],
|
|
|
|
|
- "outputs": [],
|
|
|
|
|
- "execution_count": 8
|
|
|
|
|
|
|
+ "\"\"\"\n"
|
|
|
|
|
+ ]
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
"cell_type": "code",
|
|
"cell_type": "code",
|
|
|
|
|
+ "execution_count": 9,
|
|
|
"id": "66d9d404-3c95-42f2-8975-436769b3cb87",
|
|
"id": "66d9d404-3c95-42f2-8975-436769b3cb87",
|
|
|
"metadata": {
|
|
"metadata": {
|
|
|
"ExecuteTime": {
|
|
"ExecuteTime": {
|
|
@@ -60,6 +67,15 @@
|
|
|
"start_time": "2026-01-14T15:56:54.532054736Z"
|
|
"start_time": "2026-01-14T15:56:54.532054736Z"
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+ "outputs": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "name": "stdout",
|
|
|
|
|
+ "output_type": "stream",
|
|
|
|
|
+ "text": [
|
|
|
|
|
+ "✅ 工具函数定义完成!\n"
|
|
|
|
|
+ ]
|
|
|
|
|
+ }
|
|
|
|
|
+ ],
|
|
|
"source": [
|
|
"source": [
|
|
|
"def get_weather(city: str) -> str:\n",
|
|
"def get_weather(city: str) -> str:\n",
|
|
|
" \"\"\"\n",
|
|
" \"\"\"\n",
|
|
@@ -133,20 +149,11 @@
|
|
|
" \"get_attraction\": get_attraction,\n",
|
|
" \"get_attraction\": get_attraction,\n",
|
|
|
"}\n",
|
|
"}\n",
|
|
|
"print(\"✅ 工具函数定义完成!\")"
|
|
"print(\"✅ 工具函数定义完成!\")"
|
|
|
- ],
|
|
|
|
|
- "outputs": [
|
|
|
|
|
- {
|
|
|
|
|
- "name": "stdout",
|
|
|
|
|
- "output_type": "stream",
|
|
|
|
|
- "text": [
|
|
|
|
|
- "✅ 工具函数定义完成!\n"
|
|
|
|
|
- ]
|
|
|
|
|
- }
|
|
|
|
|
- ],
|
|
|
|
|
- "execution_count": 9
|
|
|
|
|
|
|
+ ]
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
"cell_type": "code",
|
|
"cell_type": "code",
|
|
|
|
|
+ "execution_count": 10,
|
|
|
"id": "e953fee4-9e3c-4e34-bf48-4ea002c3bb92",
|
|
"id": "e953fee4-9e3c-4e34-bf48-4ea002c3bb92",
|
|
|
"metadata": {
|
|
"metadata": {
|
|
|
"ExecuteTime": {
|
|
"ExecuteTime": {
|
|
@@ -154,6 +161,15 @@
|
|
|
"start_time": "2026-01-14T15:56:55.671146801Z"
|
|
"start_time": "2026-01-14T15:56:55.671146801Z"
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+ "outputs": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "name": "stdout",
|
|
|
|
|
+ "output_type": "stream",
|
|
|
|
|
+ "text": [
|
|
|
|
|
+ "✅ 智能助手类定义完成!\n"
|
|
|
|
|
+ ]
|
|
|
|
|
+ }
|
|
|
|
|
+ ],
|
|
|
"source": [
|
|
"source": [
|
|
|
"class OpenAICompatibleClient:\n",
|
|
"class OpenAICompatibleClient:\n",
|
|
|
" \"\"\"\n",
|
|
" \"\"\"\n",
|
|
@@ -211,20 +227,11 @@
|
|
|
" \"\"\"添加观察结果到历史\"\"\"\n",
|
|
" \"\"\"添加观察结果到历史\"\"\"\n",
|
|
|
" self.prompt_history.append(f\"Observation: {observation}\")\n",
|
|
" self.prompt_history.append(f\"Observation: {observation}\")\n",
|
|
|
"print(\"✅ 智能助手类定义完成!\")"
|
|
"print(\"✅ 智能助手类定义完成!\")"
|
|
|
- ],
|
|
|
|
|
- "outputs": [
|
|
|
|
|
- {
|
|
|
|
|
- "name": "stdout",
|
|
|
|
|
- "output_type": "stream",
|
|
|
|
|
- "text": [
|
|
|
|
|
- "✅ 智能助手类定义完成!\n"
|
|
|
|
|
- ]
|
|
|
|
|
- }
|
|
|
|
|
- ],
|
|
|
|
|
- "execution_count": 10
|
|
|
|
|
|
|
+ ]
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
"cell_type": "code",
|
|
"cell_type": "code",
|
|
|
|
|
+ "execution_count": 11,
|
|
|
"id": "ab5d3142-c119-46ad-a7a1-ec1aa2e79435",
|
|
"id": "ab5d3142-c119-46ad-a7a1-ec1aa2e79435",
|
|
|
"metadata": {
|
|
"metadata": {
|
|
|
"ExecuteTime": {
|
|
"ExecuteTime": {
|
|
@@ -232,6 +239,15 @@
|
|
|
"start_time": "2026-01-14T15:56:56.608751066Z"
|
|
"start_time": "2026-01-14T15:56:56.608751066Z"
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+ "outputs": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "name": "stdout",
|
|
|
|
|
+ "output_type": "stream",
|
|
|
|
|
+ "text": [
|
|
|
|
|
+ "✅ 显示函数定义完成!\n"
|
|
|
|
|
+ ]
|
|
|
|
|
+ }
|
|
|
|
|
+ ],
|
|
|
"source": [
|
|
"source": [
|
|
|
"\n",
|
|
"\n",
|
|
|
"def display_conversation(history):\n",
|
|
"def display_conversation(history):\n",
|
|
@@ -276,20 +292,11 @@
|
|
|
" \n",
|
|
" \n",
|
|
|
" return tool_name, kwargs\n",
|
|
" return tool_name, kwargs\n",
|
|
|
"print(\"✅ 显示函数定义完成!\")"
|
|
"print(\"✅ 显示函数定义完成!\")"
|
|
|
- ],
|
|
|
|
|
- "outputs": [
|
|
|
|
|
- {
|
|
|
|
|
- "name": "stdout",
|
|
|
|
|
- "output_type": "stream",
|
|
|
|
|
- "text": [
|
|
|
|
|
- "✅ 显示函数定义完成!\n"
|
|
|
|
|
- ]
|
|
|
|
|
- }
|
|
|
|
|
- ],
|
|
|
|
|
- "execution_count": 11
|
|
|
|
|
|
|
+ ]
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
"cell_type": "code",
|
|
"cell_type": "code",
|
|
|
|
|
+ "execution_count": 12,
|
|
|
"id": "cc543309-fe16-44a9-9735-bce828b9c7ad",
|
|
"id": "cc543309-fe16-44a9-9735-bce828b9c7ad",
|
|
|
"metadata": {
|
|
"metadata": {
|
|
|
"ExecuteTime": {
|
|
"ExecuteTime": {
|
|
@@ -297,6 +304,7 @@
|
|
|
"start_time": "2026-01-14T15:56:57.463244826Z"
|
|
"start_time": "2026-01-14T15:56:57.463244826Z"
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+ "outputs": [],
|
|
|
"source": [
|
|
"source": [
|
|
|
"def run_assistant(user_input, max_iterations=5, display=True):\n",
|
|
"def run_assistant(user_input, max_iterations=5, display=True):\n",
|
|
|
" \"\"\"\n",
|
|
" \"\"\"\n",
|
|
@@ -378,12 +386,11 @@
|
|
|
" print(f\"⏰ 达到最大循环次数: {timeout_answer}\")\n",
|
|
" print(f\"⏰ 达到最大循环次数: {timeout_answer}\")\n",
|
|
|
" \n",
|
|
" \n",
|
|
|
" return timeout_answer, assistant.prompt_history"
|
|
" return timeout_answer, assistant.prompt_history"
|
|
|
- ],
|
|
|
|
|
- "outputs": [],
|
|
|
|
|
- "execution_count": 12
|
|
|
|
|
|
|
+ ]
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
"cell_type": "code",
|
|
"cell_type": "code",
|
|
|
|
|
+ "execution_count": 13,
|
|
|
"id": "3f6e44eb-ff3d-4060-b4c2-ea3e139bf307",
|
|
"id": "3f6e44eb-ff3d-4060-b4c2-ea3e139bf307",
|
|
|
"metadata": {
|
|
"metadata": {
|
|
|
"ExecuteTime": {
|
|
"ExecuteTime": {
|
|
@@ -391,28 +398,6 @@
|
|
|
"start_time": "2026-01-14T15:56:58.506429375Z"
|
|
"start_time": "2026-01-14T15:56:58.506429375Z"
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
- "source": [
|
|
|
|
|
- "# 测试示例\n",
|
|
|
|
|
- "def test_basic_example():\n",
|
|
|
|
|
- " \"\"\"测试北京天气+景点推荐的示例\"\"\"\n",
|
|
|
|
|
- " print(\"🚀 开始测试北京天气+景点推荐示例\")\n",
|
|
|
|
|
- " user_input = \"你好,请帮我查询一下今天北京的天气,然后根据天气推荐一个合适的旅游景点。\"\n",
|
|
|
|
|
- " \n",
|
|
|
|
|
- " final_answer, history = run_assistant(user_input, display=True)\n",
|
|
|
|
|
- " \n",
|
|
|
|
|
- " print(\"\\n\" + \"=\"*60)\n",
|
|
|
|
|
- " print(\"📊 测试完成!\")\n",
|
|
|
|
|
- " print(\"=\"*60)\n",
|
|
|
|
|
- " print(f\"最终答案: {final_answer}\")\n",
|
|
|
|
|
- " \n",
|
|
|
|
|
- " # 显示完整对话历史\n",
|
|
|
|
|
- " display_conversation(history)\n",
|
|
|
|
|
- " \n",
|
|
|
|
|
- " return final_answer, history\n",
|
|
|
|
|
- "\n",
|
|
|
|
|
- "# 运行测试示例\n",
|
|
|
|
|
- "final_answer, history = test_basic_example()"
|
|
|
|
|
- ],
|
|
|
|
|
"outputs": [
|
|
"outputs": [
|
|
|
{
|
|
{
|
|
|
"name": "stdout",
|
|
"name": "stdout",
|
|
@@ -481,10 +466,32 @@
|
|
|
]
|
|
]
|
|
|
}
|
|
}
|
|
|
],
|
|
],
|
|
|
- "execution_count": 13
|
|
|
|
|
|
|
+ "source": [
|
|
|
|
|
+ "# 测试示例\n",
|
|
|
|
|
+ "def test_basic_example():\n",
|
|
|
|
|
+ " \"\"\"测试北京天气+景点推荐的示例\"\"\"\n",
|
|
|
|
|
+ " print(\"🚀 开始测试北京天气+景点推荐示例\")\n",
|
|
|
|
|
+ " user_input = \"你好,请帮我查询一下今天北京的天气,然后根据天气推荐一个合适的旅游景点。\"\n",
|
|
|
|
|
+ " \n",
|
|
|
|
|
+ " final_answer, history = run_assistant(user_input, display=True)\n",
|
|
|
|
|
+ " \n",
|
|
|
|
|
+ " print(\"\\n\" + \"=\"*60)\n",
|
|
|
|
|
+ " print(\"📊 测试完成!\")\n",
|
|
|
|
|
+ " print(\"=\"*60)\n",
|
|
|
|
|
+ " print(f\"最终答案: {final_answer}\")\n",
|
|
|
|
|
+ " \n",
|
|
|
|
|
+ " # 显示完整对话历史\n",
|
|
|
|
|
+ " display_conversation(history)\n",
|
|
|
|
|
+ " \n",
|
|
|
|
|
+ " return final_answer, history\n",
|
|
|
|
|
+ "\n",
|
|
|
|
|
+ "# 运行测试示例\n",
|
|
|
|
|
+ "final_answer, history = test_basic_example()"
|
|
|
|
|
+ ]
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
"cell_type": "code",
|
|
"cell_type": "code",
|
|
|
|
|
+ "execution_count": 14,
|
|
|
"id": "68c735c1-eb3e-40e7-8b70-2be941798187",
|
|
"id": "68c735c1-eb3e-40e7-8b70-2be941798187",
|
|
|
"metadata": {
|
|
"metadata": {
|
|
|
"ExecuteTime": {
|
|
"ExecuteTime": {
|
|
@@ -492,6 +499,7 @@
|
|
|
"start_time": "2026-01-14T15:58:30.317379757Z"
|
|
"start_time": "2026-01-14T15:58:30.317379757Z"
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+ "outputs": [],
|
|
|
"source": [
|
|
"source": [
|
|
|
"def interactive_travel_assistant():\n",
|
|
"def interactive_travel_assistant():\n",
|
|
|
" \"\"\"\n",
|
|
" \"\"\"\n",
|
|
@@ -537,12 +545,11 @@
|
|
|
" print(f\"🚀 快速测试: {user_input}\")\n",
|
|
" print(f\"🚀 快速测试: {user_input}\")\n",
|
|
|
" final_answer, _ = run_assistant(user_input, display=True)\n",
|
|
" final_answer, _ = run_assistant(user_input, display=True)\n",
|
|
|
" return final_answer"
|
|
" return final_answer"
|
|
|
- ],
|
|
|
|
|
- "outputs": [],
|
|
|
|
|
- "execution_count": 14
|
|
|
|
|
|
|
+ ]
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
"cell_type": "code",
|
|
"cell_type": "code",
|
|
|
|
|
+ "execution_count": 17,
|
|
|
"id": "bc58c911-8502-4cf5-aa3f-a9f57a94b679",
|
|
"id": "bc58c911-8502-4cf5-aa3f-a9f57a94b679",
|
|
|
"metadata": {
|
|
"metadata": {
|
|
|
"ExecuteTime": {
|
|
"ExecuteTime": {
|
|
@@ -550,28 +557,6 @@
|
|
|
"start_time": "2026-01-14T16:00:39.668510589Z"
|
|
"start_time": "2026-01-14T16:00:39.668510589Z"
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
- "source": [
|
|
|
|
|
- "# 主启动入口\n",
|
|
|
|
|
- "if __name__ == \"__main__\":\n",
|
|
|
|
|
- " # 可以选择直接运行测试示例\n",
|
|
|
|
|
- " print(\"选择运行模式:\")\n",
|
|
|
|
|
- " print(\"1. 运行测试示例 (北京)\")\n",
|
|
|
|
|
- " print(\"2. 交互模式\")\n",
|
|
|
|
|
- " print(\"3. 快速测试其他城市\")\n",
|
|
|
|
|
- " \n",
|
|
|
|
|
- " choice = input(\"请输入选择 (1/2/3): \").strip()\n",
|
|
|
|
|
- " \n",
|
|
|
|
|
- " if choice == \"1\":\n",
|
|
|
|
|
- " test_basic_example()\n",
|
|
|
|
|
- " elif choice == \"2\":\n",
|
|
|
|
|
- " interactive_travel_assistant()\n",
|
|
|
|
|
- " elif choice == \"3\":\n",
|
|
|
|
|
- " city = input(\"请输入要测试的城市: \").strip() or \"上海\"\n",
|
|
|
|
|
- " quick_test(city)\n",
|
|
|
|
|
- " else:\n",
|
|
|
|
|
- " print(\"无效选择,运行测试示例...\")\n",
|
|
|
|
|
- " test_basic_example()"
|
|
|
|
|
- ],
|
|
|
|
|
"outputs": [
|
|
"outputs": [
|
|
|
{
|
|
{
|
|
|
"name": "stdout",
|
|
"name": "stdout",
|
|
@@ -626,7 +611,28 @@
|
|
|
]
|
|
]
|
|
|
}
|
|
}
|
|
|
],
|
|
],
|
|
|
- "execution_count": 17
|
|
|
|
|
|
|
+ "source": [
|
|
|
|
|
+ "# 主启动入口\n",
|
|
|
|
|
+ "if __name__ == \"__main__\":\n",
|
|
|
|
|
+ " # 可以选择直接运行测试示例\n",
|
|
|
|
|
+ " print(\"选择运行模式:\")\n",
|
|
|
|
|
+ " print(\"1. 运行测试示例 (北京)\")\n",
|
|
|
|
|
+ " print(\"2. 交互模式\")\n",
|
|
|
|
|
+ " print(\"3. 快速测试其他城市\")\n",
|
|
|
|
|
+ " \n",
|
|
|
|
|
+ " choice = input(\"请输入选择 (1/2/3): \").strip()\n",
|
|
|
|
|
+ " \n",
|
|
|
|
|
+ " if choice == \"1\":\n",
|
|
|
|
|
+ " test_basic_example()\n",
|
|
|
|
|
+ " elif choice == \"2\":\n",
|
|
|
|
|
+ " interactive_travel_assistant()\n",
|
|
|
|
|
+ " elif choice == \"3\":\n",
|
|
|
|
|
+ " city = input(\"请输入要测试的城市: \").strip() or \"上海\"\n",
|
|
|
|
|
+ " quick_test(city)\n",
|
|
|
|
|
+ " else:\n",
|
|
|
|
|
+ " print(\"无效选择,运行测试示例...\")\n",
|
|
|
|
|
+ " test_basic_example()"
|
|
|
|
|
+ ]
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
"cell_type": "code",
|
|
"cell_type": "code",
|