LangChain Go 客户服务流程自动化演示
项目概述
这是一个基于 LangChain Go 的客户服务流程自动化演示项目,展示了如何使用多步骤 AI 链来处理客户问题,从问题分类到生成专业的回复邮件。
技术栈
- Go 1.23.4
- LangChain Go (v0.1.13) - AI 应用开发框架
- DeepSeek API - 大语言模型服务
- Prompt Templates - 结构化提示词模板
项目结构
demo02/
├── main.go # 主程序文件
├── go.mod # Go 模块配置
├── go.sum # 依赖锁定文件
└── readme.md # 项目说明文档
核心功能
1. 智能客户服务工作流
项目实现了一个完整的客户服务处理流程:
客户问题 → 问题分类 → 解决方案生成 → 回复邮件生成
2. 三步骤处理链
- 问题分类:分析客户问题并归类(技术支持、账单问题、产品咨询等)
- 解决方案生成:基于问题类型提供详细的解决步骤
- 邮件回复生成:生成专业的客户服务回复邮件
关键知识点学习笔记
1. LangChain Go 基础概念
Chain(链)
- 定义:将多个 AI 组件串联起来的处理单元
- 接口要求:
type Chain interface {
Call(ctx context.Context, inputs map[string]any, options ...ChainCallOption) (map[string]any, error)
GetMemory() schema.Memory
GetInputKeys() []string
GetOutputKeys() []string
}
LLMChain(语言模型链)
- 作用:将 LLM 和 Prompt Template 结合
- 创建方式:
llmChain := chains.NewLLMChain(llm, promptTemplate)
2. Prompt Template 设计
模板语法
template := `请分析以下客户问题:
客户问题: {{.customer_issue}}
分类结果:`
promptTemplate := prompts.NewPromptTemplate(template, []string{"customer_issue"})
关键要素
- 占位符:使用
{{.变量名}}语法 - 输入键:明确指定模板需要的输入参数
- 结构化输出:设计清晰的输出格式
3. DeepSeek API 集成
配置要点
llm, err := openai.New(
openai.WithToken(os.Getenv("DEEPSEEK_API_KEY")),
openai.WithBaseURL("https://api.deepseek.com/v1"),
openai.WithModel("deepseek-chat"),
)
环境变量设置
export DEEPSEEK_API_KEY="your_api_key_here"
4. 链式处理模式
手动链式处理
本项目采用手动链式处理,原因:
- 灵活性:每个步骤都能访问原始输入
- 可控性:能够精确控制数据流转
- 调试友好:便于单独测试每个环节
代码模式
// 步骤1
result1, err := chains.Call(ctx, chain1, inputs)
// 步骤2
result2, err := chains.Call(ctx, chain2, combinedInputs)
// 步骤3
result3, err := chains.Call(ctx, chain3, finalInputs)
5. 错误处理策略
分层错误处理
if err != nil {
log.Fatalf("创建 LLM 失败: %v", err)
}
类型断言安全
issueCategory := result1["text"].(string)
运行指南
1. 环境准备
# 设置 DeepSeek API Key
export DEEPSEEK_API_KEY="your_deepseek_api_key"
# 安装依赖
go mod tidy
2. 运行程序
go run main.go
3. 预期输出
程序将输出完整的客户服务处理流程:
- 客户问题描述
- 问题分类结果
- 详细解决方案
- 专业回复邮件
技术难点与解决方案
1. SequentialChain 使用困难
问题:LangChain Go 的 SequentialChain 在处理复杂输入输出时容易出错
解决方案:采用手动链式调用,提供更好的控制和调试能力
2. 中文 Prompt 优化
挑战:确保中文提示词的准确性和专业性
策略:
- 使用清晰的结构化提示词
- 提供具体的输出格式要求
- 包含上下文信息
3. API 兼容性
问题:DeepSeek API 与 OpenAI API 的兼容性配置
解决:使用正确的 BaseURL 和模型名称配置
扩展建议
1. 功能扩展
- 添加更多问题类型处理
- 实现多语言支持
- 集成数据库存储客户交互历史
2. 性能优化
- 实现异步处理
- 添加缓存机制
- 批量处理支持
3. 工程化改进
- 添加配置文件管理
- 实现日志系统
- 添加单元测试
学习总结
这个项目展示了 LangChain Go 在实际业务场景中的应用,主要学习收获:
- 框架理解:深入理解了 LangChain 的链式处理概念
- 实践经验:掌握了 Prompt Engineering 的实际技巧
- 工程思维:学会了如何设计可维护的 AI 应用架构
- 问题解决:积累了调试和优化 AI 应用的经验
通过这个项目,可以为更复杂的 AI 应用开发打下坚实基础。
package main
import (
"context"
"fmt"
"github.com/tmc/langchaingo/chains"
"github.com/tmc/langchaingo/llms/openai"
"github.com/tmc/langchaingo/prompts"
"log"
"os"
)
func main() {
// 演示复杂的多步骤任务处理
demonstrateComplexSequentialChain()
}
// 演示复杂的多步骤任务处理
func demonstrateComplexSequentialChain() {
fmt.Println("=== 复杂 SequentialChain 演示:客户服务流程 ===")
// 设置 LLM
llm, err := openai.New(
openai.WithToken(os.Getenv("DEEPSEEK_API_KEY")),
openai.WithBaseURL("https://api.deepseek.com/v1"), // DeepSeek API 基础 URL
openai.WithModel("deepseek-chat"),
)
if err != nil {
log.Fatalf("创建 LLM 失败: %v", err)
}
// 执行链
ctx := context.Background()
customerIssue := "我的账单显示了错误的金额,比实际使用量高了很多,希望能够核实并退款"
// 手动执行三个步骤,这样更清晰地演示顺序处理
fmt.Printf("客户问题: %s\n\n", customerIssue)
// 步骤1: 问题分类
fmt.Println("步骤1: 问题分类")
classificationPrompt := prompts.NewPromptTemplate(
`请分析以下客户问题并进行分类:
客户问题: {{.customer_issue}}
请从以下类别中选择:
- 技术支持
- 账单问题
- 产品咨询
- 投诉建议
- 其他
分类结果:`,
[]string{"customer_issue"},
)
classificationChain := chains.NewLLMChain(llm, classificationPrompt)
result1, err := chains.Call(ctx, classificationChain, map[string]any{
"customer_issue": customerIssue,
})
if err != nil {
log.Fatalf("执行分类链失败: %v", err)
}
issueCategory := result1["text"].(string)
fmt.Printf("分类结果: %s\n\n", issueCategory)
// 步骤2: 生成解决方案
fmt.Println("步骤2: 生成解决方案")
solutionPrompt := prompts.NewPromptTemplate(
`基于客户问题和分类,请提供专业的解决方案:
客户问题: {{.customer_issue}}
问题分类: {{.issue_category}}
请提供详细的解决步骤和建议:
解决方案:`,
[]string{"customer_issue", "issue_category"},
)
solutionChain := chains.NewLLMChain(llm, solutionPrompt)
result2, err := chains.Call(ctx, solutionChain, map[string]any{
"customer_issue": customerIssue,
"issue_category": issueCategory,
})
if err != nil {
log.Fatalf("执行解决方案链失败: %v", err)
}
solution := result2["text"].(string)
fmt.Printf("解决方案: %s\n\n", solution)
// 步骤3: 生成回复邮件
fmt.Println("步骤3: 生成回复邮件")
emailPrompt := prompts.NewPromptTemplate(
`请基于以下信息生成一封专业的客户服务回复邮件:
客户问题: {{.customer_issue}}
解决方案: {{.solution}}
邮件应该包括:
- 礼貌的问候
- 问题确认
- 解决方案说明
- 后续支持信息
- 专业的结尾
回复邮件:`,
[]string{"customer_issue", "solution"},
)
emailChain := chains.NewLLMChain(llm, emailPrompt)
result3, err := chains.Call(ctx, emailChain, map[string]any{
"customer_issue": customerIssue,
"solution": solution,
})
if err != nil {
log.Fatalf("执行邮件链失败: %v", err)
}
emailResponse := result3["text"].(string)
fmt.Printf("回复邮件: %s\n\n", emailResponse)
fmt.Println("=== 完整的客户服务流程演示完成 ===")
}