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一模一样了。

