Skip to content

Day 2:加Prompt和Mock LLM——让Agent有人设

昨天的问题

Day 1 的 Agent 是个回声筒——你说"订单",它回"客服收到:订单"。它不知道自己是谁、该用什么语气、遇到不同问题该怎么回答。

今天做什么

两件事:

第一,给 Agent 一个 Prompt 模板。 Prompt 就是 Agent 的"工作说明书"——你告诉它"你是客服、语气亲切、不要编造信息",它就会照着做。

第二,引入 Mock LLM。 真实的 LLM 需要 API Key、需要联网、需要花钱。Mock LLM 用关键词匹配来模拟回答——零成本跑通逻辑。等逻辑通了,替换成真实 LLM 只需改一行代码。

你需要安装

bash
go get github.com/cloudwego/eino@latest

代码

go
package main

import (
    "context"
    "fmt"
    "os"
    "strings"

    "github.com/cloudwego/eino/components/model"
    "github.com/cloudwego/eino/schema"
)

// ===== System Prompt:Agent 的"工作说明书" =====
const systemPrompt = `你是一个电商客服助手,名字叫"小智"。
你说话的规则:
1. 语气亲切友好,但不啰嗦
2. 回答尽量控制在两句话以内
3. 遇到不知道的事情,诚实说"这个问题我需要帮您查一下"
4. 绝对不要编造任何信息`

// ===== Mock ChatModel:零成本的假大模型 =====
type MockChatModel struct{}

func (m *MockChatModel) Generate(ctx context.Context,
    input []*schema.Message, opts ...model.Option) (*schema.Message, error) {

    // 提取用户说的最后一句话
    lastMsg := input[len(input)-1].Content

    // 关键词匹配模拟回答
    switch {
    case strings.Contains(lastMsg, "订单"):
        return schema.AssistantMessage(
            "您的订单正在处理中,预计 2-3 天送达。需要我帮您查具体订单号吗?"), nil
    case strings.Contains(lastMsg, "退款") || strings.Contains(lastMsg, "退货"):
        return schema.AssistantMessage(
            "退款流程一般需要 3-5 个工作日。请问您的订单号是多少?"), nil
    case strings.Contains(lastMsg, "你好") || strings.Contains(lastMsg, "嗨"):
        return schema.AssistantMessage(
            "您好!我是小智,很高兴为您服务。请问有什么可以帮您的?"), nil
    default:
        return schema.AssistantMessage(
            "这个问题我需要帮您查一下,请稍等哦~"), nil
    }
}

func main() {
    ctx := context.Background()

    // 创建 Mock 模型
    mockModel := &MockChatModel{}

    testMessages := []string{
        "你好",
        "我的订单什么时候到?",
        "我要退款",
        "今天天气怎么样?",
    }

    for _, msg := range testMessages {
        input := []*schema.Message{
            schema.SystemMessage(systemPrompt),
            schema.UserMessage(msg),
        }

        response, err := mockModel.Generate(ctx, input)
        if err != nil {
            fmt.Printf("❌ 错误: %v\n", err)
            continue
        }

        fmt.Printf("👤 用户: %s\n", msg)
        fmt.Printf("🤖 小智: %s\n\n", response.Content)
    }
}

运行

bash
go run main.go

Mock LLM 的设计思路

为什么用关键词匹配而不是 if-else?因为架构要对。MockChatModel 实现了和真实 ChatModel 完全相同的接口——收 []*schema.Message,返回 *schema.Message。明天换成真实 LLM,只改创建模型的那一行:

go
// 从 Mock 切换到真实 OpenAI,只改这一行
realModel, _ := model.NewChatModel(ctx, &model.ChatModelConfig{
    Model:  "gpt-4o",
    APIKey: os.Getenv("OPENAI_API_KEY"),
})

明天的预告

Agent 有人设了,但它还不会查资料。明天我们接入 RAG——把公司文档喂给它,让它能回答"退款政策是什么"这种需要专业知识的问题。


Day 2 完成。你的 Agent 现在有"人设"了,还会根据关键词给出不同回答。