{ "cells": [ { "cell_type": "code", "id": "initial_id", "metadata": { "collapsed": true, "ExecuteTime": { "end_time": "2026-07-30T13:49:53.991892Z", "start_time": "2026-07-30T13:49:53.953141Z" } }, "source": [ "\"\"\"\n", "动态扇出(fan-out)\n", "\"\"\"\n", "\n", "import os\n", "from dotenv import load_dotenv\n", "from langchain.chat_models import init_chat_model\n", "\n", "load_dotenv(override=True)\n", "\n", "llm = init_chat_model(\n", " model=\"openai:qwen3.6-flash\",\n", " base_url=os.getenv(\"BASE_URL\"),\n", " api_key=os.getenv(\"API_KEY\")\n", ")" ], "outputs": [], "execution_count": 23 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-30T13:49:54.025529Z", "start_time": "2026-07-30T13:49:54.012229Z" } }, "cell_type": "code", "source": [ "from typing import TypedDict, Literal, Sequence\n", "\n", "\n", "class OverallState(TypedDict):\n", " topic: str\n", " poem: str\n", " ci_poem: str\n", " joke: str\n", "\n", "\n", "class WorkerState(TypedDict):\n", " content_type: Literal[\"poem\", \"joke\", \"ci_poem\"]\n", " prompt: str\n", "\n", "\n", "class InputState(TypedDict):\n", " topic: str\n", "\n", "\n", "class OutputState(TypedDict):\n", " poem: str\n", " ci_poem: str\n", " joke: str" ], "id": "ae2dc1758905a3a9", "outputs": [], "execution_count": 24 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-30T13:49:54.037302Z", "start_time": "2026-07-30T13:49:54.025996Z" } }, "cell_type": "code", "source": [ "from langgraph.graph import StateGraph, START, END\n", "from langchain.messages import HumanMessage\n", "from langgraph.types import Send\n", "\n", "\n", "def worker_node(state: WorkerState) -> OutputState:\n", " content_type = state[\"content_type\"]\n", " prompt = state[\"prompt\"]\n", " res = llm.invoke([HumanMessage(prompt)])\n", "\n", " return {\n", " content_type: res.content\n", " }\n", "\n", "\n", "def router(state: InputState) -> Sequence[Send]:\n", " router_prompt = \"请生成关于 {} 主题的{}\"\n", " en_zh_map = {\n", " \"poem\": \"七言绝句\",\n", " \"joke\": \"笑话\",\n", " \"ci_poem\": \"中文词\"\n", " }\n", "\n", " topic = state[\"topic\"]\n", " return [\n", " Send(\n", " \"worker_node\",\n", " arg=WorkerState(\n", " content_type=content_type,\n", " prompt=router_prompt\n", " .format(topic, en_zh_map[content_type])\n", " )\n", " )\n", " for content_type in [\"poem\", \"joke\", \"ci_poem\"]\n", " ]" ], "id": "3ac3b9c730c21141", "outputs": [], "execution_count": 25 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-30T13:49:54.057696Z", "start_time": "2026-07-30T13:49:54.043335Z" } }, "cell_type": "code", "source": [ "builder = StateGraph(\n", " state_schema=OverallState,\n", " input_schema=InputState,\n", " output_schema=OutputState\n", ")\n", "\n", "builder.add_node(\"router\", router)\n", "builder.add_node(\"worker_node\", worker_node)\n", "\n", "builder.add_conditional_edges(\n", " START,\n", " router,\n", " path_map={\"worker_node\": \"worker_node\"}\n", ")\n", "builder.add_edge(\"worker_node\", END)\n", "\n", "graph = builder.compile()" ], "id": "ac2b29823a3df4ee", "outputs": [], "execution_count": 26 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-30T13:50:20.554204Z", "start_time": "2026-07-30T13:49:54.058820Z" } }, "cell_type": "code", "source": "res=graph.invoke(InputState(topic=\"汤姆猫\"))", "id": "235958e92cc997aa", "outputs": [], "execution_count": 27 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-30T13:50:20.742345Z", "start_time": "2026-07-30T13:50:20.575371Z" } }, "cell_type": "code", "source": [ "from rich import print as rp\n", "rp(res)" ], "id": "354d39c58926f899", "outputs": [ { "data": { "text/plain": [ "\u001B[1m{\u001B[0m\n", " \u001B[32m'poem'\u001B[0m: \u001B[32m'《咏汤姆猫》\\n蓝灰掠地逐轻风,\\n百计千谋总落空。\\n莫叹连环招屡败,\\n犹凭百态逗群童。\\n\\n【简析】\\n- \u001B[0m\n", "\u001B[32m**起承转合**:首句以“蓝灰掠地”勾勒经典动画形象,“逐轻风”暗写其与杰瑞的追逐场景;次句“百计千谋总落空”浓缩汤姆屡次布\u001B[0m\n", "\u001B[32m陷阱却反受挫的喜剧内核;第三句笔锋一转,化贬为褒,赞其屡败屡战的韧劲;末句“百态”既指动画中丰富的肢体与表情夸张,亦\u001B[0m\n", "\u001B[32m点出其跨越时代的童趣价值。\\n- \u001B[0m\n", "\u001B[32m**格律**:本诗依《平水韵》上平一东韵,采用七绝平起首句入韵正格,平仄严谨,符合传统近体诗法度。\\n- \u001B[0m\n", "\u001B[32m**文化呼应**:以古典诗语书写现代卡通形象,不涉直白名词,而通过“逐、空、败、童”等字眼,精准捕捉该角色“滑稽中带温情、\u001B[0m\n", "\u001B[32m狼狈中见执着”的精神气质,使传统诗体与当代流行文化自然交融。'\u001B[0m,\n", " \u001B[32m'ci_poem'\u001B[0m: \u001B[32m'以下为您整理围绕 **“汤姆猫(Talking Tom)”** \u001B[0m\n", "\u001B[32m主题的中文词汇库,已按使用场景分类,方便您在内容创作、市场分析、产品策划或SEO优化中直接调用:\\n\\n### 🐾 \u001B[0m\n", "\u001B[32m核心IP与角色\\n`会说话的汤姆猫`|`安吉拉(Talking \u001B[0m\n", "\u001B[32mAngela)`|`本熊`|`汉克狗`|`金杰猫`|`数字宠物`|`虚拟陪伴角色`|`Outfit7`(出品方)\\n\\n### 🎮 \u001B[0m\n", "\u001B[32m核心玩法与功能\\n`语音模仿`|`回声重播`|`趣味变声`|`指尖互动`|`换装打扮`|`迷你游戏合集`|`家园养成`|`触控反馈`\u001B[0m\n", "\u001B[32m|`表情捕捉`|`节奏拍手`\\n\\n### ⚙️ \u001B[0m\n", "\u001B[32m技术与研发方向\\n`实时语音识别`|`声音特征提取`|`口型同步驱动`|`3D动画渲染`|`多语言适配`|`低延迟交互`|`版本热更\u001B[0m\n", "\u001B[32m新`|`轻量化客户端`\\n\\n### 📦 \u001B[0m\n", "\u001B[32m衍生内容与生态\\n`同名动画剧集`|`实体毛绒公仔`|`主题盲盒/积木`|`儿童早教延伸应用`|`IP联名文具`|`粉丝同人二创`|\u001B[0m\n", "\u001B[32m`线上音乐频道`|`AR互动滤镜`\\n\\n### 🌍 \u001B[0m\n", "\u001B[32m市场与文化属性\\n`亲子互动娱乐`|`解压轻量游戏`|`网络模因(Meme)`|`Z世代童年数字记忆`|`全球化爆款应用`|`寓教于\u001B[0m\n", "\u001B[32m乐定位`|`跨代际传播`|`安全合规设计`\\n\\n### 💼 \u001B[0m\n", "\u001B[32m商业与运营术语\\n`免费下载+内购模式`|`激励视频广告`|`应用商店推荐位`|`用户次日留存`|`跨媒介IP发行`|`分级授权体\u001B[0m\n", "\u001B[32m系`|`区域化本地运营`|`生命周期管理`\\n\\n---\\n📌 **使用建议**:\\n- **内容创作/短视频脚本**:优先组合 `语音模仿 + \u001B[0m\n", "\u001B[32m指尖互动 + 解压轻量游戏 + 网络模因`\\n- **竞品分析/行业报告**:侧重 `免费+内购模式 + 用户留存 + 跨媒介IP发行 + \u001B[0m\n", "\u001B[32m生命周期管理`\\n- **儿童产品策划**:可搭配 `安全合规设计 + 亲子互动娱乐 + 家园养成 + 儿童早教延伸`\\n- \u001B[0m\n", "\u001B[32m**SEO/标签优化**:建议采用 `会说话的汤姆猫系列 / Talking Tom中文版 / 虚拟宠物手游 / \u001B[0m\n", "\u001B[32m儿童互动APP`\\n\\n如需特定场景的短语搭配、长尾关键词清单或英文对照表,可告知具体用途(如:电商上架、公众号排版、投融\u001B[0m\n", "\u001B[32m资BP等),我将为您进一步定制。'\u001B[0m,\n", " \u001B[32m'joke'\u001B[0m: \n", "\u001B[32m'这里为你原创创作了5个以《猫和老鼠》中“汤姆猫”为主题的笑话,保留了他屡败屡战、表情丰富、总被杰瑞机智反杀的经典人设\u001B[0m\n", "\u001B[32m,风格轻松幽默,适合全年龄阅读:\\n\\n1. **【职场篇】** \\n汤姆去面试“高级防鼠专员”。 \u001B[0m\n", "\u001B[32m\\nHR问:“你的核心竞争力是什么?” \u001B[0m\n", "\u001B[32m\\n汤姆挺起胸膛:“二十年实战经验!精通高空坠落缓冲、电击后快速重启、以及被锅砸扁后的三维复原技术。” \u001B[0m\n", "\u001B[32m\\nHR点头:“履历很扎实,但我们更看重结果。” \u001B[0m\n", "\u001B[32m\\n汤姆叹气:“那我补充一条:我擅长在失败中积累素材,为下一代动画师提供反面PPT。” \\n\\n2. **【健身篇】** \u001B[0m\n", "\u001B[32m\\n汤姆痛定思痛办卡健身,三个月练出八块腹肌,连杰瑞都在评论区留言:“哥,你这体格不当举重冠军可惜了!” \u001B[0m\n", "\u001B[32m\\n第二天抓鼠,杰瑞只是把奶酪往前挪了半寸。 \\n汤姆全力冲刺,“砰!”直接撞穿三道墙。 \u001B[0m\n", "\u001B[32m\\n邻居围观问他咋回事,汤姆揉着额头顶着大包说:“力量够了,就是惯性没收住。” \\n\\n3. **【哲学篇】** \u001B[0m\n", "\u001B[32m\\n小朋友问汤姆:“你明明每次都被打败,为什么从不放弃?” \u001B[0m\n", "\u001B[32m\\n汤姆推了推不存在的眼镜:“首先,这是工作;其次,如果我赢了,导演就得给我加薪;最后……你想想,谁舍得让一部播了八十多\u001B[0m\n", "\u001B[32m年的动画片断更?” \\n小朋友恍然大悟:“原来你不是在抓老鼠,是在守护童年呀!” \\n\\n4. **【科技篇】** \u001B[0m\n", "\u001B[32m\\n汤姆斥巨资下载了“AI智能捕鼠系统”,支持卫星定位、行为预测、自动诱捕。 \u001B[0m\n", "\u001B[32m\\n首日上阵,屏幕显示:“目标已锁定,正在计算逃逸路线……” \\n杰瑞掏出小圆镜反射阳光晃了汤姆一下。 \u001B[0m\n", "\u001B[32m\\n手机秒弹:“识别异常,疑似光学干扰。已为您切换至传统模式:跑、跳、躲、挨打。” \u001B[0m\n", "\u001B[32m\\n汤姆默默关机:“算法再强,也算不出鼠标垫的反光角。” \\n\\n5. **【考试篇】** \\n语文题:请用“汤姆猫”造句。 \u001B[0m\n", "\u001B[32m\\n学生甲写:“汤姆猫很有毅力。”(老师批:✅ 但缺乏细节) \u001B[0m\n", "\u001B[32m\\n学生乙写:“汤姆猫每天都在努力,虽然每次都失败,但他从未停止。”(老师批:✅✅ 加分项) \u001B[0m\n", "\u001B[32m\\n学生丙写:“汤姆猫的创可贴库存比我的作业本还多。”(老师批:✅✅✅ 现实主义杰作,附赠一张漫画配图) \\n\\n💡 \u001B[0m\n", "\u001B[32m**小贴士**:这些笑话均基于经典动画的喜剧内核二次创作,未涉及任何版权侵权内容。如果你喜欢某种特定风格(比如谐音梗、\u001B[0m\n", "\u001B[32m冷笑话、或结合现代生活场景),可以告诉我,我再为你定制一批!'\u001B[0m\n", "\u001B[1m}\u001B[0m\n" ], "text/html": [ "
{\n", " 'poem': '《咏汤姆猫》\\n蓝灰掠地逐轻风,\\n百计千谋总落空。\\n莫叹连环招屡败,\\n犹凭百态逗群童。\\n\\n【简析】\\n- \n", "**起承转合**:首句以“蓝灰掠地”勾勒经典动画形象,“逐轻风”暗写其与杰瑞的追逐场景;次句“百计千谋总落空”浓缩汤姆屡次布\n", "陷阱却反受挫的喜剧内核;第三句笔锋一转,化贬为褒,赞其屡败屡战的韧劲;末句“百态”既指动画中丰富的肢体与表情夸张,亦\n", "点出其跨越时代的童趣价值。\\n- \n", "**格律**:本诗依《平水韵》上平一东韵,采用七绝平起首句入韵正格,平仄严谨,符合传统近体诗法度。\\n- \n", "**文化呼应**:以古典诗语书写现代卡通形象,不涉直白名词,而通过“逐、空、败、童”等字眼,精准捕捉该角色“滑稽中带温情、\n", "狼狈中见执着”的精神气质,使传统诗体与当代流行文化自然交融。',\n", " 'ci_poem': '以下为您整理围绕 **“汤姆猫(Talking Tom)”** \n", "主题的中文词汇库,已按使用场景分类,方便您在内容创作、市场分析、产品策划或SEO优化中直接调用:\\n\\n### 🐾 \n", "核心IP与角色\\n`会说话的汤姆猫`|`安吉拉(Talking \n", "Angela)`|`本熊`|`汉克狗`|`金杰猫`|`数字宠物`|`虚拟陪伴角色`|`Outfit7`(出品方)\\n\\n### 🎮 \n", "核心玩法与功能\\n`语音模仿`|`回声重播`|`趣味变声`|`指尖互动`|`换装打扮`|`迷你游戏合集`|`家园养成`|`触控反馈`\n", "|`表情捕捉`|`节奏拍手`\\n\\n### ⚙️ \n", "技术与研发方向\\n`实时语音识别`|`声音特征提取`|`口型同步驱动`|`3D动画渲染`|`多语言适配`|`低延迟交互`|`版本热更\n", "新`|`轻量化客户端`\\n\\n### 📦 \n", "衍生内容与生态\\n`同名动画剧集`|`实体毛绒公仔`|`主题盲盒/积木`|`儿童早教延伸应用`|`IP联名文具`|`粉丝同人二创`|\n", "`线上音乐频道`|`AR互动滤镜`\\n\\n### 🌍 \n", "市场与文化属性\\n`亲子互动娱乐`|`解压轻量游戏`|`网络模因(Meme)`|`Z世代童年数字记忆`|`全球化爆款应用`|`寓教于\n", "乐定位`|`跨代际传播`|`安全合规设计`\\n\\n### 💼 \n", "商业与运营术语\\n`免费下载+内购模式`|`激励视频广告`|`应用商店推荐位`|`用户次日留存`|`跨媒介IP发行`|`分级授权体\n", "系`|`区域化本地运营`|`生命周期管理`\\n\\n---\\n📌 **使用建议**:\\n- **内容创作/短视频脚本**:优先组合 `语音模仿 + \n", "指尖互动 + 解压轻量游戏 + 网络模因`\\n- **竞品分析/行业报告**:侧重 `免费+内购模式 + 用户留存 + 跨媒介IP发行 + \n", "生命周期管理`\\n- **儿童产品策划**:可搭配 `安全合规设计 + 亲子互动娱乐 + 家园养成 + 儿童早教延伸`\\n- \n", "**SEO/标签优化**:建议采用 `会说话的汤姆猫系列 / Talking Tom中文版 / 虚拟宠物手游 / \n", "儿童互动APP`\\n\\n如需特定场景的短语搭配、长尾关键词清单或英文对照表,可告知具体用途(如:电商上架、公众号排版、投融\n", "资BP等),我将为您进一步定制。',\n", " 'joke': \n", "'这里为你原创创作了5个以《猫和老鼠》中“汤姆猫”为主题的笑话,保留了他屡败屡战、表情丰富、总被杰瑞机智反杀的经典人设\n", ",风格轻松幽默,适合全年龄阅读:\\n\\n1. **【职场篇】** \\n汤姆去面试“高级防鼠专员”。 \n", "\\nHR问:“你的核心竞争力是什么?” \n", "\\n汤姆挺起胸膛:“二十年实战经验!精通高空坠落缓冲、电击后快速重启、以及被锅砸扁后的三维复原技术。” \n", "\\nHR点头:“履历很扎实,但我们更看重结果。” \n", "\\n汤姆叹气:“那我补充一条:我擅长在失败中积累素材,为下一代动画师提供反面PPT。” \\n\\n2. **【健身篇】** \n", "\\n汤姆痛定思痛办卡健身,三个月练出八块腹肌,连杰瑞都在评论区留言:“哥,你这体格不当举重冠军可惜了!” \n", "\\n第二天抓鼠,杰瑞只是把奶酪往前挪了半寸。 \\n汤姆全力冲刺,“砰!”直接撞穿三道墙。 \n", "\\n邻居围观问他咋回事,汤姆揉着额头顶着大包说:“力量够了,就是惯性没收住。” \\n\\n3. **【哲学篇】** \n", "\\n小朋友问汤姆:“你明明每次都被打败,为什么从不放弃?” \n", "\\n汤姆推了推不存在的眼镜:“首先,这是工作;其次,如果我赢了,导演就得给我加薪;最后……你想想,谁舍得让一部播了八十多\n", "年的动画片断更?” \\n小朋友恍然大悟:“原来你不是在抓老鼠,是在守护童年呀!” \\n\\n4. **【科技篇】** \n", "\\n汤姆斥巨资下载了“AI智能捕鼠系统”,支持卫星定位、行为预测、自动诱捕。 \n", "\\n首日上阵,屏幕显示:“目标已锁定,正在计算逃逸路线……” \\n杰瑞掏出小圆镜反射阳光晃了汤姆一下。 \n", "\\n手机秒弹:“识别异常,疑似光学干扰。已为您切换至传统模式:跑、跳、躲、挨打。” \n", "\\n汤姆默默关机:“算法再强,也算不出鼠标垫的反光角。” \\n\\n5. **【考试篇】** \\n语文题:请用“汤姆猫”造句。 \n", "\\n学生甲写:“汤姆猫很有毅力。”(老师批:✅ 但缺乏细节) \n", "\\n学生乙写:“汤姆猫每天都在努力,虽然每次都失败,但他从未停止。”(老师批:✅✅ 加分项) \n", "\\n学生丙写:“汤姆猫的创可贴库存比我的作业本还多。”(老师批:✅✅✅ 现实主义杰作,附赠一张漫画配图) \\n\\n💡 \n", "**小贴士**:这些笑话均基于经典动画的喜剧内核二次创作,未涉及任何版权侵权内容。如果你喜欢某种特定风格(比如谐音梗、\n", "冷笑话、或结合现代生活场景),可以告诉我,我再为你定制一批!'\n", "}\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "execution_count": 28 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-30T13:50:27.890134Z", "start_time": "2026-07-30T13:50:20.745185Z" } }, "cell_type": "code", "source": [ "from IPython.display import display\n", "display(graph)" ], "id": "6cb9f09b1ee2d10", "outputs": [ { "data": { "text/plain": [ "