
用 HelloAgents 框架从零构建智能故事生成器基于《从零开始构建智能体》项目实战指南【免费下载链接】hello-agents 《从零开始构建智能体》——从零开始的智能体原理与实践教程项目地址: https://gitcode.com/GitHub_Trending/he/hello-agents本文以开源仓库《从零开始构建智能体》hello-agents中的共创项目「laoyouf-aistory」为蓝本完整讲解如何基于 HelloAgents 框架搭建一个支持小说 / 剧本 / 诗歌三种文体、自定义主题与风格的故事生成智能体。读完本文你将掌握SimpleAgent、HelloAgentsLLM、Tool、ToolParameter、ToolRegistry五个核心组件的使用方式理解定义工具 → 注册工具 → 装配智能体 → 交互生成的完整开发链路并能独立复现或扩展出一个属于自己的创作类 Agent。一、项目定位与核心能力laoyouf-aistory 是 hello-agents 仓库中的共创项目之一其定位是一个智能故事小说 / 剧本 / 诗歌生成器。根据项目 README 的描述它解决的核心问题是根据用户输入的文体、主题、风格生成对应文体的故事内容特色功能是支持自定义文体、主题与风格三要素的自由组合适用场景为娱乐创作。项目本体由三个文件组成文件作用README.md项目简介、技术栈与快速开始说明main.ipynb核心实现内含快速演示与完整版五步流程requirements.txt依赖声明hello-agents[all]0.2.7从技术架构上看这是一个典型的单 Agent 单工具范式Agent 本身不直接调用大模型写故事而是通过一个自定义的StoryGeneratorTool工具把用户传入的文体、主题、风格三要素组装成提示词再交给HelloAgentsLLM完成生成。这种把能力封装为工具、由 Agent 统一调度的设计正是 HelloAgents 框架的核心思想。二、环境准备与快速开始2.1 环境要求根据 README.md 与 notebook 内核信息本项目运行环境要求如下Python 3.10notebook 实际使用内核为 Python 3.10.19Jupyter Lab / Notebook用于运行main.ipynb一个兼容 OpenAI 接口的 LLM 服务项目示例使用 ModelScope 的 Qwen 模型2.2 安装依赖项目依赖极简仅有一个核心声明pip install -r requirements.txt其中 requirements.txt 的内容为# 核心依赖 hello-agents[all]0.2.7即安装hello-agents框架的完整功能集[all]extra版本不低于 0.2.7。2.3 配置 API 密钥README 建议通过.env文件管理密钥# 创建.env文件 cp .env.example .env # 编辑.env文件填入你的API密钥需要说明的是当前仓库的 aistory 目录中并未包含.env.example文件目录下仅有 README、main.ipynb、requirements.txt 三个文件因此需要你根据下面介绍的环境变量自行创建。HelloAgents 框架遵循参数优先、环境变量兜底的设计见 core/llm.py本项目用到的核心环境变量有四个环境变量含义本项目取值示例LLM_MODEL_ID模型名称Qwen/Qwen2.5-72B-InstructLLM_API_KEYAPI 密钥以ms-开头的 ModelScope 密钥请务必替换为你自己的密钥LLM_BASE_URL服务地址https://api-inference.modelscope.cn/v1/LLM_TIMEOUT请求超时秒默认 6060⚠️ 注意notebook 中明文写入了示例密钥这是演示用途的写法。真实使用时应将密钥放入.env文件或系统环境变量切勿在公开代码中硬编码密钥。LLM_API_KEY如果以ms-开头框架会自动识别为 ModelScope 提供商见 core/llm.py 的 provider 自动检测逻辑。2.4 运行项目# 启动Jupyter Notebook jupyter lab # 打开main.ipynb并运行打开 main.ipynb 后有两种体验路径快速体验只运行「第 0 部分」通过交互式输入完成一次故事生成完整功能依次运行第 14 部分体验完整的故事生成流程在第 4 部分修改generate_story()的参数尝试不同故事类型。三、快速演示三行输入生成一个故事第 0 部分面向想快速了解项目能力的读者流程分四步。第一步交互式收集三要素。notebook 使用input()依次询问故事类型、主题与风格# 选择故事类型小说/剧本/诗歌 story_type input(请输入故事类型小说/剧本/诗歌: ) # 输入故事主题 theme input(请输入故事主题: ) # 选择故事风格 style input(请输入故事风格: )第二步导入库并配置 LLM 环境变量配置项见 2.3 节代码略SimpleAgent、HelloAgentsLLM均从hello_agents包导入工具相关类从hello_agents.tools导入。第三步定义并注册故事生成工具、创建 Agentfrom hello_agents import ToolRegistry quick_registry ToolRegistry() quick_registry.register_tool(StoryGeneratorTool()) # 创建智能体 agent SimpleAgent( name故事生成助手, llmHelloAgentsLLM(), system_prompt你是经验丰富的故事创作者能够根据用户提供的参数生成不同类型的故事内容。请确保故事符合要求的类型、主题和风格并保持内容的连贯性和创意性。, tool_registryquick_registry )第四步调用 Agent 生成故事story agent.run(f请根据以下参数生成一个故事\n- 类型{story_type}\n- 主题{theme}\n- 风格{style}) print(story)可见快速版与完整版共享同一套组件区别仅在于快速版把系统提示词写为一行字符串而完整版提供了结构更丰富、包含文体指导细则的多行系统提示词。这也印证了 HelloAgents 中SimpleAgent的system_prompt是塑造 Agent 行为的关键旋钮这一设计取向。四、完整版拆解五步构建故事生成智能体完整版以第 1 部分第 5 部分的渐进结构展开下面逐部分解读。4.1 第 1 部分环境配置与快速版相同通过os.environ写入LLM_MODEL_ID、LLM_API_KEY、LLM_BASE_URL、LLM_TIMEOUT四个环境变量。这是 HelloAgents 框架的标准化配置入口——HelloAgentsLLM在初始化时若不显式传参会自动从这些环境变量读取模型、密钥、服务地址与超时时间。4.2 第 2 部分定义故事生成工具这是全项目的核心。StoryGeneratorTool继承自框架的Tool抽象基类需要实现run()与get_parameters()两个抽象方法# 定义故事生成工具 class StoryGeneratorTool(Tool): def __init__(self): super().__init__(namestory_generator, description根据用户输入生成不同类型的故事内容) def run(self, parameters: Dict[str, Any]) - str: # 获取用户输入参数 story_type parameters.get(type, 小说) theme parameters.get(theme, 奇幻冒险) style parameters.get(style, 轻松幽默) # 构造提示词 prompt f生成一个{story_type}主题是{theme}风格为{style}。 # 添加类型特定的指导 if story_type 小说: prompt 请使用小说格式以第三人称叙述包含完整的情节发展和人物描写。 elif story_type 剧本: prompt 请使用剧本格式包含场景描述、角色对话和动作指示。 elif story_type 诗歌: prompt 请使用诗歌格式注意押韵和节奏感。 # 调用LLM生成故事 llm HelloAgentsLLM() response llm.generate_text(prompt, max_tokens1024) return response def get_parameters(self) - List[ToolParameter]: return [ ToolParameter(nametype, typestring, description故事类型小说/剧本/诗歌, requiredTrue), ToolParameter(nametheme, typestring, description故事主题, requiredTrue), ToolParameter(namestyle, typestring, description故事风格, requiredTrue) ]这段实现体现了一个值得借鉴的技巧工具内部做文体分派。它没有让 LLM 自行猜测小说该怎么写而是由代码显式地为每种文体追加格式约束小说用第三人称叙述、剧本要场景与动作指示、诗歌讲押韵节奏从而大幅提升输出格式的稳定性。这是提示工程中结构化约束优于自由发挥原则的典型应用。从框架层面看ToolParameter是一个 Pydantic 模型字段包括name参数名、type类型、description描述、required是否必填默认True、default默认值见 tools/base.py。Tool基类还额外提供了validate_parameters()校验必填参数是否齐全与to_dict()转为字典便于序列化或生成工具描述两个实用方法见 tools/base.py。4.3 第 3 部分创建智能体完整版将系统提示词升级为多行版本把任务拆解为四条指令并给出文体细则system_prompt 你是一位经验丰富的故事创作者能够根据用户提供的参数生成不同类型的故事内容。 你的任务是 1. 根据用户指定的故事类型小说/剧本/诗歌生成相应格式的内容 2. 确保故事符合用户指定的主题和风格 3. 保持故事的连贯性和创意性 4. 根据需要使用预设的故事元素库 生成故事时请注意 - 小说以第三人称叙述包含完整的情节发展和人物描写 - 剧本使用标准剧本格式包含场景描述、角色对话和动作指示 - 诗歌注意押韵和节奏感使用生动的意象和比喻 请直接输出生成的故事内容无需添加任何额外说明或解释。 # 导入工具注册表 from hello_agents import ToolRegistry # 创建工具注册表 tool_registry ToolRegistry() tool_registry.register_tool(StoryGeneratorTool()) # 创建智能体 agent SimpleAgent( name智能故事生成器, llmHelloAgentsLLM(), system_promptsystem_prompt, tool_registrytool_registry )这里有两层值得说明的机制ToolRegistry 是 Agent 的能力清单。在 HelloAgents 的实现中ToolRegistry内部维护_toolsTool 对象与_functions函数式工具两个字典支持register_tool()、register_function()、get_tool()、execute_tool()、list_tools()、get_tools_description()等操作注册同名工具时会有已存在将被覆盖的警告见 tools/registry.py。SimpleAgent 会自动看见工具。当 Agent 配置了tool_registry且enable_tool_callingTrue时_get_enhanced_system_prompt()会把注册表中的工具描述追加到系统提示词中并同时注入工具调用格式说明见 agents/simple_agent.py。这意味着你每多注册一个工具Agent 的系统提示词都会同步膨胀一份能力清单——工具即能力注册即曝光。4.4 第 4 部分生成并展示三类故事完整版把生成动作封装为generate_story()函数参数以字典形式传入并拼装为用户消息def generate_story(agent, parameters): # 生成故事 story agent.run(f请根据以下参数生成一个故事\n{, .join([f- {k}: {v} for k, v in parameters.items()])}) # 返回故事内容 return story随后分别用三组参数验证三种文体# 小说参数 novel_parameters { type: 小说, theme: 魔法森林中的冒险, style: 轻松幽默 } print( 生成小说示例 ) novelStory generate_story(agent, novel_parameters) print(novelStory) # 剧本参数 script_parameters { type: 剧本, theme: 拯救被困的朋友, style: 悬疑紧张 } # ...生成并打印剧本... # 诗歌参数 poem_parameters { type: 诗歌, theme: 彩虹山的美景, style: 浪漫温馨 } # ...生成并打印诗歌...三个示例恰好覆盖了三要素的不同取值组合小说/剧本/诗歌 × 冒险/营救/美景 × 幽默/悬疑/浪漫验证了任意文体、主题、风格自由组合的项目核心能力。4.5 第 5 部分总结与展望notebook 以一份开发复盘收尾可作为后续迭代路线图已实现的功能✅ 环境配置与 LLM 模型设置✅ 小说 / 剧本 / 诗歌三种故事类型生成✅ 根据用户指定主题和风格定制故事内容✅ 交互式参数输入和故事生成遇到的挑战确保不同故事类型格式的准确性和合适的文本内容量字数处理不同风格故事的语言特点未来改进方向扩展故事元素库增加更多角色、地点和情节支持用户自定义故事元素添加故事优化功能如语法检查和风格统一实现多语言故事生成支持添加故事可视化功能如场景图或角色关系图五、源码级原理Agent 是如何把写故事跑起来的前面提到本项目的 Agent 被注入了story_generator工具。要理解整条链路可以回到 HelloAgents 的SimpleAgent.run()实现见 agents/simple_agent.py组装消息把增强后的系统提示词含工具描述与调用格式、历史消息、当前用户消息按system / user / assistant顺序构造成消息列表调用 LLMself.llm.invoke(messages)得到模型回复解析工具调用_parse_tool_calls()用正则\[TOOL_CALL:([^:]):([^\]])\]扫描回复中的工具调用标记执行工具_execute_tool_call()从注册表取出 Tool 对象经_parse_tool_parameters()完成参数解析与类型转换支持 JSON、keyvalue逗号分隔、单参数直传三种形式见 agents/simple_agent.py后调用tool.run(param_dict)回填结果继续对话工具执行结果以工具执行结果为前缀拼入消息继续下一轮迭代直到模型不再输出工具调用为止默认最大max_tool_iterations3轮。映射到本项目就是用户说生成一个小说主题是魔法森林中的冒险风格为轻松幽默 → Agent 决定调用story_generator→ 工具把三要素组装成提示词并追加文体指导 →HelloAgentsLLM生成故事文本 → 结果回填给 Agent → Agent 输出最终故事。此外HelloAgents 的工具执行层还内置了参数容错机制ToolRegistry.execute_tool()会尝试多种方式解析参数——JSON 直通、尾部多余]的容错、数组包裹对象、错位尾括号、括号匹配提取首个 JSON 对象等见 tools/registry.py并在工具只有一个必填参数时自动把原始文本映射到该参数。这些兜底设计显著降低了 LLM 输出格式漂移导致的工具调用失败率也是本项目StoryGeneratorTool可以稳定被调用的底层保障。六、LLM 接入的灵活性不止于 ModelScope虽然本项目示例使用 ModelScope 的Qwen/Qwen2.5-72B-Instruct但 HelloAgents 的HelloAgentsLLM是兼容 OpenAI 接口的统一客户端。从源码core/llm.py可以看到其支持的 provider 类型包括openai、deepseek、qwen、modelscope、kimi、zhipu、ollama、vllm、local、autoprovider 的识别顺序为特定提供商环境变量如OPENAI_API_KEY、DASHSCOPE_API_KEY、MODELSCOPE_API_KEY等→ API 密钥格式ms-开头识别为 ModelScope→ base_url 判断 → 默认通用配置见 core/llm.py。因此如果你想改用其他模型通常只需调整四个LLM_*环境变量即可无缝切换例如本地部署时可将 base_url 指向 Ollama 或 vLLM 的服务地址。这意味着本项目的工具 提示词资产可以低成本复用到不同模型上方便做生成质量的横向对比实验。七、总结从本项目能带走什么laoyouf-aistory 是一个麻雀虽小、五脏俱全的 HelloAgents 入门范例它完整演示了框架开发的核心闭环一个自定义工具通过继承Tool实现run()与get_parameters()把生成故事这一领域能力封装成可被 Agent 调度的原子操作一次注册装配ToolRegistry.register_tool()SimpleAgent(tool_registry...)一行注册、一处装配一份精心设计的提示词系统提示词承担角色定义与文体规范工具内提示词承担格式约束双层提示协同保证输出质量一次交互验证用小说、剧本、诗歌三组参数跑通全链路。对于想进一步实践 HelloAgents 的读者可以参考仓库中更完整的框架实现YYHDBL-HelloCodeAgentCli含 SimpleAgent 完整实现、工具注册表、统一 LLM 接口以及 code/chapter4 中的经典范式代码。在此基础上你可以沿着 notebook 第 5 部分列出的方向继续演进——增加故事元素库、支持用户自定义元素、添加多语言支持甚至把工具从生成扩展为生成 润色 配图的多工具协作从而逐步搭建一个功能更完整的创作型 Agent 平台。【免费下载链接】hello-agents 《从零开始构建智能体》——从零开始的智能体原理与实践教程项目地址: https://gitcode.com/GitHub_Trending/he/hello-agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考