Skip to main content

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. 问题分类:分析客户问题并归类(技术支持、账单问题、产品咨询等)
  2. 解决方案生成:基于问题类型提供详细的解决步骤
  3. 邮件回复生成:生成专业的客户服务回复邮件

关键知识点学习笔记

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 在实际业务场景中的应用,主要学习收获:

  1. 框架理解:深入理解了 LangChain 的链式处理概念
  2. 实践经验:掌握了 Prompt Engineering 的实际技巧
  3. 工程思维:学会了如何设计可维护的 AI 应用架构
  4. 问题解决:积累了调试和优化 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("=== 完整的客户服务流程演示完成 ===")
}