当前位置: 首页 > news >正文

Dify应用——AI美妆护肤智能客服

Dify应用——AI美妆护肤智能客服

构建一个智能客服系统,专门用于解答用户在美妆护肤领域的问题。系统支持:

  • 识别用户意图(打招呼、感谢、找人工、专业咨询等)

  • 基于多个知识库进行检索增强生成(RAG)

  • 提供专业、友好、结构化的回答

  • 支持非专业问题的闲聊处理

整体流程图

1.开始节点

  • 实现方式:添加《用户输入》节点完成

  • 作用:接受用户的输入的问题(query)

  • 节点展开详情:

注意:query输入字段需要手动创建

2.意图识别

  • 实现方式:添加《代码执行》节点完成代码实现

  • 作用:判断用户是否属于打招呼用语、或者找人工、还是询问美妆护肤知识(需要RAG检索)

  • 节点展开详情:

  • 实现代码如下:

    import random import re ​ def main(query: str) -> dict: """ 基于固定短语匹配的美妆护肤问答处理器 + 多知识库RAG路由 ​ 四个知识库: 1. 不同肤质对应的护肤要点 2. 不同肤质形成的原因 3. 不同肤质推荐合适的护肤产品 4. 常用高频用语 ​ Args: query: 用户输入的问题 ​ Returns: Dict: 包含回复类型、回复内容、知识库路由标志等信息 """ ​ # ========== 固定短语定义 ========== greeting_phrases = { "你好", "您好", "hi", "hello", "嗨", "哈喽", "哈罗", "早上好", "下午好", "晚上好", "上午好", "中午好", "晚安", "早", "午安", "good morning", "good afternoon", "good evening", "你是谁", "你是什么", "你叫什么", "你的名字", "介绍一下自己", "自我介绍", "你是什么东西", "你是哪个", "你是啥", "你好吗", "怎么样", "还好吗", "你还好吗", "最近怎么样", "你在吗", "在不在", "还在吗", "在线吗", "你在线吗", "你能干什么", "你会做什么", "你能做什么", "你的功能", "你有什么用", "你的作用", "你的职责", "你的用途", "你能帮我什么", "你可以做什么", "你会什么", "你懂什么", "能力介绍", "功能介绍", "你的能力", "你有什么功能", "开始", "开始咨询", "开始对话", "开始聊天", "我想咨询", "我有问题", "我想问问题", "我想了解", "咨询一下", "测试", "试试", "试一试", "test", "testing", "试试看", "测试一下", "看看", "检查一下" } ​ greeting_response = "你好,很高兴为您服务!我是您的美妆护肤小助手,专业为您答疑解惑。" ​ thank_phrases = { "谢谢", "感谢", "多谢", "谢了", "thanks", "thank you", "thx", "3q", "3x", "谢谢你", "感谢你", "多谢了", "非常感谢", "十分感谢", "万分感谢", "太感谢了" } ​ goodbye_phrases = { "再见", "拜拜", "bye", "byebye", "goodbye", "88", "走了", "告辞", "先走了", "下次见", "回头见", "有空再聊", "改天聊", "see you", "拜", "溜了", "闪了", "slip away" } ​ polite_responses = { "thank": [ "不用客气,随时为您服务!", "很高兴能帮助到您!", "这是我应该做的,有问题随时找我哦!", "客气了,有什么问题尽管问!", "不客气,祝您跨境电商生意兴隆!" ], "goodbye": [ "再见!期待下次为您服务!", "祝您生活愉快,有问题随时来找我!", "拜拜!有问题随时回来咨询!", "再见!祝您生活愉快!" ] } ​ human_service_phrases = { "人工服务", "人工客服", "人工坐席", "人工咨询", "人工帮助", "人工支持", "人工答疑", "人工解答", "人工回复", "人工对话", "转人工", "找人工", "要人工", "转接人工", "转接客服", "切换人工", "接入人工", "联系人工", "答疑入口", "真人服务", "真人客服", "真人咨询", "真人对话", "真人帮助", "活人", "真人", "人类", "人工", "真的人", "客服", "在线客服", "联系客服", "找客服", "客服电话", "客服微信", "客服qq", "官方客服", "专人服务", "专人客服", "专业咨询", "专业服务", "专家咨询", "顾问咨询", "一对一服务", "专属服务", "投诉", "举报", "反馈问题", "意见反馈", "服务投诉", "质量问题", "服务问题", "系统问题", "退款", "退货", "售后", "售后服务", "退换货", "申请退款", "退费", "取消订单", "订单问题", "不满意", "有问题", "出问题", "不行", "太差了", "服务差", "回答不对", "答非所问", "听不懂", "不准确" } ​ human_service_response = "同学,点击 https://www.123.com 可进入人工答疑" ​ # ========== 多知识库路由关键词 ========== # 知识库1: 不同肤质对应的护肤要点 kb1_skincare_tips = { "护肤要点", "护理要点", "保养要点", "注意事项", "护肤方法", "护理方法", "保养方法", "护肤步骤", "护理步骤", "怎么做", "如何护理", "怎么护理", "如何保养", "怎么保养", "日常护理", "日常保养", "routine", "护肤流程", "护理流程", "补水", "保湿", "清洁", "防晒", "控油", "去角质", "修复", "调理", "改善", "怎么改善", "如何改善", "怎么处理", "如何处理", "要注意什么", "注意什么", "该注意", "需要注意", "禁忌", "多久", "频率", "每天", "每周" } ​ # 知识库2: 不同肤质形成的原因 kb2_skin_causes = { "原因", "形成", "为什么", "导致", "引起", "造成", "因素", "来源", "怎么形成", "怎么回事", "由来", "成因", "根源", "遗传", "环境", "激素", "内分泌", "饮食", "作息", "是什么原因", "什么原因", "为啥", "怎么会", "天生的", "后天", "怎么来的", "产生" } ​ # 知识库3: 不同肤质推荐合适的护肤产品 kb3_products = { "产品", "推荐", "用什么", "买什么", "买哪种", "适合什么", "化妆品", "护肤品", "品牌", "哪款", "哪个牌子", "什么牌子", "选什么", "挑选", "选购", "选择什么", "推荐什么", "精华", "面霜", "乳液", "水乳", "面膜", "洗面奶", "防晒霜", "爽肤水", "眼霜", "隔离", "卸妆", "洁面", "化妆水", "什么产品好", "哪种好", "哪个好", "好用", "值得买", "性价比", "价格", "成分", "含有", "不含" } ​ # 知识库4: 常用高频用语(护肤领域通用/兜底查询) kb4_common = { "肤质", "皮肤", "肌肤", "油皮", "干皮", "混油", "混干", "油性", "干性", "混合性", "敏感性", "中性", "痘痘", "粉刺", "黑头", "闭口", "毛孔", "出油", "干燥", "敏感", "泛红", "红血丝", "暗沉", "色斑", "美白", "抗老", "抗衰", "细纹", "皱纹", "松弛", "紧致", "痘印", "痘坑", "肤色", "发黄", "无光泽", "粗糙", "脱皮", "起皮", "T区", "脸颊", "额头", "下巴", "鼻翼", "换季", "过敏", "刺激", "温和", "清爽", "油腻" } ​ # 肤质关键词(辅助判断,跨知识库共用) skin_type_keywords = { "油性", "干性", "混合性", "敏感性", "中性", "油皮", "干皮", "混油皮", "混干皮", "敏感肌", "痘痘肌", "痘肌", "大油田", "沙漠皮" } ​ # ========== 文本处理辅助函数 ========== def normalize_text(text: str) -> str: """标准化文本:去除标点符号,转换为小写""" cleaned = re.sub(r'[^\w一-鿿]', '', text.lower().strip()) return cleaned ​ def exact_match_check(query_text: str, phrase_set) -> bool: """精确匹配检查""" normalized_query = normalize_text(query_text) for phrase in phrase_set: normalized_phrase = normalize_text(phrase) if normalized_phrase == normalized_query: return True return False ​ def contains_match_check(query_text: str, phrase_set) -> bool: """包含匹配检查(用于短查询中包含关键短语的情况)""" normalized_query = normalize_text(query_text) if len(normalized_query) <= 10: for phrase in phrase_set: normalized_phrase = normalize_text(phrase) if normalized_phrase in normalized_query or normalized_query in normalized_phrase: return True return False ​ def keyword_score(query_text: str, keyword_set) -> int: """计算查询文本命中某关键词集的分数""" score = 0 for keyword in keyword_set: if keyword in query_text: score += 1 return score ​ # ========== 主处理逻辑 ========== query = query.strip() if not query: return { "type": "error", "response": "请输入您的问题。", "need_rag": False, "use_kb1_skincare_tips": False, "use_kb2_skin_causes": False, "use_kb3_products": False, "use_kb4_common": False, "original_query": query } ​ # 1. 检查感谢类礼貌用语 if exact_match_check(query, thank_phrases): return { "type": "greeting", "response": random.choice(polite_responses["thank"]), "need_rag": False, "use_kb1_skincare_tips": False, "use_kb2_skin_causes": False, "use_kb3_products": False, "use_kb4_common": False, "original_query": query } ​ # 2. 检查告别类礼貌用语 if exact_match_check(query, goodbye_phrases): return { "type": "greeting", "response": random.choice(polite_responses["goodbye"]), "need_rag": False, "use_kb1_skincare_tips": False, "use_kb2_skin_causes": False, "use_kb3_products": False, "use_kb4_common": False, "original_query": query } ​ # 3. 检查打招呼 if exact_match_check(query, greeting_phrases) or contains_match_check(query, greeting_phrases): return { "type": "greeting", "response": greeting_response, "need_rag": False, "use_kb1_skincare_tips": False, "use_kb2_skin_causes": False, "use_kb3_products": False, "use_kb4_common": False, "original_query": query } ​ # 4. 检查人工服务请求 if exact_match_check(query, human_service_phrases) or contains_match_check(query, human_service_phrases): return { "type": "human_service", "response": human_service_response, "need_rag": False, "use_kb1_skincare_tips": False, "use_kb2_skin_causes": False, "use_kb3_products": False, "use_kb4_common": False, "original_query": query } ​ # 5. 多知识库路由 — 根据关键词命中数决定检索哪个知识库 score_kb1 = keyword_score(query, kb1_skincare_tips) score_kb2 = keyword_score(query, kb2_skin_causes) score_kb3 = keyword_score(query, kb3_products) score_kb4 = keyword_score(query, kb4_common) ​ # 如果完全没有命中任何护肤相关关键词,默认走 KB4(常用高频用语) total_score = score_kb1 + score_kb2 + score_kb3 + score_kb4 ​ if total_score == 0: use_kb1 = False use_kb2 = False use_kb3 = False use_kb4 = True # 兜底 else: # KB4(常用高频用语)作为基础兜底,当其他 KB 没有明显命中时启用 max_specific = max(score_kb1, score_kb2, score_kb3) ​ use_kb1 = score_kb1 >= 1 and score_kb1 >= max_specific * 0.5 use_kb2 = score_kb2 >= 1 and score_kb2 >= max_specific * 0.5 use_kb3 = score_kb3 >= 1 and score_kb3 >= max_specific * 0.5 ​ # KB4 在以下情况启用:明确命中 或 其他 KB 都没有命中 use_kb4 = score_kb4 >= 1 or not (use_kb1 or use_kb2 or use_kb3) ​ return { "type": "rag_needed", "response": "", "need_rag": True, "use_kb1_skincare_tips": use_kb1, "use_kb2_skin_causes": use_kb2, "use_kb3_products": use_kb3, "use_kb4_common": use_kb4, "original_query": query }

3.选择器

  • 实现方式:添加《条件分支》节点

  • 作用:获取意图识别的结果

    如果意图识别属于:打招呼、人工服务这两种类型,直接返回默认结果结束;否则,直接经过知识库检索
  • 节点详情展示:

4.直接输出

  • 实现方式:添加《输出》节点

  • 作用:如果用户的问题属于打招呼、找人工等用语,直接按照规则结果输出

  • 否则:进入知识库检索

5.知识库分类检索

  • 作用

    输入用户的专业问题,经过知识库分类检索,得到和问题相关的上下文,注意:若检索出来的结果为空,直接输出
  • 实现方式:添加《条件分支》《知识检索》节点

    注意:这一步一定要提前订定义好《知识库》

5.1知识库1——不同肤质对应的肤质要点

5.2知识库2——不同肤质形成的原因

5.3知识库3——不同肤质推荐合适的护肤产品

5.4知识库4——高频电商问答对知识库

5.5直接输出

系统Prompt

# 角色 你是一位专业且亲切的美妆护肤小助手,不仅拥有深厚的美妆护肤专业知识,还具备广泛的通用知识储备。你能够根据用户需求,灵活切换角色,既能为用户解答美妆护肤领域的复杂专业问题,也能与用户展开轻松愉快的日常闲聊。 ​ ## 技能 ### 技能 1: 精准解答美妆护肤问题 1. 当用户提出美妆护肤相关问题时,充分运用自身专业知识,结合丰富且贴合实际的案例,为用户提供准确、全面且详细的解答。 2. 针对复杂的美妆护肤概念,运用通俗易懂、生动形象的语言进行深入浅出的解释说明,确保用户能够轻松理解。 3. 在回答的结尾处明确注明“以上答案仅供参考”。 ​ ### 技能 2: 耐心回应非美妆护肤问题 1. 当用户提及非美妆护肤问题时,例如简单的数学运算“1 + 1 等于几”等,运用已有的知识储备,耐心、准确地对用户进行回答。 2. 在回答此类问题的结尾同样注明“以上答案仅供参考”。 ​ ### 技能 3: 合理引导不明确问题 1. 当用户输入的问题含义不明确时,不直接给出知识回答,而是友好地输出“我还在努力理解您的问题,请您详细描述后再来询问吧,这样我能更好地为您解答。” ​ ## 限制: - 交流内容主要围绕美妆护肤以及其他非美妆护肤知识相关范畴,对于与这两类内容无关的话题,需礼貌地拒绝回答,并告知用户“抱歉,我只能回答与美妆护肤和其他非美妆护肤知识相关的问题哦”。 - 所输出的内容必须严格符合上述回答要求,保证格式规范、条理清晰、逻辑连贯。 - 回答的答案中禁止提及:需要进行知识库检索

5.判断是否可以检索出结果

  • 实现方式:添加《条件分支》节点

  • 作用:根据是否检索出结果进行判断选择

    1.如果检索出相关的上下文,那么交由《模板转换》,然后再交由《大模型RAG回答》:基于问题和上下文来让大模型回答问题 2.如果没有检索出相关的上下文,那么交由《闲聊大模型回答》:直接将问题送入大模型回答问题

6.模板转换

  • 实现方式:添加《模板转换》节点

  • 作用:模板转换 = 数据清洗 + 格式化,把 4 个知识库的搜索结果拼成一段干净的文本上下文,再交给 LLM 生成回复。

  • 实现代码如下:

{# 合并4个知识库检索结果 #} ​ {# 知识库1:不同肤质对应的护肤要点 #} {% if kb1_result is defined and kb1_result %} 【护肤要点】 {% for item in kb1_result %} - {{ item.content }} {% endfor %} ​ {% endif %} ​ {# 知识库2:不同肤质形成的原因 #} {% if kb2_result is defined and kb2_result %} 【形成原因】 {% for item in kb2_result %} - {{ item.content }} {% endfor %} ​ {% endif %} ​ {# 知识库3:不同肤质推荐合适的护肤产品 #} {% if kb3_result is defined and kb3_result %} 【产品推荐】 {% for item in kb3_result %} - {{ item.content }} {% endfor %} ​ {% endif %} ​ {# 知识库4:常用高频用语 #} {% if kb4_result is defined and kb4_result %} 【护肤常识】 {% for item in kb4_result %} - {{ item.content }} {% endfor %} ​ {% endif %}

7.大模型RAG回答

  • 实现方式:添加《LLM》节点

  • 作用:

    接受用户的query和上下文,经过RAG检索后直接输出大模型的结果
  • 上下文:知识检索内容

  • RAG大模型系统Prompt

    # 角色 你是一个专业的美妆护肤顾问。请根据以下检索到的知识库内容,回答用户的问题。 ​ ## 重要参数 - 上下文内容:{{#context#}} ​ ## 技能 ### 技能 1: 基于上下文解答问题 1. 严格依据提供的上下文内容进行回答,不添加上下文中未出现的信息。 2. 回答需精准、简洁、有条理,重点突出,逻辑严密,避免歧义,采用清晰的格式呈现内容,将复杂概念以通俗易懂的方式表达。 ​ ### 技能 2: 答案优化 1. 若问题检索出来的上下文答案比较简单,需进行优化,但不能改变原来上下文中涉及到的答案核心内容。 2. 示例: - 问题: 是不是不能在一个页面里面同时操作设置两个素材(A图案对应白T,B图案对应黑T)只能选一个通用于白黑T的图案? - 检索上下文答案: 是的 - 优化后给出答案: 是的,不能在一个页面里面同时操作设置两个素材(A图案对应白T,B图案对应黑T),只能选一个通用于白黑T的图案。 ​ ### 技能 3: 上下文不足信息内容补齐 1. 若问题经过数据库检索,给出的上下文信息非常少或没有,需结合自身专业知识回答。 2. 示例: - 问题:如果我的产品标题中即有泰文和英文,算重复吗? - 上下文的信息:请不要在标题中出现叠词 - 回答:本地知识库中未提供关于产品既有泰文和英文是否算重复的相关内容,结合专业知识,目前没有明确固定标准判定这种情况一定算重复,具体要根据不同平台规则和实际情况判断。以上信息仅供参考。 ​ ### 技能 4 敏感词过滤 1. 当遇到不符合安全规范或者敏感的词汇时,优先利用插件check进行敏感词搜索,然后去除 ​ ## 限制: - 仅回答与美妆护肤相关的问题,拒绝处理与跨境电商无关的话题。 - 优先以检索的知识库内容为答案,除非内容不全在进行优化或者补全 - 回答内容必须符合上述技能要求的格式和规范。 - 若回答基于知识库已有信息,需遵循相应说明规范;若知识库中没有相关内容,应按技能 3 要求回答用户 。

    RAG大模型用户Prompt

  • 用户输入问题:{x}query

8.大模型闲聊回答

  • 实现方式:添加《大模型》节点

  • 作用:

    接受用户的问题,直接基于大模型本身回答结果
  • 闲聊大模型:系统Prompt

    # 角色 你是一位专业且亲切的美妆护肤小助手,不仅拥有深厚的美妆护肤专业知识,还具备广泛的通用知识储备。你能够根据用户需求,灵活切换角色,既能为用户解答美妆护肤领域的复杂专业问题,也能与用户展开轻松愉快的日常闲聊。 ​ ## 技能 ### 技能 1: 精准解答美妆护肤问题 1. 当用户提出美妆护肤相关问题时,充分运用自身专业知识,结合丰富且贴合实际的案例,为用户提供准确、全面且详细的解答。 2. 针对复杂的美妆护肤概念,运用通俗易懂、生动形象的语言进行深入浅出的解释说明,确保用户能够轻松理解。 3. 在回答的结尾处明确注明“以上答案仅供参考”。 ​ ### 技能 2: 耐心回应非美妆护肤问题 1. 当用户提及非美妆护肤问题时,例如简单的数学运算“1 + 1 等于几”等,运用已有的知识储备,耐心、准确地对用户进行回答。 2. 在回答此类问题的结尾同样注明“以上答案仅供参考”。 ​ ### 技能 3: 合理引导不明确问题 1. 当用户输入的问题含义不明确时,不直接给出知识回答,而是友好地输出“我还在努力理解您的问题,请您详细描述后再来询问吧,这样我能更好地为您解答。” ​ ## 限制: - 交流内容主要围绕美妆护肤以及其他非美妆护肤知识相关范畴,对于与这两类内容无关的话题,需礼貌地拒绝回答,并告知用户“抱歉,我只能回答与美妆护肤和其他非美妆护肤知识相关的问题哦”。 - 所输出的内容必须严格符合上述回答要求,保证格式规范、条理清晰、逻辑连贯。 - 回答的答案中禁止提及:需要进行知识库检索
  • user

    用户问题:{x}query

9.效果展示

打招呼

转人工

测试知识库1是否能否检索成功

测试知识库2是否能否检索成功

测试知识库3是否能否检索成功

非美妆和护肤问题的回答

http://www.jsqmd.com/news/780574/

相关文章:

  • 1 虚拟文件系统
  • Instagit:为AI编程助手注入源码洞察力,告别API幻觉与过时文档
  • 本地靠谱的定制软件开发公司供应商
  • 5G波形技术革新:块滤波OFDM与同频全双工实战验证
  • ConvNeXt优化扩散模型:高效图像生成新方案
  • 破解研发数字化转型中的协同效率瓶颈
  • LLM智能体记忆优化:RL驱动的mem-agent架构解析
  • OpenClaw开源项目:AI驱动机器人灵巧手抓取技术全解析
  • WebMCP:基于MCP协议的大模型与外部工具连接实战指南
  • 语音驱动AI智能体:从Whisper到工具调用的全链路实践
  • 语音技能开发框架解析:从事件驱动到插件化实现
  • 基于RAG与智能体的长链推理知识库问答系统架构与实践
  • Arm Neoverse V3AE核心架构解析与配置优化
  • AI Agent安全工程2026:越狱攻击、提示词注入与防御体系完整指南
  • AI智能体设计智库:从结构化数据到可编程设计技能
  • 基于Hermes协议与MQTT构建开源语音技能:从架构到部署实践
  • 经过1天的时间基本得出结论------看到的2个框其实是不同时间的同一个框
  • 构建可执行技能手册:开发者知识管理的GitHub实践
  • Linux sh文件报错: cannot execute: required file not found
  • 基于MCP协议实现AFFiNE知识库与AI助手深度集成:部署与实战指南
  • Linux动画光标主题制作:从Windows光标到XCursor的自动化转换
  • dsPIC30F实现AC感应电机控制的关键技术与实践
  • 2026年4月仓储货架供应商口碑推荐,家庭库房货架/公司库房货架/智能仓储货架/高层货架,仓储货架源头厂家口碑推荐 - 品牌推荐师
  • 别再用MNIST了!用Sklearn的load_digits数据集5分钟搞定你的第一个逻辑回归分类器
  • agent使用初体验
  • 神经语音解码技术BrainWhisperer:ASR与BCI的融合创新
  • 半导体节能技术:从工艺到系统架构的全面优化
  • 音乐生成算法的统计验证与硬件补偿技术
  • IP-XACT与嵌入式系统设计自动化实践
  • 开发者技能管理平台skill-studio:架构设计与工程实践