[智能客服project] AI提示词配置 | 主协调器 | 闲鱼协议工具
第五章:AI提示词配置
欢迎回来!
在第四章:意图路由器中,我们了解了机器人如何通过IntentRouter
确定由哪个专家代理(如PriceAgent
或TechAgent
)处理用户消息。
但代理被选定后,如何知道该说什么?如何以友好卖家身份应对技术问题,或按照策略进行价格协商?
(专家代理分类的越细,就便于生成更准确的提示词给LLM
)
这正是AI提示词配置的核心作用。
为什么AI代理需要"提示词配置"?
想象你聘请演员出演话剧中的特定角色。你不会只说"去表演!",而是提供剧本、角色性格说明、场景背景以及具体台词指导。
-
我们的AI代理如同演员,大语言模型(LLM)是底层能力,但需要清晰指引——“剧本"和"角色设定”——才能在闲鱼对话场景中正确表现。
-
这些指引即
提示词
。提示词配置就是定义并加载这些指令的过程,使每个代理在处理特定类型用户请求时,明确知晓行为准则和关键信息。 -
这正是我们告诉AI的方式:“当处理这类消息(如价格问题)时,记住你是卖家,商品细节是这样,对话历史是那样,你的目标是礼貌协商。”
什么是AI提示词配置?
AI提示词配置指代一系列文本指令、规则和上下文信息的集合,由代理打包发送给大语言模型(LLM),用于引导回复生成。
-
在
XianyuAutoAgent
项目中,这些提示词定义于纯文本文件。 -
每个专家代理(如
PriceAgent
、TechAgent
)甚至路由器的分类回退代理,都有专属的提示词文件。 -
用户可通过简单编辑这些文本文件,轻松定制AI在不同场景下的个性和行为。
核心概念:系统提示词
现代LLM交互通常采用特定消息结构,其中"system"消息用于提供高层指令、设定角色或注入关键上下文。
在本项目中,提示词文件内容即用于构建LLM调用的"system"消息。系统提示词可视作代理的核心指令和角色专属背景知识。
工作原理:提示词实战
回顾AI代理系统章节流程,观察提示词的作用位置:
当XianyuReplyBot
根据意图选择代理后,该代理已在启动时加载专属系统提示词。调用LLM前,代理会构建完整的消息结构,包含:
- 系统提示词(来自配置文件)
- 商品详情
- 对话历史
- 最新用户消息
这种结构化消息(尤其是系统提示词)告知LLM如何解读信息及预期回复类型。
提示词文件位置
提示词配置文件存储于项目根目录的prompts
文件夹,包含:
classify_prompt.txt
:用于ClassifyAgent
(意图路由器的LLM回退分类),指令LLM输出预定义意图标识(tech
/price
/default
)price_prompt.txt
:指导PriceAgent
价格协商策略,包含底价规则、议价风格等tech_prompt.txt
:指引TechAgent
技术答疑,要求精确引用商品参数,支持外部知识检索default_prompt.txt
:定义DefaultAgent
通用回复风格,设定机器人作为友好卖家的基础人设
定制AI行为
编辑这些文件即可轻松调整AI行为!以price_prompt.txt
为例:
你是一个专业的二手商品卖家。你的目标是以合理的价格出售商品,同时保持友好的态度。
与客户交流时,请遵循以下原则:
1. 始终礼貌和友好。
2. 如果客户询问价格或议价,参考【商品信息】和【你与客户对话历史】。
3. 如果客户出价低于你的心理价位,可以适当拒绝或提出你的最低价。
4. 议价不是无限的,如果客户多次大幅度议价,可以婉拒或引导回到原价。
5. 回复请简短明了,不要透露任何个人联系方式(微信、QQ等)。
▲当前议价轮次:{bargain_count}
这是PriceAgent
的"剧本",设定角色(“专业二手卖家”)、目标(“合理定价,保持友好”)及具体规则(“参考商品信息”、“拒绝低价”、“限制议价轮次”)。
-
占位符
{bargain_count}
将在发送前被替换为实际议价次数(见AI代理系统代码)。 -
修改此文件即可调整议价策略,例如更严格的价格底线或更灵活的沟通风格。
classify_prompt.txt
结构略有不同,专用于引导LLM输出单字意图标识:
你是一个意图分类机器人。你需要根据客户的最新消息和对话历史,判断客户的意图。
你的任务是只回复以下标签中的一个,不要回复其他任何内容:
- tech (询问商品技术参数、规格、性能对比等)
- price (询问价格、议价、讨论包邮等)
- default (其他所有意图,例如打招呼、询问是否在、无关问题等)请根据【商品信息】和【你与客户对话历史】,判断用户最新消息的意图:
该提示词明确LLM的角色(“意图分类机器人”),并严格限制输出为预定义标签,确保IntentRouter
能正确解析分类结果。
代码中的提示词加载机制
如AI代理系统所示,XianyuReplyBot
类在启动时加载提示词文件:
# 摘自 XianyuAgent.py 的简化代码片段
class XianyuReplyBot:def __init__(self):# ... 初始化客户端 ...self._init_system_prompts() # 加载提示词self._init_agents() # 使用提示词初始化代理# ... 初始化路由器 ...def _init_system_prompts(self):"""从文件加载各代理提示词"""prompt_dir = "prompts"try:with open(os.path.join(prompt_dir, "classify_prompt.txt"), "r", encoding="utf-8") as f:self.classify_prompt = f.read()with open(os.path.join(prompt_dir, "price_prompt.txt"), "r", encoding="utf-8") as f:self.price_prompt = f.read()with open(os.path.join(prompt_dir, "tech_prompt.txt"), "r", encoding="utf-8") as f:self.tech_prompt = f.read()with open(os.path.join(prompt_dir, "default_prompt.txt"), "r", encoding="utf-8") as f:self.default_prompt = f.read()logger.info("提示词加载成功")except Exception as e:logger.error(f"提示词加载失败: {e}")raise # 加载失败时终止def _init_agents(self):"""初始化各领域代理"""self.agents = {'classify': ClassifyAgent(self.client, self.classify_prompt, self._safe_filter),'price': PriceAgent(self.client, self.price_prompt, self._safe_filter),'tech': TechAgent(self.client, self.tech_prompt, self._safe_filter),'default': DefaultAgent(self.client, self.default_prompt, self._safe_filter),}
BaseAgent
子类在生成回复时,通过_build_messages
方法构建LLM输入:
# 摘自 XianyuAgent.py 的简化代码片段
class BaseAgent:def __init__(self, client, system_prompt, safety_filter):self.client = clientself.system_prompt = system_prompt # 加载的提示词文本self.safety_filter = safety_filterdef _build_messages(self, user_msg: str, item_desc: str, context: str) -> List[Dict]:"""构建LLM消息链"""system_content = f"【商品信息】{item_desc}\n【对话历史】{context}\n{self.system_prompt}"return [{"role": "system", "content": system_content},{"role": "user", "content": user_msg}]
PriceAgent
还会在系统消息中插入bargain_count
,为LLM提供明确的议价阶段信息。
结论
AI提示词配置是XianyuAutoAgent
项目中定义各代理行为规则、角色设定及应答策略的核心方法。
-
通过
prompts
目录下的文本文件,用户无需修改核心代码即可定制AI的交互方式。 -
每个代理加载专属提示词并整合至LLM输入,有效引导生成符合场景需求的回复。
理解提示词配置机制后,您可自由调整AI卖家在闲鱼平台的交互策略。接下来我们将见证所有组件——对话记忆、通信层、AI代理系统、意图路由器和提示词配置——如何协同工作,详见下一章主协调器。
第六章:主协调器
在前几章中,我们已经构建了XianyuAutoAgent
的核心组件:
- 第一章:对话记忆 - 学习机器人如何跟踪聊天历史和细节–
sql
- 第二章:闲鱼通信层 - 探索机器人如何连接闲鱼平台并收发消息–
websocket
- 第三章:AI代理系统 - 了解机器人如何使用AI生成回复–
LLM
- 第四章:意图路由 - 解析用户意图的机制–
正则匹配给专家代理-->提示词txt
- 第五章:AI提示配置 - 通过文本文件定制AI行为
这些组件各自独立,但如何协同工作?谁负责启动引擎、管理消息流并确保系统平稳运行?
这正是主协调器的职责所在。
为什么需要"主协调器"?
想象一台由齿轮、杠杆、引擎和线路组成的复杂机器。每个部件都有特定功能,但需要中央控制系统来协调运作。
我们的XianyuAutoAgent
也是如此。主协调器需要:
- 系统启动
- 建立连接闲鱼平台
- 持续监听消息
- 路由消息到正确处理流程(存储记忆、AI分析)
- 连接管理(处理断连、令牌过期)
- 协调回复发送
主协调器如同空中交通管制员或交响乐指挥,虽不直接操作但确保系统有序运行。
主协调器的构成
核心职责包含:
- 系统启动
- 通过WebSocket连接闲鱼实时消息流
- 管理连接生命周期(重连、心跳、令牌刷新)
- 接收原始消息
- 传递消息给其他组件处理
- 协调回复发送
在项目中,main.py
文件中的XianyuLive
类即为主协调器实现。
运行机制:主循环
通过时序图展示主协调器工作流程:
核心组件:XianyuLive类
系统启动与主循环
# main.py 简化代码片段
if __name__ == '__main__':# 加载配置load_dotenv()# 初始化组件bot = XianyuReplyBot()xianyuLive = XianyuLive(cookies_str)# 启动主循环asyncio.run(xianyuLive.main())
消息处理流程
async def handle_message(self, message_data, websocket):# 步骤1:消息确认# 步骤2:过滤非聊天消息# 步骤3:提取聊天信息# 步骤4:处理卖家控制命令# 步骤5:保存用户消息# 步骤6:检查人工模式# 步骤7:获取商品信息# 步骤8:获取对话上下文# 步骤9:AI生成回复# 步骤10:处理议价计数# 步骤11:保存机器人回复# 步骤12:发送回复
连接生命周期管理
- 心跳机制:定期发送心跳包
检测连接
- 令牌刷新:
异步任务
维护令牌有效性 - 异常处理:自动重连机制保证服务连续性
组件协同
主协调器通过持有各组件实例实现协同:
XianyuApis
处理平台通信ChatContextManager
管理记忆存储XianyuReplyBot
驱动AI生成
结论
主协调器作为系统核心,承担连接管理、消息路由、组件协调等关键职责,通过XianyuLive
类实现完整的自动化流程控制。
下一章:闲鱼协议工具
第七章:闲鱼协议工具
在第六章:主协调器中,我们了解了XianyuLive
类如何协调整个机器人运作——连接闲鱼平台、监听消息并协调数据流向记忆系统和AI系统。
-
然而,主协调器负责管理何时执行操作,而具体如何与闲鱼平台进行技术交互则需要专门的协议工具。
-
闲鱼平台与大多数在线平台类似,
在API和WebSocket通信中使用特定的技术"语言"。这些通信不仅需要特殊格式的消息体,还涉及唯一标识符和安全校验码等复杂机制
。
为什么需要"协议工具"?
闲鱼通信层(特别是XianyuLive
和XianyuApis
类)直接与服务器交互时面临以下技术挑战:
通过WebSocket发送消息时需构造包含以下元素的复杂数据结构:
- 消息唯一ID(
uuid
) - 请求唯一ID(
mid
) - 会话ID(
cid
) - 接收方ID(
toid
) - Base64等特殊编码的消息内容
- 其他技术参数
HTTP API调用(如获取商品详情)需要:
appKey
、时间戳t
、版本v
、类型type
等参数- 安全签名
sign
(采用临时令牌token
+时间戳+请求数据的特定算法生成)
接收的WebSocket消息可能采用Base64编码和MessagePack二进制格式,需要专用解码器处理
协议工具构成
这些工具函数主要位于utils/xianyu_utils.py
文件,包含:
1. 唯一ID生成
# 来自utils/xianyu_utils.py
def generate_mid() -> str:"""生成符合闲鱼要求的mid"""return f"{随机数}{时间戳} 0" # 示例:1231630000000 0def generate_uuid() -> str:"""生成设备特征uuid"""return f"-{时间戳}1" # 示例:-16300000001
通过时间戳与随机数组合生成符合平台规范的标识符
2. 安全签名生成
def generate_sign(t: str, token: str, data: str) -> str:"""MD5哈希签名算法"""app_key = "34839810" # 闲鱼H5接口固定密钥msg = f"{token}&{t}&{app_key}&{data}"return hashlib.md5(msg.encode()).hexdigest()
该签名算法用于API请求合法性验证
3. 消息解码系统
在实际项目之中,错误的日志信息打印是非常重要的,一定要重视对报错的处理
核心解码函数实现:
class MessagePackDecoder:"""自定义MessagePack解析器"""def decode(self) -> Any:try:# 解析二进制数据结构return self._decode_value() except Exception:return base64回退处理def decrypt(data: str) -> str:"""多层解码处理器"""try:decoded_bytes = base64.b64decode(清理数据)# 优先尝试MessagePack解析return MessagePackDecoder(decoded_bytes).decode()except MessagePackError:# 回退文本解码return decoded_bytes.decode('utf-8')
支持从二进制到结构化数据的完整解析流程
4. Cookie解析器
def trans_cookies(cookies_str: str) -> Dict:"""Cookie字符串转字典"""return {k:v for cookie in cookies_str.split("; ") for k,v in [cookie.split('=',1)]}
将.env文件中的cookie字符串转换为requests可用的字典格式
系统架构关系
技术实现细节
MessagePack解码器
包含20+种数据类型处理逻辑,支持:
- 定长/变长整数
- 浮点数解析
- 数组/映射结构
- 扩展数据类型处理
错误处理机制
采用三级回退策略:
- 优先MessagePack解析
- 尝试UTF-8文本解码
- 最终十六进制转储+错误日志
模块结构
结论
协议工具模块作为闲鱼通信的"技术密码本",承担着:
- 唯一标识生成
- 安全认证签名
- 复杂消息解码
- 输入数据标准化
通过封装这些底层技术细节,使主协调器能够专注于业务流程控制,实现通信层与业务逻辑的解耦。这是构建稳定可靠的闲鱼自动化系统的关键技术保障