Skip to main content

LangChainGo 提示词模板知识点详解

1. 提示词模板基础概念

提示词模板(Prompt Template)是LangChainGo中用于结构化生成提示词的核心组件,它允许开发者将变量动态插入到预定义的文本模板中。

核心特点:

  • 变量插值:支持在模板中定义变量占位符
  • 复用性:相同的模板结构可重复使用不同变量值
  • 标准化:保持提示词格式的一致性

2. 模板类型

2.1 字符串模板 (String Template)

import "github.com/tmc/langchaingo/prompts"

template := "请将以下文本翻译成{{.language}}: {{.text}}"
promptTemplate := prompts.NewPromptTemplate(template, []string{"language", "text"})

2.2 聊天模板 (Chat Template)

import "github.com/tmc/langchaingo/prompts"

messages := []prompts.ChatMessageTemplate{
prompts.NewSystemMessageTemplate("你是一个专业的{{.subject}}翻译官"),
prompts.NewHumanMessageTemplate("请翻译: {{.text}}"),
}
chatTemplate := prompts.NewChatPromptTemplate(messages)

2.3 少量示例模板 (FewShot Template)

examples := []map[string]string{
{"input": "高兴", "output": "happy"},
{"input": "悲伤", "output": "sad"},
}

template := prompts.NewFewShotPromptTemplate(
prompts.NewPromptTemplate("{{.input}} -> {{.output}}", []string{"input", "output"}),
examples,
prompts.NewPromptTemplate("请翻译: {{.input}}", []string{"input"}),
[]string{"input"},
)

3. 模板变量

3.1 基本变量插值

values := map[string]interface{}{
"language": "法语",
"text": "你好,世界",
}
result, _ := promptTemplate.Format(values)
// 输出: "请将以下文本翻译成法语: 你好,世界"

3.2 嵌套变量

template := "用户信息: 姓名: {{.user.name}}, 年龄: {{.user.age}}"
values := map[string]interface{}{
"user": map[string]interface{}{
"name": "张三",
"age": 30,
},
}

3.3 默认值处理

// 自定义模板函数处理缺失值
funcs := map[string]interface{}{
"default": func(val, def string) string {
if val == "" {
return def
}
return val
},
}

template := "欢迎{{default .name \"用户\"}}"
promptTemplate := prompts.NewPromptTemplate(template, []string{"name"}).WithFuncs(funcs)

4. 高级功能

4.1 模板函数

funcs := map[string]interface{}{
"toUpper": strings.ToUpper,
"add": func(a, b int) int { return a + b },
}

template := "{{.text | toUpper}} 结果是: {{add .num1 .num2}}"
promptTemplate := prompts.NewPromptTemplate(template, []string{"text", "num1", "num2"}).WithFuncs(funcs)

4.2 条件逻辑

funcs := map[string]interface{}{
"ternary": func(cond bool, trueVal, falseVal string) string {
if cond {
return trueVal
}
return falseVal
},
}

template := "{{ternary (eq .role \"admin\") \"管理员面板\" \"用户面板\"}}"

4.3 循环结构

funcs := map[string]interface{}{
"join": strings.Join,
}

template := "可选语言: {{join .languages \", \"}}"
values := map[string]interface{}{
"languages": []string{"Go", "Python", "JavaScript"},
}

5. 最佳实践

5.1 模板组织建议

  • 将常用模板存储在单独的文件或包中
  • 按功能领域分类模板(如翻译、摘要、问答等)
  • 为复杂模板添加注释说明变量用途

5.2 性能优化

  • 复用已创建的模板实例
  • 对高频使用的模板进行预编译
  • 避免在热路径中动态创建模板

5.3 安全考虑

  • 对用户提供的变量值进行转义处理
  • 限制模板函数的权限
  • 避免将敏感信息硬编码在模板中

6. 实际应用示例

6.1 翻译服务模板

translationTemplate := prompts.NewPromptTemplate(
`你是一位专业的{{.sourceLang}}到{{.targetLang}}翻译员。
请将以下文本翻译成{{.targetLang}}:
---
{{.text}}
---
翻译要求:
- 保持专业语气
- 保留专业术语
- 输出结果不要包含解释`,
[]string{"sourceLang", "targetLang", "text"},
)

6.2 客服对话模板

chatTemplate := prompts.NewChatPromptTemplate([]prompts.ChatMessageTemplate{
prompts.NewSystemMessageTemplate(
`你是{{.company}}的客服助手。
公司政策:
- 退货期限: {{.returnPolicyDays}}天
- 客服时间: {{.serviceHours}}
当前用户: {{.userName}} (会员级别: {{.userLevel}})`,
),
prompts.NewHumanMessageTemplate("{{.userQuery}}"),
})

6.3 数据分析模板

analysisTemplate := prompts.NewPromptTemplate(
`请分析以下数据集:
数据集名称: {{.datasetName}}
字段:
{{range .fields}}- {{.}}
{{end}}

分析要求:
1. 识别数据模式
2. 指出异常值
3. 建议可视化方式

输出格式:
### 分析结果
**模式识别**:
**异常值**:
**可视化建议**: `,
[]string{"datasetName", "fields"},
)

7. 调试技巧

7.1 模板验证

// 检查模板语法
err := promptTemplate.Validate()
if err != nil {
// 处理错误
}

// 检查变量完整性
missing := promptTemplate.CheckVariables(values)
if len(missing) > 0 {
// 处理缺失变量
}

7.2 日志记录

// 记录最终生成的提示词
logger.Printf("Generated prompt: %s", result)

// 记录模板处理过程
promptTemplate.WithLogger(logger)

掌握这些提示词模板知识点,可以让你在LangChainGo中更高效地构建和管理复杂的提示词逻辑,提升与大模型交互的质量和一致性。