ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Genkit Go 提示词(Prompts)完整指南:DefinePrompt、DefineDataPrompt 与 .prompt 文件实战

Genkit Go 提示词(Prompts)完整指南:DefinePrompt、DefineDataPrompt 与 .prompt 文件实战 Genkit Go 提示词Prompts完整指南DefinePrompt、DefineDataPrompt 与 .prompt 文件实战【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills导读本文是 Genkit Go 中提示词Prompts体系的系统性实战指南覆盖代码内定义提示词DefinePrompt、强类型提示词DefineDataPrompt、独立.prompt文件Dotprompt加载、以及 JSON Schema 注册四种主要方式。读者将掌握如何为 Go 的 AI 应用定义可复用的提示词、在执行时覆盖模型与参数、实现流式输出并通过jsonschema标签与.prompt文件 frontmatter 构造结构化输入输出。文中所有示例均可在项目 skills/cloud/genkit-go/references/prompts.md 文档基础上结合仓库内 SKILL.md 与 getting-started.md 等资料运行验证。一、提示词在 Genkit Go 中的定位在 Genkit Go 中提示词Prompt是一种可复用的提示模板 模型 配置封装。与每次手写genkit.Generate调用不同提示词把模型选择、输入/输出 Schema、模板文本固化为一个可命名、可查询、可执行的资源。其优势体现在复用同一提示词可在不同请求中反复执行仅改变输入可观测提示词与 Flow 一样注册在*Genkit实例中可被 Developer UI 与genkitCLI 追踪详见 SKILL.md 的 Genkit CLI 一节声明式.prompt文件把提示内容与 Go 代码解耦改动无需重新编译这是 SKILL.md 中明确推荐的做法——复杂提示词用.prompt文件简单单行提示词用代码定义。执行提示词前需要先完成环境初始化调用genkit.Init获得*Genkit实例g并注册模型插件如googlegenai。初始化细节可参考 getting-started.md模型提供方Google AI、Vertex AI、Anthropic、OpenAI 兼容、Ollama配置见 providers.md。二、DefinePrompt在代码中定义可复用提示词genkit.DefinePrompt是代码内定义提示词的核心入口。它接受一个默认模型和一个模板注册到*Genkit实例后即可多次执行。jokePrompt : genkit.DefinePrompt(g, joke, ai.WithModel(googlegenai.ModelRef(googleai/gemini-flash-latest, nil)), ai.WithInputType(JokeRequest{Topic: example}), ai.WithPrompt(Tell me a joke about {{topic}}.), )各选项说明模型引用ai.WithModel(googlegenai.ModelRef(...))显式指定模型也可用ai.WithModelName(googleai/gemini-flash-latest)按名称字符串指定。模型名遵循googleai/model-id格式见 providers.md输入类型ai.WithInputType声明输入结构模板中通过{{topic}}这类模板变量占位提示模板ai.WithPrompt支持模板变量语法与生成 API 中的ai.WithPrompt支持fmt动词不同提示词模板使用{{变量名}}形式。2.1 Execute同步执行resp, err : jokePrompt.Execute(ctx, ai.WithInput(map[string]any{topic: cats}), ) fmt.Println(resp.Text())Execute返回*ModelResponse可通过resp.Text()取拼接后的文本也可访问FinishReason、Usage等元数据参见 generation.md 对Generate返回值的说明。2.2 ExecuteStream流式执行stream : jokePrompt.ExecuteStream(ctx, ai.WithInput(map[string]any{topic: cats}), ) for result, err : range stream { if err ! nil { return err } if result.Done { break } fmt.Print(result.Chunk.Text()) }ExecuteStream返回 Go 迭代器iterator每个元素含.Done、.Chunk、.Response等字段——这一结构与 generation.md 中GenerateStream的迭代协议一致适合长文本逐块输出场景。2.3 执行时覆盖选项提示词定义时的默认值可在执行时按需覆盖resp, err : jokePrompt.Execute(ctx, ai.WithInput(map[string]any{topic: cats}), ai.WithModelName(googleai/gemini-pro-latest), // 覆盖模型 ai.WithConfig(map[string]any{temperature: 0.9}), ai.WithTools(myTool), )ai.WithModelName临时切换模型不改动提示词定义ai.WithConfig传入提供方相关的模型配置如temperatureGoogle AI 亦可使用genai.GenerateContentConfig类型直接配置ThinkingConfig详见 providers.mdai.WithTools为本次执行附加工具。工具定义方式见 tools.md工具调用循环由ai.WithMaxTurns默认 5控制。三、DefineDataPrompt基于 Go 泛型的强类型提示词当需要结构化输出时DefineDataPrompt利用 Go 泛型把输入和输出绑定为具体类型模型输出会被自动解析为 Go 值。type JokeRequest struct { Topic string json:topic } type Joke struct { Setup string json:setup jsonschema:descriptionThe setup Punchline string json:punchline jsonschema:descriptionThe punchline } jokePrompt : genkit.DefineDataPromptJokeRequest, *Joke), ai.WithPrompt(Tell me a joke about {{topic}}.), )DefineDataPrompt[In, Out]的类型参数依次是输入类型与输出类型输出常用指针类型*Joke。3.1 强类型 Executejoke, resp, err : jokePrompt.Execute(ctx, JokeRequest{Topic: cats}) // joke is *Joke, resp is *ModelResponse注意与DefinePrompt.Execute传入map[string]any不同这里直接传入强类型JokeRequest返回值第一个是解析后的*Joke。3.2 强类型 ExecuteStreamstream : jokePrompt.ExecuteStream(ctx, JokeRequest{Topic: cats}) for result, err : range stream { if err ! nil { return err } if result.Done { finalJoke : result.Output // *Joke break } fmt.Print(result.Chunk) // 部分解析的 *Joke }流式执行中result.Chunk是部分解析的*Joke对象结构化输出流式到达的增量片段result.Output在Done后给出最终完整对象。这一协议与 generation.md 中GenerateDataStream完全一致。3.3 与 jsonschema 标签的配合SKILL.md 的关键指引强调务必在输出类型字段上写jsonschema:description...标签。模型依据这些描述理解每个字段应包含的内容缺少描述会显著降低结构化输出质量。标签还支持enum约束例如type Recipe struct { Title string json:title jsonschema:descriptionThe recipe title Difficulty string json:difficulty jsonschema:enumeasy,enummedium,enumhard Ingredients []Ingredient json:ingredients Steps []string json:steps }四、.prompt 文件Dotprompt声明式提示词.prompt文件把提示词从 Go 代码中剥离出来使用YAML frontmatter Handlebars 模板描述支持不改代码、不重新编译即可迭代提示词内容SKILL.md 推荐用于复杂提示词。4.1 基础 .prompt 文件prompts/joke.prompt--- model: googleai/gemini-flash-latest input: schema: topic: string --- Tell me a joke about {{topic}}.frontmatter 的model声明默认模型input.schema以内联形式声明输入 Schema正文即提示模板。4.2 加载与使用LookupPrompt// LookupPrompt 返回未类型化的 Prompt输入 map[string]any输出 string jokePrompt : genkit.LookupPrompt(g, joke) resp, err : jokePrompt.Execute(ctx, ai.WithInput(map[string]any{topic: cats}), )genkit.LookupPrompt(g, name)按名称从注册表中查询提示词返回的Prompt未类型化输入输出分别使用map[string]any与 string。4.3 强类型 .prompt 文件LookupDataPromptprompts/structured-joke.prompt通过input.schema/output.schema引用已注册的具名 Schema并可配置输出格式--- model: googleai/gemini-flash-latest config: thinkingConfig: thinkingBudget: 0 input: schema: JokeRequest output: format: json schema: Joke --- Tell me a joke about {{topic}}.先在 Go 中注册类型使.prompt文件能按名称引用genkit.DefineSchemaForJokeRequest genkit.DefineSchemaForJoke jokePrompt : genkit.LookupDataPromptJokeRequest, *Joke joke, resp, err : jokePrompt.Execute(ctx, JokeRequest{Topic: cats})config.thinkingConfig.thinkingBudget: 0用于关闭 thinking 模式等价于 providers.md 中genai.ThinkingConfig{ThinkingBudget: 0}的配置方式。输出侧format: json与schema结合即 generation.md 中Format Schema 组合在文件形式下的表达。4.4 LoadPrompt显式路径加载prompt : genkit.LoadPrompt(g, ./prompts/countries.prompt, countries) resp, err : prompt.Execute(ctx)LoadPrompt可直接按文件路径加载.prompt文件并注册。默认提示词目录为prompts可通过genkit.WithPromptDir修改或用go:embedgenkit.WithPromptFS把.prompt文件打进二进制详见 getting-started.md。五、.prompt 文件高级特性5.1 多消息提示词角色用{{ role ... }}辅助函数构造 system / user 等多条消息--- model: googleai/gemini-flash-latest input: schema: question: string --- {{ role system }} You are a helpful assistant. {{ role user }} {{question}}5.2 媒体输入{{media url... contentType...}}可在模板中内嵌媒体如图片、视频 URL--- model: googleai/gemini-flash-latest input: schema: videoUrl: string contentType: string --- {{ role user }} Summarize this video: {{media urlvideoUrl contentTypecontentType}}5.3 条件与循环Handlebars 语法{{#if}}/{{#each}}/{{#unless last}}支持条件渲染与列表遍历--- input: schema: topic: string dietaryRestrictions?(array): string --- Write a recipe about {{topic}}. {{#if dietaryRestrictions}} Dietary restrictions: {{#each dietaryRestrictions}}{{this}}{{#unless last}}, {{/unless}}{{/each}}. {{/if}}注意dietaryRestrictions?(array)中?表示可选字段(array)声明数组类型。5.4 内联 Schema输入与输出 Schema 均可直接内联写在 frontmatter 中无需注册 Go 类型--- model: googleai/gemini-flash-latest input: schema: topic: string style?: string output: format: json schema: title: string body: string tags(array): string --- Write an article about {{topic}}. {{#if style}}Write in a {{style}} style.{{/if}}5.5 工具、工具循环控制与中间件.promptfrontmatter 还可声明工具调用与中间件使agent 风格的提示词完全在文件中描述--- model: googleai/gemini-flash-latest input: schema: tone: string tools: - getAttractions - getFlightInfo toolChoice: auto # auto | required | none maxTurns: 20 # 最大工具调用循环次数对应 WithMaxTurns returnToolRequests: false # 返回工具请求而非执行对应 WithReturnToolRequests use: - name: genkit-middleware/retry config: maxRetries: 2 - genkit-middleware/fallback # 裸字符串 中间件名称无配置 --- {{role system}} You are a friendly trip planning assistant. Keep your tone {{tone}}. {{history}}字段与选项的映射关系如下表FrontmatterOption说明toolsWithTools已注册工具的名称列表字符串toolChoiceWithToolChoiceauto、required或nonemaxTurnsWithMaxTurns整数工具循环最大迭代次数returnToolRequestsWithReturnToolRequests布尔值useWithUse中间件引用列表use中的条目按名称解析到注册在*Genkit实例上的中间件。每条目可以是裸字符串中间件名也可以是带name与可选config的映射。注册内置中间件插件后genkit-middleware/retry等名称即可被解析import github.com/firebase/genkit/go/plugins/middleware g : genkit.Init(ctx, genkit.WithPlugins( googlegenai.GoogleAI{}, middleware.Middleware{}, // 注册 genkit-middleware/{retry,fallback,filesystem,skills,toolApproval} ))内置命名中间件包括genkit-middleware/retry、genkit-middleware/fallback、genkit-middleware/filesystem、genkit-middleware/skills、genkit-middleware/toolApproval。完整机制见 middleware.md。提示{{history}}辅助函数用于注入对话历史是构造多轮对话提示词agent 场景的常用手法结合 agents.md 介绍的 experimental Agent API 可构建持久化多轮会话。六、Schemas为 .prompt 文件注册具名 Schema.prompt文件按名称引用 Schema 的前提是先在 Go 侧完成注册两种方式如下。6.1 DefineSchemaFor从 Go 类型注册genkit.DefineSchemaForT把 Go 结构体注册为具名 Schema名称即 Go 类型名供.prompt文件的input.schema/output.schema引用genkit.DefineSchemaForJokeRequest genkit.DefineSchemaForJoke注册元数据使用jsonschema结构体标签支持description、enum等type Recipe struct { Title string json:title jsonschema:descriptionThe recipe title Difficulty string json:difficulty jsonschema:enumeasy,enummedium,enumhard Ingredients []Ingredient json:ingredients Steps []string json:steps } type Ingredient struct { Name string json:name Amount float64 json:amount Unit string json:unit }6.2 DefineSchema手动 JSON Schema当 Schema 没有对应 Go 类型时可手动传入 JSON Schema 字典genkit.DefineSchema(g, Recipe, map[string]any{ type: object, properties: map[string]any{ title: map[string]any{type: string}, ingredients: map[string]any{ type: array, items: map[string]any{type: object}, }, }, required: []string{title, ingredients}, })七、实战建议与最佳实践综合 SKILL.md 的关键指引使用提示词时建议显式传递g*Genkit实例是集中注册表所有提示词定义与查询函数都需要它不要存为全局变量把 AI 逻辑包进 Flow提示词执行建议放在DefineFlow中以获得追踪、可观测性与 HTTP 部署能力genkit.Handler并可借助genkit start -- go run .在 Developer UI 中调试提示词渲染与模型输入输出复杂提示词用.prompt文件Handlebars 模板 YAML frontmatter 让内容与代码解耦、免重编译迭代简单单行提示词用代码内DefinePrompt更直接输出类型务必写jsonschema:description...模型靠字段描述理解输出结构缺失时结构化输出质量明显下降结构化输出优先DefineDataPrompt/LookupDataPromptGo 泛型在编译期保证输入输出类型安全运行时自动完成 JSON 解析与校验复杂编排优先内置中间件Retry、Fallback、ToolApproval、Filesystem、Skills覆盖常见横切需求可通过usefrontmatter 声明式组合避免自造轮子。参考文档本文依据prompts.md入口与总览SKILL.md初始化与 CLIgetting-started.md生成与流式输出generation.md工具定义与工具循环tools.md模型提供方配置providers.md中间件机制middleware.md【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表