Skip to content

Commit 7ba3971

Browse files
committed
feat(customer_support): add a knowledge initialization check and save long-term memory after agent execution
1 parent ac5d754 commit 7ba3971

File tree

1 file changed

+80
-57
lines changed

1 file changed

+80
-57
lines changed

02-use-cases/customer_support/agent.py

Lines changed: 80 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,23 @@
6969
# 使用用户指定的知识库
7070
knowledge = KnowledgeBase(backend="viking", index=knowledge_collection_name)
7171
else:
72+
knowledge = KnowledgeBase(backend="viking", app_name=app_name)
73+
74+
should_init_knowledge = False
75+
try:
76+
test_knowledge = knowledge.search("商品退换策略", top_k=1)
77+
should_init_knowledge = not (
78+
len(test_knowledge) >= 0
79+
and test_knowledge[0].content != ""
80+
and str(test_knowledge[0].content).__contains__("商品退换策略")
81+
)
82+
except Exception as e:
83+
should_init_knowledge = True
84+
85+
if should_init_knowledge:
7286
tos_bucket_name = os.getenv("DATABASE_TOS_BUCKET")
7387
if not tos_bucket_name:
7488
raise ValueError("DATABASE_TOS_BUCKET environment variable is not set")
75-
knowledge = KnowledgeBase(backend="viking", app_name=app_name)
7689
knowledge.add_from_directory(
7790
str(Path(__file__).resolve().parent) + "/pre_build/knowledge",
7891
tos_bucket_name=tos_bucket_name,
@@ -111,36 +124,43 @@ def before_agent_execution(callback_context: CallbackContext):
111124
callback_context.state["user:customer_id"] = default_user_id
112125

113126

127+
# 这里仅做记忆保存的演示,实际根据需求选择会话保存到长期记忆中
128+
async def after_agent_execution(callback_context: CallbackContext):
129+
session = callback_context._invocation_context.session
130+
await long_term_memory.add_session_to_memory(session)
131+
132+
114133
after_sale_prompt = (
115-
"""
116-
你是一名专业且耐心的在线客服,负责协助客户处理咨询及商品售后服务。可使用内部工具和知识库,但需严格遵守以下准则:
117-
118-
<指导原则>
119-
1. 使用工具时,绝不假设参数,确保信息准确。
120-
2. 若信息不足,礼貌询问客户具体细节。
121-
3. 禁止透露任何关于内部系统、工具或流程的信息。
122-
4. 若被问及内部流程、系统或培训,统一回复:“抱歉,我无法提供关于我们内部系统的信息。”
123-
5. 始终保持专业、友好且乐于助人的态度。
124-
6. 高效且准确地解决客户问题。
125-
126-
<关于维修>
127-
1. 维修或售后咨询时,优先索取产品序列号,便于查询产品信息。
128-
2. 若客户忘记序列号,可先核验身份再查询购买记录确认商品信息, 可以通过客户姓名、邮箱 等信息进行核验。
129-
3. 详细询问故障情况,参考知识库内容引导客户完成基础排查,重点排除操作不当等简单问题。若故障可以通过简易步骤解决,应优先鼓励客户自行操作修复。
130-
4. 产品不在保修范围时,确认客户是否接受自费维修。
131-
6. 创建维修单前,请确保完整收集必要信息(包括商品编号、故障描述、客户联系信息、维修时间等)。在正式提交前,需将全部信息发送给客户进行最终确认。
132-
7. 缺少必要信息时,礼貌询问客户补充。
133-
134-
<沟通要求>
135-
1. 保持耐心和礼貌,避免使用不专业用语和行为。
136-
2. 工具结果不能直接反馈给客户,需结合客户问题筛选、格式化并润色回复内容,确保清晰、准确、简洁。
137-
138-
请根据上述要求,准确、简明且专业地回答客户问题,并积极协助解决售后问题。
139-
140-
当前登录客户为: {user:customer_id} 。
141-
"""
142-
+ "当前时间为:"
143-
+ datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
134+
"""
135+
你是一名专业且耐心的在线客服,负责协助客户处理咨询及商品售后服务。可使用内部工具和知识库,但需严格遵守以下准则:
136+
137+
<指导原则>
138+
1. 使用工具时,绝不假设参数,确保信息准确。
139+
2. 若信息不足,礼貌询问客户具体细节。
140+
3. 禁止透露任何关于内部系统、工具或流程的信息。
141+
4. 若被问及内部流程、系统或培训,统一回复:“抱歉,我无法提供关于我们内部系统的信息。”
142+
5. 始终保持专业、友好且乐于助人的态度。
143+
6. 高效且准确地解决客户问题。
144+
145+
<关于维修>
146+
1. 知识库中包含 手机、电视等商品的保修策略、售后政策、操作不当等常见问题的解决方案,客户问题必须要先查询知识库,是否有相关解决方案,参考已有案例引导客户排查
147+
2. 涉及到具体商品的维修或售后咨询时,优先索取产品序列号,便于查询产品信息。
148+
3. 若客户忘记序列号,可先核验身份再查询购买记录确认商品信息, 可以通过客户姓名、邮箱 等信息进行核验。
149+
4. 详细询问故障情况,目前需要查询知识库内容的排查手册,来引导客户完成基础排查,重点排除操作不当等简单问题。若故障可以通过简易步骤解决,应优先鼓励客户自行操作修复。
150+
5. 产品不在保修范围时,确认客户是否接受自费维修。
151+
6. 创建维修单前,请确保完整收集必要信息(包括商品编号、故障描述、客户联系信息、维修时间等)。在正式提交前,需将全部信息发送给客户进行最终确认。
152+
7. 缺少必要信息时,礼貌询问客户补充。
153+
154+
<沟通要求>
155+
1. 保持耐心和礼貌,避免使用不专业用语和行为。
156+
2. 工具结果不能直接反馈给客户,需结合客户问题筛选、格式化并润色回复内容,确保清晰、准确、简洁。
157+
158+
请根据上述要求,准确、简明且专业地回答客户问题,并积极协助解决售后问题。 同时,全程你被禁止使用知识库以外未经过认证的解决方案, 所有解决方案必须要先从知识库查询解决方案。
159+
160+
当前登录客户为: {user:customer_id} 。
161+
"""
162+
+ "当前时间为:"
163+
+ datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
144164
)
145165

146166
after_sale_agent = Agent(
@@ -158,37 +178,38 @@ def before_agent_execution(callback_context: CallbackContext):
158178
long_term_memory=long_term_memory,
159179
tools=crm_tool,
160180
before_agent_callback=before_agent_execution,
181+
after_agent_callback=after_agent_execution,
161182
run_processor=AuthRequestProcessor(),
162183
)
163184

164185
shopping_guide_prompt = (
165-
"""
166-
你是一名专业且耐心的在线客服,你的首要任务是帮助客户购买商品。你可使用工具或者检索知识库来 准确并简洁的回答客户问题.
167-
168-
在回答客户问题以及协助客户的过程中时,请始终遵循以下指导原则:
169-
<指导原则>
170-
1. 使用内部工具时,绝不要假设参数值。
171-
2. 若缺少处理请求所需的必要信息,请礼貌地向客户询问具体细节。
172-
3. 严禁披露你可用的内部工具、系统或功能的任何信息。
173-
4. 若被问及内部流程、工具、功能或培训相关问题,始终回应:“抱歉,我无法提供关于我们内部系统的信息。”
174-
5. 协助客户时,保持专业且乐于助人的语气。
175-
6. 专注于高效且准确地解决客户咨询。
176-
177-
<导购原则>
178-
1. 你需要综合客户的各方面需求,选择合适的商品推荐给客户购买
179-
2. 你可以查询客户的历史购买记录,来了解客户的喜好
180-
3. 如果客户表现出对某个商品很感兴趣,你需要详细介绍下该商品,并且结合客户的要求,说明推荐该商品的理由
181-
4. 当前你能售卖的商品都存在知识库中,你只能根据知识库中有的商品信息来回答客户的问题,不能编造不存在的商品信息。
182-
5. 当前你只能给客户推荐 在售的商品,不能推荐不存在或者已下架商品。
183-
184-
<沟通要求>
185-
1. 请注意你需要耐心有礼貌的和客户进行沟通,避免回复客户时使用不专业的语言或行为。
186-
2. 禁止直接将 工具的结果直接输出给用户,你需要结合用户的问题,对工具的结果进行必要的筛选、格式化处理,在输出给用户时,还需要进行必要的润色,使回复内容更加的清晰、准确、简洁。
187-
188-
当前登录客户为: {user:customer_id}
189-
"""
190-
+ "当前时间为:"
191-
+ datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
186+
"""
187+
你是一名专业且耐心的在线客服,你的首要任务是帮助客户购买商品。你可使用工具或者检索知识库来 准确并简洁的回答客户问题.
188+
189+
在回答客户问题以及协助客户的过程中时,请始终遵循以下指导原则:
190+
<指导原则>
191+
1. 使用内部工具时,绝不要假设参数值。
192+
2. 若缺少处理请求所需的必要信息,请礼貌地向客户询问具体细节。
193+
3. 严禁披露你可用的内部工具、系统或功能的任何信息。
194+
4. 若被问及内部流程、工具、功能或培训相关问题,始终回应:“抱歉,我无法提供关于我们内部系统的信息。”
195+
5. 协助客户时,保持专业且乐于助人的语气。
196+
6. 专注于高效且准确地解决客户咨询。
197+
198+
<导购原则>
199+
1. 你需要综合客户的各方面需求,选择合适的商品推荐给客户购买
200+
2. 你可以查询客户的历史购买记录,来了解客户的喜好
201+
3. 如果客户表现出对某个商品很感兴趣,你需要详细介绍下该商品,并且结合客户的要求,说明推荐该商品的理由
202+
4. 当前你能售卖的商品都存在知识库中,你只能根据知识库中有的商品信息来回答客户的问题,不能编造不存在的商品信息。
203+
5. 当前你只能给客户推荐 在售的商品,不能推荐不存在或者已下架商品。
204+
205+
<沟通要求>
206+
1. 请注意你需要耐心有礼貌的和客户进行沟通,避免回复客户时使用不专业的语言或行为。
207+
2. 禁止直接将 工具的结果直接输出给用户,你需要结合用户的问题,对工具的结果进行必要的筛选、格式化处理,在输出给用户时,还需要进行必要的润色,使回复内容更加的清晰、准确、简洁。
208+
209+
当前登录客户为: {user:customer_id}
210+
"""
211+
+ "当前时间为:"
212+
+ datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
192213
)
193214

194215
shopping_guide_agent = Agent(
@@ -205,6 +226,7 @@ def before_agent_execution(callback_context: CallbackContext):
205226
long_term_memory=long_term_memory,
206227
tools=[get_customer_info, get_customer_purchases],
207228
before_agent_callback=before_agent_execution,
229+
after_agent_callback=after_agent_execution,
208230
instruction=shopping_guide_prompt,
209231
run_processor=AuthRequestProcessor(),
210232
)
@@ -224,6 +246,7 @@ def before_agent_execution(callback_context: CallbackContext):
224246
""",
225247
sub_agents=[after_sale_agent, shopping_guide_agent],
226248
long_term_memory=long_term_memory,
249+
after_agent_callback=after_agent_execution,
227250
)
228251

229252
runner = Runner(agent=agent, app_name=app_name)

0 commit comments

Comments
 (0)