牛商网做网站要多少钱如何做网站推广在找产品营销推广吗
2026/3/29 4:16:02 网站建设 项目流程
牛商网做网站要多少钱,如何做网站推广在找产品营销推广吗,做网站多钱一年,汉中公司网站建设本文详细介绍了使用LangGraphGo框架结合Skills插件系统构建AI漫画生成智能体的完整实现。内容包括技术架构设计、工具自动发现机制、参数转换实现、工作流程设计及踩坑经验。项目实现了从分镜生成、图像生成到PDF合并的全流程#xff0c;提供了完整代码和解决方案#xff0c;…本文详细介绍了使用LangGraphGo框架结合Skills插件系统构建AI漫画生成智能体的完整实现。内容包括技术架构设计、工具自动发现机制、参数转换实现、工作流程设计及踩坑经验。项目实现了从分镜生成、图像生成到PDF合并的全流程提供了完整代码和解决方案为开发者构建AI应用提供了实用参考。“本文将带你深入了解如何使用 LangGraphGo 框架结合 Skills 插件系统从零开始构建一个能够自动生成漫画的 AI 智能体。我们会深入剖析技术架构分享踩坑经验并提供完整的代码实现。前言在 AI 应用开发领域智能体Agent架构正变得越来越重要。与传统的单一 LLM 调用不同智能体能够自主规划任务执行步骤调用外部工具完成任务根据执行结果动态调整策略本文将以一个漫画生成智能体为例展示如何使用 LangGraphGo 框架使用当前炙手可热的 Skill 技术构建复杂的多步骤 AI 应用。这个智能体能够根据用户输入生成漫画分镜脚本自动调用图像生成模型生成每一页画面将所有页面合并成完整的 PDF 漫画“本示例使用宝玉的漫画 Skill 作为漫画生成的核心工具演示了 langGraphGo 与 Skills 插件系统的无缝集成。技术栈概览┌─────────────────────────────────────────────────────────────┐│ 用户输入 ││ 创作一个采蘑菇的小姑娘的漫画 │└─────────────────────────┬───────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ LangGraphGo Agent ││ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ││ │ LLM 核心 │───▶│ 工具调度器 │───▶│ 状态管理器 │ ││ │ (ERNIE) │ │ (Tool Router) │ │ (State) │ ││ └──────────────┘ └──────────────┘ └──────────────┘ │└─────────────────────────┬───────────────────────────────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 分镜生成工具 │ │ 图像生成工具 │ │ PDF合并工具 │ │(baoyu-comic)│ │(image-gen) │ │(baoyu-comic)│ │ (.ts脚本) │ │ (.ts脚本) │ │ (.ts脚本) │ └─────────────┘ └─────────────┘ └─────────────┘ │ ┌─────────────┴─────────────┐ ▼ ▼ ┌─────────────┐ ┌─────────────┐ │ pdf skill │ │ 其他技能 │ │ (.py脚本) │ │ (未使用) │ └─────────────┘ └─────────────┘核心技术组件LangGraphGo: Go 语言实现的 LangGraph 框架提供状态图StateGraph能力GoSkills v0.6.1: 技能插件系统将脚本封装为 LLM 可调用的工具TypeScript 脚本: 实际执行业务逻辑的脚本层使用 npx tsx 执行ERNIE 5.0 Thinking Preview: 百度文心一言大模型工具调用稳定负责理解和规划一、项目架构设计1.1 目录结构comic_skill_example/├── main.go # 入口文件Agent 创建和执行├── go.mod # Go 模块依赖└── skills/ # 技能插件目录 ├── baoyu-comic/ # 漫画分镜生成技能 │ ├── SKILL.md # 技能定义含工具元数据 │ └── scripts/ │ ├── generate-comic.ts # 分镜生成脚本 │ └── merge-to-pdf.ts # PDF 合并脚本 ├── baoyu-image-gen/ # 图像生成技能 │ ├── SKILL.md # 技能定义 │ └── scripts/ │ └── main.ts # 图像生成脚本 └── pdf/ # PDF 处理技能Python ├── SKILL.md # 技能定义 └── scripts/ ├── check_bounding_boxes.py ├── convert_pdf_to_images.py ├── extract_form_field_info.py └── ...说明系统会自动加载skills/目录下的所有技能包但漫画生成 Agent 只使用其中 3 个核心工具generate_comic_storyboard、generate_comic_image、merge_comic_to_pdf这些工具来自baoyu-comic和baoyu-image-gen两个技能包。1.2 技能定义系统SKILL.md每个技能通过SKILL.md文件定义使用 YAML frontmatter 声明工具---name:baoyu-comicdescription:Knowledgecomiccreatorsupportingmultiplestyles...tools:-name:generate_comic_storyboard script:scripts/generate-comic.ts description:创建完整的漫画分镜脚本和提示词 parameters: topic: type:string description:要创作的漫画主题 required:true style: type:string description:视觉风格如warm温暖、classic经典 required:false pages: type:integer description:要生成的页数 required:false aspect: type:string description:宽高比如3:4、4:3、16:9 required:false---设计亮点声明式工具定义- 工具名称、参数、描述全部在 SKILL.md 中声明自动 Schema 生成- 系统自动根据参数定义生成 OpenAPI Schema零 Go 代码修改- 添加新工具无需修改 Go 代码只需编辑 SKILL.md二、核心实现解析2.1 工具配置自动发现机制传统方式需要在 Go 代码中硬编码工具配置60 行我们实现了从 SKILL.md 自动读取。关键实现adapter/goskills/goskills.go// buildToolConfigFromSkill 从 SKILL.md 中的工具定义自动构建 ToolConfigfunc buildToolConfigFromSkill(skill *goskills.SkillPackage) *ToolConfig { iflen(skill.Meta.Tools) 0 { returnnil } config : ToolConfig{ NameMapping: make(map[string]string), DescriptionOverrides: make(map[string]string), SchemaOverrides: make(map[string]map[string]any), } for _, toolDef : range skill.Meta.Tools { // 构建名称映射从工具名到工具名保持一致 config.NameMapping[toolDef.Name] toolDef.Name // 设置描述 if toolDef.Description ! { config.DescriptionOverrides[toolDef.Name] toolDef.Description } // 构建 Schema schema : map[string]any{ type: object, properties: make(map[string]any), } iflen(toolDef.Parameters) 0 { var required []string for paramName, param : range toolDef.Parameters { prop : map[string]any{ type: param.Type, } if param.Description ! { prop[description] param.Description } schema[properties].(map[string]any)[paramName] prop if param.Required { required append(required, paramName) } } iflen(required) 0 { schema[required] required } } schema[additionalProperties] false config.SchemaOverrides[toolDef.Name] schema } return config}// SkillsToTools 自动从 SKILL.md 读取工具定义func SkillsToTools(skill *goskills.SkillPackage, opts ...SkillsToToolsOptions) ([]tools.Tool, error) { var config *ToolConfig // 1. 首先尝试从 SKILL.md 自动构建配置 skillConfig : buildToolConfigFromSkill(skill) if skillConfig ! nil { config skillConfig } // 2. 如果用户提供了配置合并覆盖 iflen(opts) 0 opts[0].ToolConfig ! nil { // 合并逻辑... } // 3. 生成工具...}优势对比特性硬编码方式自动发现方式代码量60 行0 行维护成本高双份修改低单一数据源扩展性需要重新编译无需改 Go 代码类型安全编译时检查运行时检查2.2 命名参数到命令行参数的转换LLM 返回的是 JSON 格式的命名参数{ topic: 采蘑菇的小姑娘, style: warm, pages: 1}但 TypeScript 脚本期望的是命令行参数格式npx tsx generate-comic.ts --topic 采蘑菇的小姑娘 --style warm --pages 1关键实现adapter/goskills/goskills.gofunc (t *SkillTool) Call(ctx context.Context, input string) (string, error) { originalName : t.name switch originalName { // ... 预定义工具的处理 default: if scriptPath, ok : t.scriptMap[originalName]; ok { // 1. 尝试解析为命名参数格式 var namedParams map[string]any err : json.Unmarshal([]byte(input), namedParams) if err nil len(namedParams) 0 { // 2. 转换为命令行参数 var args []string paramMapping : map[string]string{ topic: --topic, style: --style, pages: --pages, aspect: --aspect, path: --image, prompt: --prompt, ar: --ar, quality: --quality, directory: --directory, } paramOrder : []string{topic, style, pages, aspect, path, prompt, ar, quality, directory} for _, key : range paramOrder { if value, ok : namedParams[key]; ok value ! nil { if flag, ok : paramMapping[key]; ok { args append(args, flag) args append(args, fmt.Sprintf(%v, value)) } } } // 3. 根据脚本类型执行 if strings.HasSuffix(scriptPath, .py) { return goskillstool.RunPythonScript(scriptPath, args) } elseif strings.HasSuffix(scriptPath, .ts) || strings.HasSuffix(scriptPath, .js) { return langgraphtool.RunTypeScriptScript(scriptPath, args) } else { return langgraphtool.RunShellScript(scriptPath, args) } } // 回退到旧的 args 数组格式... } }}2.3 TypeScript 脚本执行层使用npx tsx直接执行 TypeScript无需编译// tool/shell_tool.gofunc RunTypeScriptScript(scriptPath string, args []string) (string, error) { cmdArgs : append([]string{tsx, scriptPath}, args...) cmd : exec.Command(npx, cmdArgs...) var stdout, stderr bytes.Buffer cmd.Stdout stdout cmd.Stderr stderr err : cmd.Run() if err ! nil { return, fmt.Errorf(failed to run typescript script: %w\nStdout: %s\nStderr: %s, err, stdout.String(), stderr.String()) } return stdout.String() stderr.String(), nil}为什么选择 tsx✅ 无需预编译开发效率高✅ 支持 TypeScript 和 ESM✅ 与 Node.js 生态完全兼容✅ 支持最新的 JS 语法注意Skills 系统支持多种脚本类型的混合使用脚本类型执行方式适用场景TypeScript (.ts)npx tsx script.ts业务逻辑、图像生成JavaScript (.js)npx tsx script.js简单脚本Python (.py)python script.py数据处理、PDF 操作Shell (.sh)bash script.sh系统操作在本项目中baoyu-comic和baoyu-image-gen使用 TypeScriptpdf技能使用 Python未在漫画生成流程中使用三、完整工作流程3.1 智能体执行流程图用户输入 │ ▼┌─────────────────────────────────────────────────┐│ Agent 节点: LLM 规划 工具调用 ││ 输入: 用户请求 工具定义 ││ 输出: 结构化工具调用 │└────────────────────┬────────────────────────────┘ │ ▼ ┌──────────────────────┐ │ Tools 节点: 执行工具 │ └──────────────────────┘ │ ┌────────────┴────────────┐ ▼ ▼ 分镜生成脚本 图像生成脚本 (generate-comic.ts) (main.ts) │ │ ▼ ▼ 分镜 JSON 文件 漫画图像文件 │ │ └────────────┬────────────┘ ▼ PDF 合并脚本 (merge-to-pdf.ts) │ ▼ 完整漫画 PDF3.2 主程序完整代码// main.gopackage mainimport ( context fmt log os strings github.com/smallnest/goskills adapter github.com/smallnest/langgraphgo/adapter/goskills github.com/smallnest/langgraphgo/prebuilt github.com/tmc/langchaingo/llms github.com/tmc/langchaingo/llms/openai github.com/tmc/langchaingo/tools)func main() { // 1. 初始化 LLM // 推荐使用 ERNIE 5.0 Thinking Preview工具调用更稳定 // 如需使用设置环境变量 // export OPENAI_API_KEYyour-ernie-api-key // export OPENAI_BASE_URLhttps://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-5.0-thinking-preview llm, err : openai.New() if err ! nil { log.Fatal(err) } // 2. 从 skills 目录加载技能包 skillsDir : ./skills if _, err : os.Stat(skillsDir); os.IsNotExist(err) { skillsDir comic_skill_example/skills } packages, err : goskills.ParseSkillPackages(skillsDir) if err ! nil { log.Fatalf(解析技能包失败: %v, err) } iflen(packages) 0 { log.Fatal(在 skillsDir 中未找到任何技能) } // 3. 将技能转换为工具工具配置会从 SKILL.md 自动读取 var allTools []tools.Tool for _, skill : range packages { fmt.Printf(正在加载技能: %s - %s\n, skill.Meta.Name, skill.Meta.Description) // 工具配置会从 SKILL.md 的 tools 字段自动读取 skillTools, err : adapter.SkillsToTools(skill) if err ! nil { log.Printf(转换技能 %s 为工具失败: %v, skill.Meta.Name, err) continue } allTools append(allTools, skillTools...) } // 4. 筛选出漫画相关工具 var comicTools []tools.Tool for _, t : range allTools { if t.Name() generate_comic_storyboard || t.Name() generate_comic_image || t.Name() merge_comic_to_pdf { comicTools append(comicTools, t) } } // 5. 构建系统提示词 systemMsg : 你是一个有用的助手可以访问工具来创作漫画。当用户要求创建漫画时你必须调用 generate_comic_storyboard 函数。可用函数- generate_comic_storyboard: 创建完整的漫画分镜脚本和提示词- generate_comic_image: 生成单张漫画图像需要提示词和路径- merge_comic_to_pdf: 将漫画图像合并成 PDF工作流程1. 调用 generate_comic_storyboard 创建漫画分镜2. 如果输出显示 IMAGE_GENERATION_REQUIRED 则为每一页调用 generate_comic_image3. 调用 merge_comic_to_pdf 将所有图像合并成 PDF重要提示始终调用函数而不是提供文字描述。 // 6. 创建 Agent agent, err : prebuilt.CreateAgentMap(llm, comicTools, 20, prebuilt.WithSystemMessage(systemMsg), ) if err ! nil { log.Fatal(err) } // 7. 执行 ctx : context.Background() resp, err : agent.Invoke(ctx, map[string]any{ messages: []llms.MessageContent{ llms.TextParts(llms.ChatMessageTypeHuman, os.Args[1]), }, }) if err ! nil { log.Fatal(err) } // 8. 输出结果 if messages, ok : resp[messages].([]llms.MessageContent); ok { for _, msg : range messages { fmt.Printf([%s] %s\n, msg.Role, msg.Parts) } }}四、踩坑与解决方案4.1 DeepSeek V3 工具调用不稳定问题现象DeepSeek V3 返回的工具调用格式不稳定有时无法正确解析tool▁calls▁begintool▁call▁beginfunctiontool▁sepgenerate_comic_storyboard{topic:采蘑菇的小姑娘}tool▁call▁end解决方案更换为 ERNIE 5.0 Thinking Preview文心一言工具调用更稳定// 使用千帆平台配置llm, err : openai.New( openai.WithToken(your-ernie-api-key), openai.WithBaseURL(https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-5.0-thinking-preview),)4.2 TypeScript 脚本执行问题现象Bun API 与 Node.js 不兼容Cannot find package bun解决方案移除 Bun 特定 API如Bun.write使用 Node.js 兼容的 API如writeFileSync使用npx tsx替代bun run执行4.3 参数格式转换问题现象LLM 返回命名参数脚本期望命令行参数解决方案在工具执行层实现自动转换见 2.2 节4.4 中文文件名支持现象PDF 合并脚本的正则表达式无法匹配中文文件名解决方案// 添加 Unicode 中文字符范围const pagePattern /^(\d)-(cover|page)(-[\w\u4e00-\u9fff-])?\.(png|jpg|jpeg)$/i;五、最佳实践总结5.1 技能设计原则单一职责- 每个技能专注一个领域分镜、图像、PDF声明式配置- 工具定义在 SKILL.md 中而非硬编码语言选型- 脚本层使用 TypeScript/Python发挥各自优势5.2 错误处理// 脚本中要提供清晰的错误信息async function main() { try { // ... } catch (error) { console.error(Error:, error); console.error(Error message:, error?.message); process.exit(1); }}5.3 扩展性考虑当需要添加新工具时在SKILL.md中添加工具定义在scripts/目录添加对应脚本无需修改任何 Go 代码示例添加水印添加工具# SKILL.mdtools:-name:add_watermark script:scripts/add-watermark.ts description:为漫画添加水印 parameters: image: type:string required:true watermark: type:string required:true plaintext // scripts/add-watermark.ts// 实现水印逻辑六、性能优化建议6.1 并发图像生成// 并发生成所有页面var wg sync.WaitGroupsemaphore : make(chanstruct{}, 3) // 限制并发数for _, page : range pages { wg.Add(1) gofunc(p Page) { defer wg.Done() semaphore - struct{}{} // 获取信号量 deferfunc() { -semaphore }() // 释放信号量 generateImage(p) }(page)}wg.Wait()6.2 缓存机制// 对相同参数的请求使用缓存type CacheKey struct { Topic string Style string Pages int}var storyboardCache sync.Map{}七、未来展望7.1 可能的改进方向多模态输入- 支持图片、视频作为创作素材风格迁移- 一键切换漫画风格交互式编辑- 支持用户在生成过程中介入调整分布式部署- 将图像生成等耗时任务分布到多台机器AI时代未来的就业机会在哪里答案就藏在大模型的浪潮里。从ChatGPT、DeepSeek等日常工具到自然语言处理、计算机视觉、多模态等核心领域技术普惠化、应用垂直化与生态开源化正催生Prompt工程师、自然语言处理、计算机视觉工程师、大模型算法工程师、AI应用产品经理等AI岗位。掌握大模型技能就是把握高薪未来。那么普通人如何抓住大模型风口AI技术的普及对个人能力提出了新的要求在AI时代持续学习和适应新技术变得尤为重要。无论是企业还是个人都需要不断更新知识体系提升与AI协作的能力以适应不断变化的工作环境。因此这里给大家整理了一份《2026最新大模型全套学习资源》包括2026最新大模型学习路线、大模型书籍、视频教程、项目实战、最新行业报告、面试题、AI产品经理入门到精通等带你从零基础入门到精通快速掌握大模型技术由于篇幅有限有需要的小伙伴可以扫码获取1. 成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。这里我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。2. 大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF3. 大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。4. 大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。5. 大模型行业报告行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。6. 大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。为什么大家都在学AI大模型随着AI技术的发展企业对人才的需求从“单一技术”转向 “AI行业”双背景。企业对人才的需求从“单一技术”转向 “AI行业”双背景。金融AI、制造AI、医疗AI等跨界岗位薪资涨幅达30%-50%。同时很多人面临优化裁员近期科技巨头英特尔裁员2万人传统岗位不断缩减因此转行AI势在必行这些资料有用吗这份资料由我们和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。大模型全套学习资料已整理打包有需要的小伙伴可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询