Skip to content

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

昨天的问题

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

今天做什么

两件事:

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

第二,引入Mock LLM。 真实的LLM(比如GPT-4)需要API Key、需要联网、需要花钱。Mock LLM是一个"假的"LLM——它用关键词匹配来模拟回答。虽然简单,但它让你零成本把整个逻辑跑通。等逻辑通了,替换成真实LLM只需要改一行代码。

你学开车的时候,也不会第一天就上高速——先在驾校场地练。Mock LLM就是驾校场地。

LangChain是什么

你可能会问:我们不直接写if-else判断关键词吗?为什么要引入LangChain?

因为if-else只能处理你写死的关键词——未来Agent要处理成千上万种用户问题,你不可能全部写死。LangChain的Prompt模板和LLM接口是通用架构,今天用Mock LLM,明天换成GPT-4,Prompt那部分代码不用改。架构对了,底层随便换。

你需要安装

bash
pip install langchain langchain-core

代码

在Day 1的基础上扩展。新建 day2.py

📁 今天的代码目录

customer_service_agent/
├── day1.py         (Day1的代码,不动)
└── day2.py         ← 新增!+40行
python
# day2.py

from langchain.prompts import ChatPromptTemplate

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

# 把System Prompt和用户消息组装在一起
prompt = ChatPromptTemplate.from_messages([
    ("system", SYSTEM_PROMPT),
    ("user", "{user_message}")
])

# ===== Day2新增:Mock LLM(零成本的"假"大模型)=====
class MockLLM:
    """
    模拟大语言模型。
    真实的LLM(如GPT-4)会理解语义、推理、生成自然语言。
    MockLLM用关键词匹配来模拟这个行为——虽然简单,但逻辑是一样的。
    """
    def invoke(self, messages):
        # 提取用户说的最后一句话
        last_msg = messages[-1].content
        last_msg = str(last_msg)
        
        # 根据关键词返回不同回答
        if "你好" in last_msg or "您好" in last_msg:
            return "您好!我是小智,有什么可以帮您的?😊"
        elif "订单" in last_msg and "什么时候" in last_msg:
            return "您的订单正在运输中,预计明天到达。您可以在'我的订单'页面查看物流详情哦。"
        elif "订单" in last_msg:
            return "请问您的订单号是多少呢?我帮您查一下。"
        elif "退货" in last_msg:
            return "如需退货,请在收到商品后7天内在'我的订单'页面申请,我们会尽快处理。退货邮费由我们承担。"
        elif "退款" in last_msg:
            return "退款会在审核通过后3-5个工作日原路返回到您的账户。"
        elif "谢谢" in last_msg:
            return "不客气!还有其他可以帮您的吗?"
        else:
            return "收到您的消息。如果问题比较复杂,我帮您转接人工客服好吗?"

llm = MockLLM()

# ===== 组装Agent =====
def customer_service_agent(user_message: str) -> str:
    """
    Day2的Agent:
    1. 把用户消息放进Prompt模板(告诉LLM"你是客服")
    2. 让MockLLM生成回答
    """
    # 第一步:用Prompt模板包装用户消息
    formatted_messages = prompt.invoke({"user_message": user_message})
    
    # 第二步:让LLM生成回答
    response = llm.invoke(formatted_messages.messages)
    
    return response

# ===== 测试 =====
if __name__ == "__main__":
    test_cases = [
        "你好",
        "我的订单什么时候到?",
        "怎么退货?",
        "退款要多久?",
        "谢谢",
        "今天天气怎么样?"  # 超出知识范围的问题
    ]
    
    for msg in test_cases:
        print(f"👤 用户: {msg}")
        print(f"🤖 小智: {customer_service_agent(msg)}")
        print()

运行

bash
python day2.py

你应该看到Agent用不同的语气和内容回答了不同的问题:

👤 用户: 你好
🤖 小智: 您好!我是小智,有什么可以帮您的?😊

👤 用户: 我的订单什么时候到?
🤖 小智: 您的订单正在运输中,预计明天到达。

👤 用户: 怎么退货?
🤖 小智: 如需退货,请在收到商品后7天内申请。

👤 用户: 退款要多久?
🤖 小智: 退款会在审核通过后3-5个工作日到账。

👤 用户: 谢谢
🤖 小智: 不客气!还有其他可以帮您的吗?

👤 用户: 今天天气怎么样?
🤖 小智: 收到您的消息。如果问题比较复杂,我帮您转接人工客服好吗?

注意最后一个问题——MockLLM没有匹配到任何关键词,走了兜底分支。这就是Agent的边界意识——不知道就说不知道。

你学到了什么

Prompt模板决定了Agent的"性格"。 同样的用户问题,如果System Prompt是"你是一个暴躁客服",Agent的回答会完全不同。System Prompt里写的每一条规则,都是Agent的行为准则。

Mock LLM是零成本的原型工具。 你可以随时在 MockLLM 里添加新的关键词和回复,马上看到效果。等你把所有逻辑都验证通过了,只需要把 MockLLM 替换成 ChatOpenAI(model="gpt-4") ——其他代码一行不改。

明天的预告

今天的Agent虽然能回答不同问题了,但它的"知识"是写死在代码里的。明天我们加入RAG(检索增强生成)——让Agent能从公司的FAQ文档里查找答案,而不是靠死记硬背。


Day 2完成。你的Agent从"回声筒"升级成了"有性格的客服"。虽然用的是Mock LLM,但架构已经和真实Agent一模一样了。