Files
admin 2d8c1ea8f9 chore: 批量新增各类工具脚本与配置文件
1. 新增音频录制、下载、上传相关脚本
2. 新增数据库操作、API调用工具
3. 新增Excel数据处理脚本
4. 新增弱密码检测脚本
2026-06-14 17:47:15 +08:00

209 lines
35 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "01e26d34",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"用户: 北京今天天气怎么样?\n",
"助手: 您好!很抱歉,我无法获取实时的天气数据,因此无法告诉您北京今天的具体天气情况。\n",
"\n",
"建议您可以通过以下方式查询北京今天的天气:\n",
"\n",
"1. **手机天气应用** - 如墨迹天气、天气通等\n",
"2. **搜索引擎...\n",
"--------------------------------------------------\n",
"\n",
"用户: 帮我写一个 Python 快速排序\n",
"助手: # Python 快速排序实现\n",
"\n",
"## 方法一:原地排序(经典版本)\n",
"\n",
"```python\n",
"def quick_sort(arr, left, right):\n",
" \"\"\"原地快速排序\"\"\"\n",
" ...\n",
"--------------------------------------------------\n",
"\n",
"用户: 你好,介绍一下你自己\n",
"助手: 你好!我是 MiniMax AI,一个由 MiniMax 公司开发的人工智能助手。\n",
"\n",
"我可以帮助你:\n",
"\n",
"- 回答各种问题\n",
"- 进行对话和交流\n",
"- 协助写作、编程、翻译等任务\n",
"- 提供信息和知识\n",
"\n",
"有什...\n",
"--------------------------------------------------\n",
"\n",
"用户: 再见啦!\n",
"助手: 再见!期待下次与你交流。...\n",
"--------------------------------------------------\n"
]
}
],
"source": [
"import os\n",
"from dotenv import load_dotenv\n",
"from langgraph.graph import StateGraph, START, END, MessagesState\n",
"from langchain_openai import ChatOpenAI\n",
"from langchain_core.messages import SystemMessage, HumanMessage\n",
"\n",
"load_dotenv()\n",
"\n",
"# 初始化 LLM\n",
"llm = ChatOpenAI(\n",
" model=\"MiniMax-M2.7-highspeed\",\n",
" openai_api_key=\"sk-8d657b8b7efe0cb6c141a30d9cee97f726efb9b18ea72bb1e8cfb080b42c140d\",\n",
" openai_api_base=\"https://console.pivotbak.cfd/v1\",\n",
" temperature=0.5\n",
")\n",
"\n",
"# 路由函数\n",
"def classify_intent(state: MessagesState) -> str:\n",
" \"\"\"根据用户意图路由到不同的 Agent\"\"\"\n",
" last_message = state[\"messages\"][-1]\n",
" content = last_message.content.lower()\n",
" \n",
" if \"天气\" in content or \"温度\" in content:\n",
" return \"weather_agent\"\n",
" elif \"代码\" in content or \"编程\" in content:\n",
" return \"code_agent\"\n",
" elif \"再见\" in content or \"退出\" in content:\n",
" return \"farewell\"\n",
" else:\n",
" return \"general_agent\"\n",
"\n",
"# 定义各个 Agent 节点\n",
"def router_node(state: MessagesState) -> dict:\n",
" \"\"\"路由节点:不做处理,只用于触发路由判断\"\"\"\n",
" return {}\n",
"\n",
"def weather_node(state: MessagesState) -> dict:\n",
" \"\"\"天气 Agent\"\"\"\n",
" response = llm.invoke([\n",
" SystemMessage(content=\"你是一个天气助手,友好地回答天气相关问题。如果没有实时数据,可以给出一般性建议。\"),\n",
" *state[\"messages\"]\n",
" ])\n",
" return {\"messages\": [response]}\n",
"\n",
"def code_node(state: MessagesState) -> dict:\n",
" \"\"\"代码 Agent\"\"\"\n",
" response = llm.invoke([\n",
" SystemMessage(content=\"你是一个编程助手,擅长解答代码问题并给出清晰的代码示例。\"),\n",
" *state[\"messages\"]\n",
" ])\n",
" return {\"messages\": [response]}\n",
"\n",
"def general_node(state: MessagesState) -> dict:\n",
" \"\"\"通用 Agent\"\"\"\n",
" response = llm.invoke([\n",
" SystemMessage(content=\"你是一个友善的 AI 助手,可以回答各种问题。\"),\n",
" *state[\"messages\"]\n",
" ])\n",
" return {\"messages\": [response]}\n",
"\n",
"def farewell_node(state: MessagesState) -> dict:\n",
" \"\"\"告别节点\"\"\"\n",
" return {\"messages\": [{\"role\": \"assistant\", \"content\": \"再见!期待下次与你交流。\"}]}\n",
"\n",
"# 构建图\n",
"builder = StateGraph(MessagesState)\n",
"\n",
"# 添加节点\n",
"builder.add_node(\"router\", router_node)\n",
"builder.add_node(\"weather_agent\", weather_node)\n",
"builder.add_node(\"code_agent\", code_node)\n",
"builder.add_node(\"general_agent\", general_node)\n",
"builder.add_node(\"farewell\", farewell_node)\n",
"\n",
"# 添加边\n",
"builder.add_edge(START, \"router\")\n",
"builder.add_conditional_edges(\n",
" \"router\",\n",
" classify_intent,\n",
" {\n",
" \"weather_agent\": \"weather_agent\",\n",
" \"code_agent\": \"code_agent\",\n",
" \"general_agent\": \"general_agent\",\n",
" \"farewell\": \"farewell\",\n",
" }\n",
")\n",
"\n",
"# 所有 agent 节点处理完后结束\n",
"for node in [\"weather_agent\", \"code_agent\", \"general_agent\", \"farewell\"]:\n",
" builder.add_edge(node, END)\n",
"\n",
"# 编译图\n",
"graph = builder.compile()\n",
"\n",
"# 测试不同意图\n",
"test_inputs = [\n",
" \"北京今天天气怎么样?\",\n",
" \"帮我写一个 Python 快速排序\",\n",
" \"你好,介绍一下你自己\",\n",
" \"再见啦!\"\n",
"]\n",
"\n",
"for user_input in test_inputs:\n",
" print(f\"\\n用户: {user_input}\")\n",
" result = graph.invoke({\"messages\": [HumanMessage(content=user_input)]})\n",
" print(f\"助手: {result['messages'][-1].content[:100]}...\")\n",
" print(\"-\" * 50)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "fbee2a39",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import Image\n",
"Image(graph.get_graph().draw_mermaid_png())"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "base",
"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.12.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}