diff --git a/app/chat_qa/classification/general_text_extract.py b/app/chat_qa/classification/general_text_extract.py index 5157962..f936fd6 100644 --- a/app/chat_qa/classification/general_text_extract.py +++ b/app/chat_qa/classification/general_text_extract.py @@ -31,6 +31,47 @@ general_prompt = """ 输入文本:{text} """ +general_merge_prompt = """ +# 任务 +从三类输入中提取与"下一次回复"直接相关的结构化关键要点,按优先级融合后输出。 + +# 输入 +- 最新聊天内容(最高优先级): {message} +- 历史相关知识: {milvus_content} +- 标准内容: {standard} + +# 处理规则 +1. 【优先级去重】同一事实优先采用 {message},缺失部分依次补充 {milvus_content}、{standard},不重复罗列。 +2. 【个人信息脱敏】删除所有个人身份信息(姓名、年级、专业全称、学校、联系方式等)。 + - ⚠️ 特别注意:「回复主题」同样需要脱敏,不得包含具体专业、年级、姓名等身份标识。主题应概括"咨询类型/事项",而非"用户身份"。 +3. 【用户事实过滤】严格去除所有与用户主体相关的客观事实信息,包括但不限于: + - 用户的计划、意向、时间安排、人数规模、行程动向; + - 用户当前的状态、情绪、顾虑、已做出的决定; + - 用户提及的任何"我/我们"视角的行为描述。 + 仅保留销售/服务方需要执行的动作、接待安排、标准流程、适用条件与门槛。 +4. 【主题相关性过滤】严格过滤与当前回复主题无关的历史信息,包括但不限于: + - 已明确终止的咨询记录(如用户已拒绝并结束的话题); + - 与当前课程方向无关的其他技术栈/工具争议; + - 负面情绪或人际冲突类描述(如"互删""不考虑"等)。 + 仅保留对当前回复有指导价值的事实要点。 +5. 【纯事实提取】只提取客观事实要点,不生成完整回复,不添加销售话术、过渡句或主观推测。 +6. 【空值处理】若无核心数字或适用条件,对应字段输出为空列表 `[]` 或留空,不编造。 + +# 输出格式 +严格按以下 YAML 输出,禁止添加额外解释: + +```yaml +回复主题: + +关键信息点: + - 信息: + +核心数字: + - + +适用条件/门槛: + - +""" class TextExtract: async def text_extract(self, text:str)->str: @@ -41,3 +82,12 @@ class TextExtract: chain = prompt_template | llm |str_output_parser answer = await chain.ainvoke({"text": text}) return answer + + async def message_extract(self, message:str, milvus_content:str, standard:str)->str: + + prompt_template = PromptTemplate(template=general_merge_prompt, input_variables=["message", "milvus_content", "standard"]) + str_output_parser = StrOutputParser() + chain = prompt_template | llm |str_output_parser + answer = await chain.ainvoke({"message": message, "milvus_content": milvus_content, "standard": standard}) + return answer + diff --git a/app/chat_qa/classification/history_intent.py b/app/chat_qa/classification/history_intent.py index c959f71..5001fce 100644 --- a/app/chat_qa/classification/history_intent.py +++ b/app/chat_qa/classification/history_intent.py @@ -129,6 +129,8 @@ class HistoryIntent: async def get_message_summary(self, date: str = None): stime = time.time() intent_repo = IntentClassificationRepository() + # 获取意图分类 + intent_list:list[str] = await intent_repo.get_style_intent_categories() if date: start_ts, end_ts = await self.get_day_ms_timestamp(date) day_ArchiveMessages = await self.archive_messages_repository.get_message_statistics_by_date(start_date=start_ts, @@ -138,8 +140,6 @@ class HistoryIntent: day_ArchiveMessages = await self.archive_messages_repository.get_message_statistics_by_date() - # 获取意图分类 - intent_list:list[str] = await intent_repo.get_style_intent_categories() # 改成map date_user_message_a_set = set() summary_list: list[str] = [] @@ -184,6 +184,8 @@ class HistoryIntent: summary_res = await self.intent_message(coro_list, intent_list) summary_list.append(summary_res) + #summary_list = ['{\n "qa_pairs": [\n {\n "intents": "发票开具",\n "answer": "聂萌个人发票36800元场景建模,吴宇杭个人发票场景建模3个月21800元,一共2个。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "学习情况",\n "answer": "卢非学习一直挺好的,很刻苦,状态和之前一样保持,目前是第二个案例阶段,进度正常进行。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "销售提供了二维码供用户扫描,以便进一步进行课程咨询。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "学生孙传扬是场景暑假3班的,下学期大四,家长也会一起过来参观远中校区。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "游戏特效",\n "answer": "王新文,2004年1月25日出生,来自上海市,本科毕业于内蒙古艺术学院公共艺术专业(2026届),学习目的为就业。报名日期为2026年7月27日,入学时间同为2026年7月27日,学习方向为游戏特效,学习性质为全日制线下全流程。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "销售表示群里有一个名额,如果用户没有被添加,可以提醒销售,销售会再次拉群。销售也可以直接拉群。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "电脑配置",\n "answer": "电脑不限品牌,CPU最好i5或者以上,显卡要4060或者以上,内存16G,预算足的话最好32G,固态硬盘512G。正常和配电脑的说用来做游戏建模,会给你配置合适的。"\n },\n {\n "intents": "3D角色建模",\n "answer": "如果是角色课程,就是先跟7月份开的这一期,并且会额外赠送一次免费转新班的机会。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "分期付款",\n "answer": "没有分期付款或两次缴费的方式,需要一次性缴费完成之后签协议对接教务。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "如果用户不是非原画不可,也可以考虑模型方向,目前三维视觉呈现是主流。课程从0教学,线上直播周期是8-10个月,是针对就业的系统课程。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户询问是否可以单独报名学习某个软件(如3dmax),销售回复称没有单独学软件的课程,因为案例都是全流程的,软件不会单独拆开学。用户进一步询问是否可以分开购买课程,先买基础部分再全部购买,销售回复没有拆分,这是针对就业的系统课,有配套服务和针对就业的服务。"\n },\n {\n "intents": "就业咨询",\n "answer": "用户对机构质量有疑虑,提到之前了解的线下机构比较一般,并担心就业占比。销售回复称他们的学生进头部大厂的比例是最高的,很多机构甚至拿不出大厂offer,并展示了今日的学生offer案例,同时提供了与学生背景相似(山东工艺美院)的个人作品集和访谈供用户参考。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "特效",\n "answer": "线上班费用是13800元,好几年没涨价了,因为整体课程体系更新以及增加了教务,所以上涨了2千。没有优惠政策,费用一直都是统一的。插班学不是自学,上过的课程需要自己补录播,有问题随时问老师。答疑主要是群里沟通,老师会把群消息置顶,看得更及时,也有班主任督班。报名流程是:缴费、填资料、签合同、对接教务。缴费时需备注全名,咨询对接老师选择贺老师。之后需要提供姓名、报名日期、所在城市、专业、学历、在读/毕业院校、出生日期、学习目的、电话、QQ、微信、身份证号码、学习方向等信息。签协议后对接教务老师,教务老师会对接软件安装、资源教程、看课权限、班级群等。可以先插班,如果觉得太赶进度学起来困难,可以和教务老师沟通免费转新班。"\n },\n {\n "intents": "报名流程",\n "answer": "报名流程是:缴费、填资料、签合同、对接教务。缴费时需备注全名,咨询对接老师选择贺老师。之后需要提供姓名、报名日期、所在城市、专业、学历、在读/毕业院校、出生日期、学习目的、电话、QQ、微信、身份证号码、学习方向等信息。签协议后对接教务老师,教务老师会对接软件安装、资源教程、看课权限、班级群等。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "线上直播教学",\n "answer": "我们提供线上和线下面授两种模式。线上费用是13800元,线下费用是36800元。师资一样,内容案例不是一模一样,教学软件流程是一样的。线上直播周期是8-10个月,正式课每周上3节,安排在晚上7点半到9点半直播,直播之后生成录播回放。线下周期是7个月,听讲和练习都在班里,时间更紧凑。线下在上海和西安。"\n },\n {\n "intents": "3D场景建模",\n "answer": "角色和场景是两个岗位方向。无论场景模型地编还是角色模型,都是先学道具。角色模型岗位需要道具+角色;场景模型岗位需要道具+场景;地编岗位需要道具+场景+地编。角色不需要学地编,地编也不需要学角色,但地编得学场景模型。您的风景园林专业背景,场景模型0基础都可以学。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "孩子是准大一设计类,希望往游戏和动画方向走。销售表示只要是美术生,都是对口的,同一起跑线,学校里面无论什么专业,都是一样要校外报班的,很多美院的数媒、动画、游戏设计专业的学生也都是在第九联盟学习的。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "线上直播教学",\n "answer": "线上正式课每周上3节,都是安排在晚上7点半到9点半直播,直播之后会生成录播回放。线上费用是13800元。线上有班主任督学,也有班级答疑群,氛围挺好的,手机端和电脑端都有学习账号后台,可以查看学习进度。线上模式不影响做兼职或全职。"\n },\n {\n "intents": "3D场景建模",\n "answer": "场景模型技能可以用在游戏,也可以用在影视动画。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "家长,您好,我是第九联盟课程咨询贺老师。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户确认已收到邮寄的物品,并表示感谢。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "游戏特效",\n "answer": "线下课程周期为6个月,学费是36800元。针对在校大学生,有寒暑假分段线下课程,平常额外赠送线上打基础做巩固的课程。线上课程费用是13800元,转线下需补差价23000元。"\n },\n {\n "intents": "就业咨询",\n "answer": "机构整体就业率在90%,有学生出国留学做作品集或因身体原因需重修。只要能好好学习,就业没问题。针对在校学生有专门的校招群,部分企业有直接内推渠道,在简历制作、作品集整理、投递、测试、面试模拟和offer选择上都能提供帮助。学历方面,技术岗位主要看技能水平,大专学历也有进大厂的先例。休学延毕不影响就业,只有挂科才有影响。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "销售提供了一些学生个人作品集和访谈供用户参考。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "用户担心家这边游戏行业不是很发达,销售回应如果考虑深圳广州就业的话,机会非常多,惠州确实少一些。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "场景模型线上课程周期8-10个月,费用13800元,全程线上学习。线下课程费用36800元,食宿自理,住宿为4.6人间,每月1000-1300元,吃饭每天五六十元。在校大学生可以选择寒暑假分段线下学习,平常额外赠送线上看课权限。线上+线下模式灵活,学生线上学完阶段后,线下可从任意阶段开始,学费仍为36800元。课程内容为场景模型+地编,地编岗位一般不要新人,通常从场景模型岗入行后再转地编。"\n },\n {\n "intents": "就业咨询",\n "answer": "场景模型在成都好就业,因为成都游戏动漫产业发达。北上广深杭州成都西安武汉都是岗位需求较多的城市。AI只是一个工具,可以优化重复性工作,但替代不了人工,尤其是意识流的东西。学习完成后如果作品集合格,可以推荐就业,也有内推机会。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户询问为什么角色班是两个班级一个老师,以及质疑线下班是否只有20人左右,表示如果得不到答复将投诉师资不足强行开班。销售回应会去了解情况并安排教务老师联系用户,但用户表示联系段老师后被告知无法处理,将自行向更高层面投诉。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "UE引擎开发",\n "answer": "UE人才更稀缺一些,也是大趋势。"\n },\n {\n "intents": "线上直播教学",\n "answer": "有线上的,这个就是线下授课同步线上直播。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "公司介绍",\n "answer": "第九联盟是点晴的子公司,点晴主要做项目制作,第九是做培训的。"\n },\n {\n "intents": "寒暑假教学",\n "answer": "针对在校大学生是寒暑假分段线下+平常额外赠送线上的模式。线下周期是6.7个月,寒暑假累积学满这个周期,一般需要2-3学年。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "地编课程有7个月的长期班,从0到就业的系统课,线下费用36800元,线上费用13800元。短期班只有线下,3个月费用21800元,需要根据作品情况沟通老师能否接收,针对性地做辅导优化,但不包含推工作(虽然也会尽量帮忙推,但不会写进协议)。"\n },\n {\n "intents": "就业咨询",\n "answer": "推工作方面,长期班会帮忙推工作,短期班不包含推工作但也会尽量帮忙推,不写进协议。对于26届毕业生,如果作品不错,会尽力推校招补录机会,补录不理想则走社招先入行。虽然两年内未缴社保算应届生,但有些企业会卡毕业年届,腾讯卡得较松,多益、叠纸也有一定机会,具体看公司内部计划。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "线下角色建模课程是全日制脱产学习7个月,上课时间周一至周五9:30-12:00、13:30-18:00,晚上18:50-21:30(不强制),地点在上海。线下费用为36800元,提供配套设备。下一期预计8月底9月初开班,小班制每期十几二十人。住宿有收费统一学生公寓,4-6人间,每月1000-1300元不等。线上课程为8-10个月直播周期,回看权限永久,答疑有效期3年,费用13800元。线上和线下是两套独立的系统课程,均针对就业。"\n },\n {\n "intents": "试听课",\n "answer": "可以安排试听课。线下试听需到现场,线上试听可观看线上课程的录播回看。用户提供姓名后,销售提供了两个线上试听链接:线上角色道具基础试听和线上角色猫猫头试听,点击即可观看。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "住宿咨询",\n "answer": "我们这边也有学生公寓的哦,住多久交多少的住宿费就行,一个月1千左右的。周末双休,你可以再回家住。"\n },\n {\n "intents": "优势/竞争力",\n "answer": "上海这边资源肯定是最好的。主要看学校效果的,如果学不出来,时间精力和钱都是白花了。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "线上直播教学",\n "answer": "线上课程的专业性同样有保障,但需要学生自己更加自律。如果经济条件暂时不支持线下学习,可以先存钱,之后考虑线上课程。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "上课时间",\n "answer": "上课时间为9:30,而非9:00。如果有具体对接问题,可以扫码添加教务老师的微信,老师会在9:30左右到电脑旁后进行对接。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户为高一学生,询问高中生能否学习游戏动漫模型课程。销售确认用户身份后,询问其学习目的是兴趣爱好还是就业,并告知学习费用要一万多,需要家人支持。用户表示需要询问家人后再决定。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "宿舍地址",\n "answer": "锦馨公寓的男生梁铭凯退住了,需要将他的东西打包好放在一边。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户刘默,目前大三,视觉传达专业,尚未确定具体学习方向。课程咨询老师介绍了与视觉传达专业对口的课程方向,包括角色模型、场景模型、游戏特效和游戏动画,并计划明天详细说明各方向区别。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "实习咨询",\n "answer": "作品出来就可以进行推荐实习啦。"\n },\n {\n "intents": "班主任联系方式",\n "answer": "我可以推给您班主任老师的微信,您备注一下是黄耀妈妈就好了。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户表示暂时不会过来,还需要考察,销售告知用户如果这次不过来,这个暑假的课程就结束了。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "哈喽哈喽"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "我们就业率基本在85%,这个数据主要是提交作品集后1个月以内给到的。剩下的学生有的是作品集没有完善好,所以没办法对接就业,等完善好以后还是正常的推荐就业。能不能冲大厂以及能否就业,需要看个人能力,因为技术岗都是要看个人的,我们只是能带给你专业的技术,但每个人的吸收能力、学习能力不同,结果也会不一样。推荐就业主要有两种渠道:一是我们公司项目组有招聘需求的情况下,需要内部测试,符合要求的话公司自留;另一个是内推到一些合作的企业,后期也会有就业指导课程,把简历和作品集给到就业老师。就业老师会根据你的学历、技术水平、行业经验、想去的城市、期望薪资等,针对性推荐匹配的企业。厦门也可以推荐,不过相对上海、广州、深圳会少一点。"\n },\n {\n "intents": "上课安排",\n "answer": "线下上课时间是周一至周五,周末双休,具体为早上9:30-12:00,下午1:30-6:00,晚上6:50-9:30(不强制)。线下是滚动式开班,基本上一个半月开一次新班级,一整套完整的课程周期为7个月。线上是网课8-10个月周期,一周2-3次,晚上7:30-9:30直播,直播结束后会给到录播回放,有老师答疑。如果没时间看直播也不影响,也可以只看录播回放,自己上手练习时不懂就问老师。线上是随时都可以学习的。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报名流程",\n "answer": "用户吴宇杭,报名日期为2026年7月27日,学习方向为场景,就读于四川省宜宾市职业技术学校,计算机动画制作专业,中专学历,学习目的为就业。报名时需填写姓名、报名日期、专业、学历、在读院校、所在城市(居住城市)、出生日期、学习目的、电话、QQ、微信、身份证号码和学习方向。后续需签署合同,先签署3个月合同,之后补齐差价再转换为系统班合同,签署时使用提供的链接登录,签署名字后提交即可。"\n },\n {\n "intents": "预科上课",\n "answer": "用户询问明天预科是否有老师讲课,销售确认明天预科有老师讲课。上课时间为9点半,建议不要迟到。另外,用户询问耳机用途,表示若用于听课,可带头戴式蓝牙耳机,但建议使用3.5毫米耳机。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "合同",\n "answer": "合同在法大大上传后可以用法大大在线签署。目前合同价格已修改,但印章之前有问题,波总已重新上传印章。合同波总说后面要调整。"\n },\n {\n "intents": "报名流程",\n "answer": "学生已经交过钱,对接完老师后,等待签署合同。合同在系统维护升级后,通过法大大在线签署即可。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "住宿咨询",\n "answer": "住宿是自费的,有4人间和6人间,一个月基本1000-1200元,是上下铺。如果住不满一个月,会按天折算,一天大约30-40元。具体住哪里需要等来了才能看。吃饭方面,学校周边有小店、食堂,也可以点外卖,一天50块基本足够。"\n },\n {\n "intents": "UE引擎开发",\n "answer": "课程中UE引擎的使用是从建筑案例开始涉及的,最后一个案例是纯UE引擎地编的,四个正式课案例中有两个涉及到UE。课程设置是从企业岗位技术要求针对性授课的,确保学完后符合企业用人标准,而不是像其他机构那样什么都学一点但都不精。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "上课安排",\n "answer": "管导十点会上课。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "关于您昨天提出的需求,我们目前已经做好方案了,马老师会发在群里。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "快递服务",\n "answer": "用户请求帮忙叫快递寄送物品,包括1条被子、床单和枕头,并表示会支付运费。销售同意帮忙,并告知已找到袋子打包,还发现一个孩子的快递一并打包。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "宿舍地址",\n "answer": "宿舍配置包括被子、褥子、枕头和一个小桌子,用户为下铺。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "用户聂萌,报名日期2026年7月27日,专业为视觉传达设计,本科学历,在读院校邵阳学院,当前大学就读年级为大四,所在城市邵阳,出生日期2005年10月2日,学习目的为校招,电话19873607263,QQ 2027219235,微信jlnm1002,身份证号码430725200510020063,学习方向为场景建模。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "合同",\n "answer": "用户咨询关于3个月21800元短期合同的签署问题,销售反馈系统在维护,公章可能有问题重新上传,最终可以处理并签署。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报到流程",\n "answer": "报到地点在7号楼,建议9:20左右到达。需要加班主任段老师的微信,她会负责安排学生的位置。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "合同",\n "answer": "当前的合同是3个月的签署合同,等后面补齐差价后,会再转换成系统班的合同。"\n },\n {\n "intents": "报名流程",\n "answer": "在十月中下旬需要补交15000元的差价。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "纪年ovo,这里是关于3D角色建模的相关介绍。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报到流程",\n "answer": "用户到达公司楼下后,销售指示直接上三楼办理手续,然后再去段老师那边。用户确认收到指令。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户询问学校在几楼,销售确认用户还在学校。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "场景建模专业课程,主要面向场景建模方向的学生,学习目的包括校招和就业。例如:学员聂萌(视传专业,本科,邵阳学院大四,学习目的校招,方向场景建模)和学员吴宇杭(计算机动画制作专业,中专,四川省宜宾市职业技术学校,学习目的就业,方向场景)。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "UE5是强大的引擎工具,可用于特效、开发和模型搭建。对于美术方向,推荐UE场景模型,适合业余爱好且可作为副业。场景建模课程学习3dmax、maya、zbrush、sp、八猴渲染器、ue5、ps等软件,分为四个阶段:枪械道具、车辆载具硬表面、单体建筑物、UE场景。课程针对就业,从基础到进阶,学完有推荐就业。线上课程价格为13800元。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户坐标深圳,意向学习游戏设计线上课程,希望了解机构推荐,联系方式为电话17796303493和微信号gcs06151121。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "线上直播教学",\n "answer": "线上网课周期为8-10个月,费用为13800元,每周上课2-3次,时间为晚上7点半到9点半,采用直播形式,直播结束后会提供录播回放,有老师答疑,并且推荐就业。"\n },\n {\n "intents": "兴趣/提升班",\n "answer": "如果只是作为兴趣爱好而非专业就业方向,建议可以只看网上的免费教程即可。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "学习模式",\n "answer": "你目前正在参加线下集中训练,课程强度较高,晚上8点才结束。虽然会累一点,但能跟得上进度就不错,学习就是要先苦后甜。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "我们目前没有单独针对AI的课程,但建模课和二次元原画课后期都会涉及AI相关的内容。教学重点是结合AI和制作思路方法来学习,因为AI只是一个工具,我们可以通过它来做出对应的作品。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "技术岗就业都是需要通过考核才可以的。不然成了交钱买工作了。哪里学习技能也不可能有这样的承诺呀国家都管不了的就业事情,哪个机构敢保就业。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户表示大概率会报名课程,销售员容容老师回应认可,并感谢销售员邓老师的帮助,邓老师也礼貌回应表示这是自己的业绩。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "校区分布",\n "answer": "您好,我们目前在上海有线下校区。虽然您考虑郑州线下,但建议您来上海学习,因为大厂都在上海,在上海学习才能学到真正的东西。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "家长您好呀,之前试听课有发给孩子看一下不?孩子还没看,这几天出去和同学玩了。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "用户是新疆艺术学院雕塑系即将大四的学生,对原画和角色模型感兴趣,销售引导其关注角色模型方向。用户表示想学一个暑假班,但担心开学后时间不多,销售推荐了线上课程,并发送了试听课和报价。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "电脑配置",\n "answer": "用户反馈电脑上的3Dmax 2024版一直卡顿,并且上周承诺本周更换版本但未兑现。销售表示会与班主任沟通,安排IT老师协助处理。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户表示家人说以后再报,目前是大二学生,开学大二。销售询问是否有校招想法,并告知学生基本上都是和用户一样大的,用户表示需要会再找销售。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "校区分布",\n "answer": "第九联盟线下校区在上海、西安、青岛,广州没有校区。"\n },\n {\n "intents": "3D场景建模",\n "answer": "场景建模线下课程费用为36800元,线上为13800元。线下为周一到周五全日制上课,上午九点半到下午六点需要在校区,中午12点到1点半有午休,晚上可自习到十一点;周末无课程但学生可指纹进入校区自习。线上课程时间主要在晚上,教学案例与线下可能略有区别,但流程一致。线下场景班最近开班时间为本月初,下个月底也有新班。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "角色建模线上职业班费用为13800元,课程为一周三次直播课,时间在晚上7:30-9:30,每次两小时,时长约8个月。每节直播会生成录播可回看,课程采用学练考结合方式,每周有课后练习并批改指导,考核为作品集,老师会指导和评分。课程针对0基础到入行的系统职业班。"\n },\n {\n "intents": "就业咨询",\n "answer": "课程属于就业班,会统一签署就业协议,包括作品集服务、面试模拟、简历指导、企业内推以及校招和社招辅导。公司本身是游戏公司点晴科技,承接大厂项目,合作企业包括腾讯、网易、米哈游、莉莉丝、叠纸等。校招有两季:3-5月春招和8-11月秋招,明年结束前有补录机会。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户表示当天无法到访,需要过几天后再联系销售。销售回复好嘞,表示理解。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "我们线上和线下都是有的,纯线上的话13800,线下的价格是36800。"\n },\n {\n "intents": "3D场景建模",\n "answer": "场景地编的课程上手不难,岗位需求也大,咱们会学习到在游戏动画里面的道具,汽车枪械,单体建筑物,山石崖壁和植被雕刻等等的内容。如果担心就业和上手难度的话,选择场景方向是最稳妥的。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报到流程",\n "answer": "用户将于明天下午3点到达虹桥,销售已告知其直接前往报到地点。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户咨询线上Unity 2D开发课程,但销售表示主要做UE开发,用户表示不考虑并建议互删。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "用户表示目前考虑就业,销售介绍有就业推荐服务,并询问用户的年龄、学校和专业以了解基本情况。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "13班的教学老师是吴老师,他带出过很多大厂学生。14班的教学老师目前还没有确定。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "我们的课程都是属于就业班,咱们都是会统一签署就业协议的。包括作品集服务,面试模拟,简历指导和企业内推,校招辅导和社招辅导都有的。"\n },\n {\n "intents": "3D场景建模",\n "answer": "场景模型7个月时间,全日制的学习方式,早上九点半到下午六点钟。简单好上手的话,选择这个方向。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "饭钱",\n "answer": "蔡蔡老师(●°u°●)\u200b 」这是芊芊这个月的饭钱(●°u°●)\u200b 」这周她说家里安排去夏令营,这周都不来(●°u°●)\u200b 」一共309.58。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "用户因能力达不到公司要求,在试用期被公司辞退,未获得赔偿。销售建议用户看看秋招补录,并表示会先向就业老师咨询补录名额情况。用户认为补录可能不招26届,但表示社招也可以,能找个小厂干就行。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "交通咨询",\n "answer": "用户因长智齿疼痛询问附近是否有牙科医院,销售推荐去牙防所或三甲医院,并提醒用户牙防所是公立医院,私立医院不建议去。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "线下场景课程周期是7个月,学习3dmax/maya,zbrush,sp,八猴渲染器,ue5,ps等软件,包括预科+正式课道具,硬表面,单体建筑物,ue环境4个阶段,费用是36800元。"\n },\n {\n "intents": "作品评估",\n "answer": "往届建模学员作品集已发送,包含校招和社招的作品。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "UE引擎开发",\n "answer": "开发线上跟线下课程是同步进行的,是全日制的直播课,跟线下是一套课程,早上9.30-12.00,像学生可能平常有点忙的话,我们也有直播后的回放课整理出来,然后老师一对一解答,线上7个月的课程费用是13800哈,相当于线上学习了线下完整的课程哦。学习案例包括从c++开始,推箱子,贪吃蛇,俄罗斯方块,魔塔;图形学部分:黄金旷工,3d引擎;ue部分:2d横版,3d密室,坦克,射击fps,联网对战rpg,vr,数字孪生。主要是学习案例的逻辑功能和代码框架。"\n },\n {\n "intents": "分期付款",\n "answer": "学费一次性哈,我们也有支付宝花呗分期,有3期,6期,12期,学生自己也可以走信用卡类分期都可以的哈,花呗分期的话家长的也可以哦。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "游戏特效",\n "answer": "线下系统班学费在3万左右。特效和地编是完全平行的岗位,模型比较好就业,岗位量多,需求量更大。"\n },\n {\n "intents": "3D场景建模",\n "answer": "地编需要会做模型,包括建模和场景搭建,配合渲染灯光,需要较好的审美能力。地编岗位不多,很多公司是模型师转的或招聘有模型经验的。学生学习需要学习场景模型,课程会涉及初级内容,入行后有项目经验可以再转。线下系统班学费在3万左右。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "校园网络",\n "answer": "学校没有WiFi,因为是局域网,涉及到保密性,所以学生不能用WiFi,但学生可以使用自己的手机上网。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "有合格的作品集有就业服务的。我们有就业老师内推就业,学习到后期,按老师的要求完成了作品,我们就会根据学生的需求帮你做企业内推,直接跳过HR筛选简历的过程。我们自己项目组有空缺的情况下也会留用学生。"\n },\n {\n "intents": "学习模式",\n "answer": "线上是一周三次课一次2个小时,学生练习的话建议是每天。线下我们在上海、西安、青岛都有校区,武汉有分公司但目前在做保密项目暂时不对外招生。线下有合作的宿舍,学生也可以出去住,吃饭可以带饭,有冰箱和微波炉,周边也有大食堂,但住宿不包含在学费内。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "可以联系就业老师夏老师,她那边有简历模板,可以指导如何写简历。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报到流程",\n "answer": "带个自己喝水的水杯和笔记本就行,如果有有线耳机的话,可以带个有线耳机,可以插到电脑上的那种。到了之后,先跟他们进去,在那个蓝凳子上坐一下。"\n },\n {\n "intents": "外卖地址",\n "answer": "如果点外卖的话11点就可以点啦,地址是上海市徐汇区桂箐路7号华东理工G7科技园区3号楼3楼。学校右转过马路是社区大食堂。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "交通咨询",\n "answer": "从沈杜公路地铁站到学校地铁通勤需要一个小时以上,时间较长。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户表示认可(OK),未提出具体问题,销售未进行介绍。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "作品评估",\n "answer": "作品集需要自己先画出来,然后老师在修改,最后优化成系统的作品集。"\n },\n {\n "intents": "课程咨询",\n "answer": "学美术肯定是越早越好,因为还需要打磨作品,我们学的早的高考完就来啦。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "角色建模线上课程8-10个月,学习maya,zbrush,sp,MD,xgen,八猴渲染器,ps等软件。包括预科+正式课角色道具,形体套装,风格化完整角色,写实完整角色4个阶段。角色模型比较吃美术功底,对头部肌肉线条形体等要求较高。"\n },\n {\n "intents": "作品评估",\n "answer": "环艺背景与场景建模贴合,但如果人体美术功底可以的话走角色建模也没问题。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "线上直播教学",\n "answer": "线上职业班一周三次直播课,每次两个小时,时间是晚上7:30到9:30,时长大概8个月左右。建议学生每天花两到三个小时练习。正式课从8月10号开始,一周三次课一次两个小时;预科阶段一周两次课一次两个小时。"\n },\n {\n "intents": "3D场景建模",\n "answer": "是的,场景课程是预科阶段斧子案例,8月10号开始正式课案例。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "场景线下课程周期是7个月,费用是36800元。学习软件包括3dmax/maya、zbrush、sp、八猴渲染器、ue5、ps等,课程包括预科+正式课道具、硬表面、单体建筑物、ue环境4个阶段。场景模型比较好入行,量也大,对美术功底要求较低,适合没有美术功底的同学。"\n },\n {\n "intents": "校区分布",\n "answer": "山东有青岛校区,地址是山东省青岛市黄岛区长江中路519号建国大厦1604室。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "公司介绍",\n "answer": "第九联盟是点晴科技公司旗下的一个品牌,主要是做游戏动漫美术人才孵化的项目。母公司点晴科技成立于10年,目前有近700人,在游戏美术外包国内规模排名前三。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "退费咨询",\n "answer": "用户因学习压力大想退学退款,但销售表示合同已超过7天,且合同是从周一签的当天算起,需先问领导再决定。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "角色建模线上课程需要8-10个月,学习maya、zbrush、sp、MD、xgen、八猴渲染器、ps等软件,包括预科+正式课角色道具、形体套装、风格化完整角色、写实完整角色4个阶段,学费13800元,每周三次直播课,晚上7:30-9:30,每次两小时。线下全日制课程需要7个月,学习软件及基础以及商业案例,最终成果需出4-5套作品,学费36800元。线上结合线下模式按线下收费,线上免费赠送。非美术生也可学习,学完后有就业老师内推就业服务。"\n },\n {\n "intents": "公司介绍",\n "answer": "第九联盟是点晴科技公司旗下的品牌,点晴科技是一家游戏动漫制作公司,成立10年,目前近700人,在游戏美术外包国内规模排名前三,与腾讯、网易、米哈游等大厂有合作。公司曾参与多个解禁项目,并有央视采访视频。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "教孩子角色建模的老师是小栗老师。孩子上课能听懂,现在的案例也不是特别难。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "就业老师已与学生本人沟通,了解到学生面试未通过的原因是新人较多、公司多方面筛选。建议关注秋招补录机会。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "特效",\n "answer": "线上职业班一周三次直播课,晚上7.30-9.30,一次两个小时,时长大概8个月左右。线上是直播+录播+老师解答,老师也是总部的老师。纯线上学习8-10个月课程,学费是13800元,线上课程结束,提交作品集审核通过,有就业老师内推就业的服务,未毕业的大学生有专门的校招群。学费一次性支付,支持支付宝花呗分期,有3期、6期、12期,花呗分期可以用家长的,学生自己也可以走信用卡类分期。"\n },\n {\n "intents": "就业咨询",\n "answer": "线上职业班课程结束后,提交作品集审核通过,有就业老师内推就业的服务,未毕业的大学生有专门的校招群。第九联盟有校招辅导内容,内部对接的校招渠道与一些头部研发公司有内部定向合作。就业老师提供线下一对一面对面指导和线上视频连线答疑,提前梳理高频面试问题,帮助提升上岸率。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "我们这边有原画、模型、动作、特效、开发等多个方向的内容。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "UE引擎开发",\n "answer": "我们的学习过程从C++基础开始,案例包括推箱子、贪吃蛇、俄罗斯方块、魔塔。图形学部分涉及黄金旷工、3D引擎。UE部分包括2D横版、3D密室、坦克、射击FPS、联网对战RPG、VR、数字孪生。主要是学习案例的逻辑功能和代码框架。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "场景线上课程周期是8-10个月,学习3dmax/maya,zbrush,sp,八猴渲染器,ue5,ps等软件,包括预科+正式课道具,硬表面,单体建筑物,ue环境4个阶段。环艺跟场景比较贴合。"\n },\n {\n "intents": "就业咨询",\n "answer": "你开学大三的话,其实可以系统学习做作品集尝试看看校招。如果先住学的话后面专升本过了还可以尝试校园招聘。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "提供服务",\n "answer": "学生吃饭费用为309.58元,请转给公司账户,而不是销售个人账户。销售会提供老师的收款码或支付宝账号用于转账。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "试听课",\n "answer": "我们也有试听课的,你有时间的话可以发你去感受看看。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "住宿咨询",\n "answer": "卢非已经退出了原来的宿舍,目前是和班级同学一起在其他宿舍住,宿舍费用单独结算给宿舍公寓负责人。原则上不能再住回原来的宿舍,但如果学生还有意愿,可以再向宿舍老师询问。同时,机构可以推荐正规的中介,也可以帮助学生安排住宿。"\n },\n {\n "intents": "学习反馈",\n "answer": "卢非整体学习状态保持得很不错,特别刻苦,学习没有问题,能跟上课程进度。如有进度落下,机构会及时与家长沟通。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "交通咨询",\n "answer": "离公司最近的地铁站是12号线虹漕路地铁站,公司附近也有9号线,但9号线相对有点距离。公司位置已发送,可以按照导航或视频指引来走。"\n },\n {\n "intents": "报到流程",\n "answer": "到公司楼下了上三楼即可,老师会来接。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "大学生扶持计划",\n "answer": "大学生扶持计划的价格是3580元,课程是录播形式。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "3D建模",\n "answer": "建模按照行业岗位划分为角色建模和场景建模。角色建模是做人物设计,比如欧卡风、写实、风格化人物。场景建模是制作道具以及单体建筑,比如刀、枪、斧头、建筑。学习的话,只需要学一个方向,学到专精整理出作品集就可以就业。"\n },\n {\n "intents": "课程咨询",\n "answer": "杭州这边有线下培训,您妹妹想做3D建模方向,可以了解我们的培训内容和实际上课情况。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "提供服务",\n "answer": "用户询问老师是否有口罩,并表示听说二班群里有人得新冠了,需要紧急使用。销售回复说会到公司查看是否有口罩并送过去。用户后续表示自己已购买但尚未送达。销售告知用户,有新冠风险的学生在试听教室,不在用户所在区域,用户所在环境空气流通,相对安全,建议用户先关注自身状况,有问题随时联系。用户询问是否有棉签用于自测,销售表示没有。用户自测后结果为一条杠(阴性),销售告知用户可安心并做好预防。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "公司介绍",\n "answer": "第九联盟开设了场景建模、角色建模、游戏特效、游戏动画、游戏开发几个方向。游戏制作流程是:策划师策划流程,原画师画出2D原画,建模师做三维建模(分场景和角色),动作设计师给人物动物加上动作设计和骨骼绑定,特效师匹配视觉效果,开发工程师写代码打包上线。"\n },\n {\n "intents": "就业咨询",\n "answer": "有两位中专院校的学生,一位学场景建模,一位学角色建模,最后都就业了。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "场景建模课程有线上和线下两种模式。线上是直播授课,有回放,老师全天答疑,费用为13800元;线下是面授形式,老师周一到周五全天在教室,提供场地和设备,教的案例比线上多,费用为36800元。线上比较看重学习自律性,线下效果会更好。"\n },\n {\n "intents": "游戏制作流程",\n "answer": "游戏各岗位的关系是:策划师策划游戏或动画流程,原画师根据文字画出2D原画,原画师画完后转给建模师做三维建模(分场景和角色两个大方向),建完模型后到动作设计师处给人物动物等加上动作设计和骨骼绑定,然后到特效师处匹配视觉效果(如buff特效、攻击特效等),最后给开发工程师写好代码打包上线。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "上课地点",\n "answer": "用户王老师告知胡同学带人到达H88,并指引上九楼即可。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "班级安排",\n "answer": "学生小邓已被安排在周老师的班级中,周老师会单独关注他的学习进度。后续作品集相关事宜也由周老师跟进。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "大学生扶持计划",\n "answer": "大学生扶持计划课程价格为3580元,是录播课程,没有就业服务。"\n },\n {\n "intents": "报名流程",\n "answer": "用户报名后,销售会对接班主任老师,用户可以通过班主任老师的微信进行后续课程开通等事宜。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "线上场景建模课程费用为13800元,课程周期8-10个月,学习3dmax/maya、zbrush、sp、八猴渲染器、ue5、ps等软件,包括预科案例+正式课道具、载具、单体建筑物、ue环境4个阶段。线上班预科案例一周2节课,4-8周;正式课8个月,一周3节课,每节课2小时,晚上7点半到9点半直播,有回放可永久观看,老师答疑服务3年内有效。随到随学,最近一期5月20号开新班,正式课8月10号开始,现正上预科,前面直播回放都会提供。有一次免费转新班机会,可跟两期,案例不同。线上和线下所教知识点一样,案例完全不同,线上是老师专门为线上同学直播讲课。老师会带着做案例,布置作业并点评,指导从找素材到制作自己的作品,最后提供一对一作品集指导和就业服务。答疑服务和推荐就业不额外收费,一次性支付费用后无其他费用。"\n },\n {\n "intents": "实训项目",\n "answer": "线上课程也是用项目案例教学,按照项目组规范标准授课,规范模型制作流程,做出来的作品集符合企业用人标准,有对应的企业就业推荐。有学员仅报名线上也拿到了企业offer。鹰角是我们的投资方,有合作,但有学生因项目组要求不能宣传所以未发朋友圈。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "公司介绍",\n "answer": "点晴科技是我们的母公司,从事游戏制作;GGAC是一个有影响力的全球动漫美术赛事平台;ABOX是一个游戏行业外包平台;第九联盟是做游戏美术人才培训的。第九联盟母公司上海点晴科技曾受CCTV2财经频道邀请采访关于国产3A游戏的报道。我们持有办学资质,上海线下环境可在线上查看,有官方版本和内部录制版本。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报到流程",\n "answer": "您可以直接上9楼,找王浩老师,他会给您安排位置。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "学校里面所教的更多的是偏理论的知识点,跟企业的要求差距大。学校的老师资历深但没有企业实战经验,不清楚企业用人要求,所以教书本内容达不到就业水平,需要出来学习。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "公司介绍",\n "answer": "点晴科技是母公司,从事游戏制作;GGAC是全球动漫美术赛事平台;ABOX是游戏行业外包平台;第九联盟是游戏美术人才培训,母公司上海点晴科技受CCTV2财经频道邀请采访关于国产3A游戏的报道。"\n },\n {\n "intents": "3D角色建模",\n "answer": "销售介绍了角色建模和场景建模的学生作品和就业访谈。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户询问是否有UI动效方向的课程,销售回复目前有的方向是场景建模、角色建模、游戏特效、游戏动画、游戏开发,没有UI动效方向。用户又问有没有速成课程,销售表示速成不靠谱,并提到线上学习周期基本在8到10个月左右。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "这是上一期角色建模会讲到的案例,一共是五个阶段。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "上课安排",\n "answer": "家长,学生已经安排进班了,现在正在上课。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "宿舍地址",\n "answer": "宿舍问题,销售到教室门口找用户沟通。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "住宿咨询",\n "answer": "小邓同学右手边的学生王泰来和他一个公寓,可以认识一下,到时候一起回也行。王泰来是四川美院的学生。"\n },\n {\n "intents": "外卖地址",\n "answer": "从内部路出来之后,左手边加油站往左边走,有很多吃饭的地方,可以出来吃,或者点外卖。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "特效",\n "answer": "您可以通过联系销售老师(如第九联盟|晴天老师)咨询特效相关培训课程的报名事宜。"\n },\n {\n "intents": "课程咨询",\n "answer": "家长您好,关于游戏相关的培训课程,您可以联系销售老师(如第九联盟|晴天老师)进行详细咨询和报名。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "我们这边有女生的就业访谈,她们一般大一大二就开始学,学完之后通过校招的方式去游戏大厂实习。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户是一名家长,正在为高二的孩子咨询游戏设计方面的机构。孩子喜欢游戏并学习画画,但计划走大提琴艺考,上大学后再辅修设计。用户询问了游戏前沿地区(杭州、深圳),以及公司业务范围,并希望了解杭州、上海、深圳哪家机构靠谱。销售确认了用户线索,并指出用户孩子去年高一,今年高二。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户表示对3D角色建模方向感兴趣,并计划在本周或下周前往学校参观,去之前会提前通知销售。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报名流程",\n "answer": "用户报名3D场景建模(线上就业班)的流程为:首先填写个人信息收集表(包括姓名、报名日期、专业、学历、在读/毕业院校、当前大学就读年级、所在城市、出生日期、学习目的、电话、QQ、微信、身份证号码、学习方向等真实信息),用于申请合同。然后通过付费链接登录并支付,支付时需填写真实姓名并选择容容老师。支付完成后,销售会协助办理入学并申请合同。学生需按照合同提示操作并签字。合同签好后,需添加班主任(火火老师)的微信,班主任会负责开通课程权限、发送软件链接、拉学习群等后续事宜。销售已将学生对接至下一个班,但现阶段可以先跟着当前班级的预科课程学习打基础,后续若想进入新班也可以调整。"\n },\n {\n "intents": "上课安排",\n "answer": "用户咨询关于请假和课程安排的问题。销售回复称,已把用户对接至下一个班,但目前可以跟着当前班级的预科课程逐步学习打基础。如果当前班级能跟上,就留在该班;如果后续想进入后面的新班,也可以调整到新班。用户查看当前班级后认为跟不上,销售确认用户已被安排在下一个班,并建议从第一节预科课开始听。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "转介绍规则",\n "answer": "转介绍的有效期是14天,过了这个时间就不算转介绍了。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "就业推荐的企业不是随机的,是根据学生情况安排的。校招学生想去哪个企业都可以自由填报,和高考志愿填报原理类似。会有就业老师整理招聘信息并提供内推码,不限人数,学生都可以填报,而不是老师规定只能投递某个企业。薪资方面,校招进入大研发企业,基本起薪10k+;校招未进入大企业,进入中小企业起薪在5-10K;头部企业薪酬更高,十几二十几K都有。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "床位安排",\n "answer": "用户宿舍周末来了一个新室友,用户周末不在没见到,用户看到新室友的东西已经搬进来了。销售表示不清楚具体安排,并询问是否已经安排入住。"\n },\n {\n "intents": "交通咨询",\n "answer": "销售建议用户可以趁假期游玩附近城市,如苏州、杭州(高铁约1小时)、南京(约2小时)、上海,但需注意安全并做好攻略。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "试听课",\n "answer": "老师发的体验课需要听一下感觉怎么样。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "我们各个专业线上的课程都是13800元,线上学习周期是8到10个月,每周三次课。角色是几个专业中最卷的,集合了很多人体基础好的学生,如美院的雕塑、油画、造型等专业的学生。角色学习风格化和二次元都要学。"\n },\n {\n "intents": "线上直播教学",\n "answer": "我们支持线上授课。各个专业线上的课程都是13800元,线上学习周期是8到10个月,每周三次课。动作专业只有线下课程,没有线上。线下动作课程学费是36800元,6个月全日制。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "交通咨询",\n "answer": "附近有路线图,如果按照导航找不到,可以看看路线图。"\n },\n {\n "intents": "预约参观",\n "answer": "有老师接待,已经和老师打过招呼了,直接上三楼即可。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "同学如果还在看模型方向的话,老师可以找个试听给你感受一下。2026年场景试听链接:https://wangxiao.9artedu.com/#/courses/detail?id=100"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "用户表示想了解模型方向,并且之前没有接触过这块内容。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "退费咨询",\n "answer": "用户提供了退款所需的银行账户信息,包括账号、开户行、开户姓名、网点号、银行机构代码、网点名称、网点地址和联系电话。销售表示会处理,并通知用户来办手续。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "线下原画一期课程为6个月,费用是31800元,地址在上海。线上只有课程回放,没有直播课。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报名流程",\n "answer": "用户王智颖,报名日期为2026年7月27日,专业数字媒体艺术,本科学历,就读于重庆城市科技学院,大三,所在城市重庆,学习目的是对该行业感兴趣并希望从事相关工作,学习方向为场景建模。销售提供了学费付费链接,要求用户登录后退出再点击支付,填写姓名并选择容容老师。随后提供了入学合同,用户按提示操作提交后,销售申请用章并让用户签字。最后销售对接班主任,班主任负责学生的日常,授课老师负责上课和答疑指导,就业老师负责就业的指导和推荐。用户当前学习安排是先跟着前一个班的回放打基础,下个月中旬开新班,如果跟不上现班可转到新班。"\n },\n {\n "intents": "上课安排",\n "answer": "用户报名后,销售告知用户现阶段先跟着前一个班的回放往前学打基础,下个月中旬会开新班,用户会被放到下一个班。如果用户能跟上当前班就跟,跟不了的话可以到新班,每一期课程案例都不一样,相当于多打一些基础。此外,销售询问用户是否有平板,如果有就可以用平板听课同时用电脑做作品,如果没有就切屏。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户计划在8月十几号左右到校参观,并表示会在来的前几天提前通知销售。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "转介绍规则",\n "answer": "你推荐的学员入学满一个月后,我会给你申请转介绍费,会有800块。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "游戏特效",\n "answer": "我们没有专门做作品集的课。如果要报提升班,需要把作品发给老师看,确定按照短期的课程能够学出来才会安排。正常来说,线下的全日制课程6个月价格是36800。线上的学习周期是8~10个月,是直播课,上课时间是每周有三次课,每次课两个小时,价格是13800。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "寒暑假教学",\n "answer": "林伟同学的学习性质为寒暑假,他于2026年7月27日入学,学习方向为分镜动画,明天需要安排分镜动画的位置。保密培训统一在下周一进行,明天可以正常入学。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "用户想了解线上场景建模课程学习,销售方已提供课程大纲和公司介绍。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "线下场景建模地编课程大纲,学习3dmax/maya,zbrush,sp,八猴渲染器,ue5,ps等软件,正式课包括道具,硬表面,单体建筑物,ue地编、植被等阶段。正式课程周期7个月。课程包含场景建模和地编内容,两者有相通性。线下ue场景地编班由场景建模资产制作和ue地编课程方向两部分组成。线上场景建模课程周期8-10个月,学习软件相同,包括预科+正式课道具,载具,单体建筑物,ue环境4个阶段。线上课程费用13800元,线下课程费用36800元,寒暑假班(线上线下结合)费用36800元,线上课程附赠。线上课案例比线下简单,但知识点一致。线上课安排:预科一周2节课,4-8周;正式课8个月,一周3节课,每节课2小时,晚上7点半到9点半直播,有回放,永久可看,老师答疑服务3年内有效。课程结束有作品集辅导和就业推荐,包含在费用内。零基础可以学,从软件基础开始。"\n },\n {\n "intents": "游戏特效",\n "answer": "线上特效课程,学习3dmax,unity,ue,SD,ps等软件。学习1个来月unity特效,7个月ue特效,主修ue特效。课程周期8-10个月。线上特效班上课安排:预科一周2节课,4-6周,学习unity特效;正式课7个月,学习ue特效,一周3节课,每节课2小时,周二、周四、周六晚上7点半到9点半直播,有回放,永久可看,老师答疑服务3年内有效。线上课程费用13800元,官方统一定价。课程结束有一对一课程辅导和就业推荐,包含在费用内。零基础可以学。特效岗位相比地编更容易找实习,但学习难度更大。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "同学你好,线上和线下都是享有同等的就业推荐服务的。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "游戏特效",\n "answer": "线上特效班上课安排:预科一周2节课,4-6周,学习unity特效。正式课7个月,学习ue特效,一周3节课,每节课2个小时,周二、周四、周六晚上,都是晚上7点半到9点半直播,直播结束有回放,回放可以随时反复观看,有问题微信班级群里问老师,老师在线答疑。课程回放永久可看,老师答疑服务3年内都可以。课程周期8-10个月,学习3dmax,unity,ue,SD,ps等软件。学习1个来月unity特效,7个月ue特效,主修ue特效。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "动作/分镜",\n "answer": "游戏动画课程是线下正式课6个月的学习,主要学3dmax、maya等软件,先从动画原理与软件基础入门学习,后期主要练习掌握人物运动规律+作品集制作。动画师比较稀缺,课程直接安排到项目组中,由一线项目组动画老师带教,是实战学习模式,而非纯培训教学。上课会以表演形式帮助学生理解人物运动规律。"\n },\n {\n "intents": "校区分布",\n "answer": "线下校区目前在上海,武汉没有培训基地,但有项目分公司点晴科技。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "线上场景建模课程学习安排为预科一周2节课,共4-8周,正式课8个月,一周3节课,每节课2小时,晚上7点半到9点半直播,有回放可永久观看,老师答疑服务3年内有效。课程周期8-10个月,学习3dmax/maya、zbrush、sp、八猴渲染器、ue5、ps等软件,包括预科和正式课道具、载具、单体建筑物、ue环境4个阶段。课程费用为13800元,一次性缴清无额外收费。课程结束提交作品集审核通过的学生有就业推荐,测试面试有专业课老师和教务老师一对一辅导,老师也会辅导作品打磨。"\n },\n {\n "intents": "寒暑假教学",\n "answer": "针对在校大学生有线上加线下相结合的寒暑假班学习模式,平时在校通过线上直播课程学习,暑假到上海校区总部集中学习。寒暑假线下课程周期加起来共7个月,大概是三个暑假一个寒假或两个暑假两个寒假的时间。线上加线下学费为36800元,纯线下学习课程费用也是36800元。食宿自理,住宿由机构统一安排合作公寓,费用为1000-1100元一个月。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "就业咨询",\n "answer": "没有保就业这种说法,包就业是不合规的,国家不认可。真正有意义的就业规划是培养好学生的能力,我们提供的是推荐就业和作品集指导,只要作品做得好会尽可能推荐到好的公司。"\n },\n {\n "intents": "就业咨询",\n "answer": "想进腾讯动漫这类大公司,社招很难,需要3-5年工作经验,不招新人。培训班出来的大概率是进外包公司,积累经验后再通过社招进大厂。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "线上直播教学",\n "answer": "线上课程有场景建模、角色建模、特效、ue开发4个方向,费用均为13800元,课程结束提交作品集审核通过的学生有就业推荐。"\n },\n {\n "intents": "就业咨询",\n "answer": "线上课程结束后提交作品集审核通过的学生有就业推荐。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "报名流程",\n "answer": "报名流程如下:首先通过官网链接用手机号或微信号注册,注册后退出重新进入,可使用微信支付,若使用浏览器打开则可支付宝支付。缴费通过统一的官方支付链接进行。然后签署电子协议,协议通过企业微信小程序法大大签订,需输入手机号和身份证号提交,再签署姓名,后续出证步骤无需操作。电子协议永久保存,第三方平台可申请出证保护双方权益。最后可获取电子发票。"\n },\n {\n "intents": "寒暑假教学",\n "answer": "学生晏天乐的学习性质为寒暑假,入学时间为2026年7月28日,学习方向为场景建模地编。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "第九联盟的线下校区有上海、西安、青岛三个城市。线下场景建模地编课程学习3dmax/maya、zbrush、sp、八猴渲染器、ue5、ps等软件,正式课包括道具、硬表面、单体建筑物、ue地编、植被等阶段,正式课程周期7个月。线上场景建模课程周期8-10个月,学习软件与线下相同,包括预科+正式课道具、载具、单体建筑物、ue环境4个阶段。预科一周2节课,4-8周;正式课8个月,一周3节课,每节课2个小时,晚上7点半到9点半直播,直播结束有回放,回放永久可看,老师答疑服务3年内都可以。线上课程费用是13800元,官方统一定价。课程结束提交作品集审核通过的学生有就业推荐,测试面试也有专业课老师和教务老师一对一辅导。有试听课,试听链接为:https://wangxiao.9artedu.com/#/courses/detail?id=100。对于有基础的学生,可以安排进进阶进度学习的班级,大概三个月,但只有线下才有进阶进度的班。如果不在三个城市,寒暑假可以到上海学习。对于国外学生,可以考虑线上学习。"\n },\n {\n "intents": "3D角色建模",\n "answer": "线上角色建模课程周期8-10个月,学习maya、zbrush、sp、MD、xgen、八猴渲染器、ps等软件,包括预科+正式课角色道具、美型角色、二次元角色、写实角色4个阶段。预科一周2节课,4-8周;正式课8个月,一周3节课,每节课2个小时,晚上7点半到9点半直播,直播结束有回放,回放永久可看,老师答疑服务3年内都可以。线上课程费用是13800元,官方统一定价。两个课程都报没有优惠。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "宿舍地址",\n "answer": "宿舍地址是上海市徐汇区田林街道古井路32号。如果早上需要住宿,可以直接去这个公寓入住,公寓有负责人接待,到后说自己是第九联盟的学生,负责人会安排入住。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "游戏特效",\n "answer": "线上特效课程周期8-10个月,学习3dmax、unity、ue、SD、ps等软件。学习1个来月unity特效,7个月ue特效,主修ue特效。线上特效班上课安排:预科一周2节课,4-6周,学习unity特效;正式课7个月,学习ue特效,一周3节课,每节课2个小时,周二、周四、周六晚上7点半到9点半直播,直播结束有回放,回放可随时反复观看,有问题微信班级群里问老师,老师在线答疑。课程回放永久可看,老师答疑服务3年内都可以。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "校区分布",\n "answer": "我们的线下校区目前是:上海、西安,青岛 三个城市。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "床位安排",\n "answer": "老师发现用户宿舍只有一人居住,担心用户孤单,提出可以帮用户换到距离学校更近(约1.4公里)的宿舍。新宿舍环境和现宿舍一样好,有独立洗衣机,目前空余床位是上铺。用户之前充的水卡和电费可以退,房租也可以退。用户最终表示因为作业忙、六日回家,暂时不搬了,老师表示理解并建议用户添加宿舍老师微信以便后续联系。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "发票开具",\n "answer": "家长您好,孩子这边的报名手续已经办理好了,发票需要下午下班之前开出来给您。"\n },\n {\n "intents": "预约参观",\n "answer": "家长您好,请问是今天带着孩子一起过来吗?您说15分钟到,到了之后我们在三楼,您走进大门坐电梯到三楼即可。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "线下场景建模地编课程大纲包括学习3dmax/maya,zbrush,sp,八猴渲染器,ue5,ps等软件,正式课包括道具,硬表面,单体建筑物,ue地编、植被等阶段。正式课程周期为7个月。寒暑假场景建模班课程费用是36800元,官方统一定价。教学案例线下相对难一些,线上的教学案例相对简单一些,知识点完全一致。"\n },\n {\n "intents": "寒暑假教学",\n "answer": "我们有一个针对在校大学生的寒暑假班,采用线上加线下相结合的学习模式。平时在校期间通过线上直播课程学习,寒暑假时到上海校区总部进行线下学习。该班型只针对在校大学生开放,线上课程相当于附赠服务。线下寒暑假课程累计上课时间为7个月。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "试听课",\n "answer": "在2026年7月27日,万老师询问原画试听的学生是否结束,确认试听已结束,学员试听好了。"\n },\n {\n "intents": "公司介绍",\n "answer": "波总去接学员了,波总不在办公室。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "校区分布",\n "answer": "杭州没有校区,线下校区在上海,因为公司本身是一家大型的游戏美术制作实体公司,线下是在项目基地里学习的,没有到处单独只开办培训的。"\n },\n {\n "intents": "3D建模",\n "answer": "用户对3D建模感兴趣,销售询问用户是想线上还是线下学习,用户倾向线下,但杭州没有校区。销售进一步询问用户是在校大学生还是毕业了,以及喜欢场景还是角色建模。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "你可以自己选择跟角色建模的课程,和周老师讲你是从原画那边过来的,学习一下角色模型。"\n },\n {\n "intents": "2D原画",\n "answer": "原画那边已经排好位置了,你明天上午10点到总部这边。原画那边不需要准备什么。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "线上直播教学",\n "answer": "线上课程是在第九联盟官网的pc端进行直播教学,报名后线上教务老师会专门对接,手机登录也可以观看。课程采用晚上7点半到9点半直播的形式,直播结束有回放,回放永久可看。老师在线答疑,答疑服务3年内有效。"\n },\n {\n "intents": "3D场景建模",\n "answer": "线上场景建模课程周期8-10个月,学费13800元,学习3dmax/maya、zbrush、sp、八猴渲染器、ue5、ps等软件,包括预科+正式课道具、硬表面、单体建筑物、ue环境4个阶段。最近开课时间是8月17号,线上每隔3-5个月开一期新班,随报随学,报名后可以先看老班录播,新班开课后再转到新班跟完全部课程,且有一次免费转新班的机会。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "考勤打卡",\n "answer": "请假需要在钉钉中申请,并同步告知班主任。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "线下角色建模课程学习maya/3dmax、zbrush、sp、MD、xgen、八猴渲染器、ps、ue5,正式课包括角色道具、形体套装、风格化完整角色、写实完整角色4个阶段,正式课程周期7个月,学费36800元。"\n },\n {\n "intents": "就业咨询",\n "answer": "课程结束提交作品集审核通过的学生,我们是有就业推荐的。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报到流程",\n "answer": "用户到达3楼门口,销售确认用户是远中,并告知会有老师来接用户进入。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户胡婷钰已到达远中校区。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "线上直播教学",\n "answer": "针对孩子目前的情况,我们可以让他继续跟着线下教学走,但人不在教室,通过老师定期发送课程文件(录屏、资料)的方式学习,这些文件需要保密,不能外发。等他支教结束(约1月左右)后,再回到线下继续完成学习。"\n },\n {\n "intents": "就业咨询",\n "answer": "我们是就业课程,作品需要符合行业制作标准和流程,选案例前需提交老师确认。作品的考核会直接与就业推荐挂钩,作品最终需达到可供推荐工作的效果。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "公司介绍",\n "answer": "点晴科技成立于2013年,总部位于上海,目前公司总人员近700人,在全国设立了6家分公司,分别位于武汉、西安、厦门、青岛、合肥、漯河。作为腾讯、网易、UBI、米哈游、盛趣、巨人、游族等知名游戏开发商的核心供应商,点晴参与了无数热卖一线大作的美术制作,如:王者荣耀、阴阳师、和平精英、荒野行动、第五人格、天涯明月、决战平安京、绝地求生、终结者11、孤岛惊魂...连续3年成为腾讯游戏、网易游戏的最大数字资产、数字内容供应商,其数字艺术资产外包平台A BOX累计交易金额近2亿元,4万多人参与制作,完成超10万多套资产制作。"\n },\n {\n "intents": "就业咨询",\n "answer": "我们有一个专门的校招群,学完之后我们会根据你学出来的作品留用在我们公司或推荐就业。就业老师会在群里发各大企业的校招信息和内推码,等学完作品出来,我们就业老师都会辅助你们写简历、准备作品、面试、谈薪资到就业拿offer的。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户表示想要了解这个行业,并引荐了第九联盟的老师。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报到流程",\n "answer": "同学到达后,可先在蓝色长椅处等待,老师忙完手头工作后会过去。老师会询问姓名、学校及专业,并确认是否已到校区。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "UE美术相关的有场景建模地编和UE特效两个方向。线下场景建模地编课程大纲包括学习3dmax/maya、zbrush、sp、八猴渲染器、ue5、ps等软件,正式课包括道具、硬表面、单体建筑物、ue地编、植被等阶段,正式课程周期7个月。线下班学费36800元,线上班学费13800元。线下食宿费用额外自理,上海有宿舍,4人间6人间,900-1100元/月。"\n },\n {\n "intents": "就业咨询",\n "answer": "一般中等偏下的学生,第一份工作6000~9000元之间;中等偏上的学生,8000~12000元之间。如果对工作期待度很高,想要一毕业马上就拿很高的薪资是不太现实的。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "线下场景建模地编课程大纲包括学习3Dmax/Maya、ZBrush、SP、八猴渲染器、UE5、PS等软件,正式课包括道具、硬表面、单体建筑物、UE地编、植被等阶段,正式课程周期7个月,学费36800元。食宿费用额外自理,有宿舍,宿舍费用约900-1100元/月。"\n },\n {\n "intents": "3D角色建模",\n "answer": "线下角色建模课程大纲包括学习Maya/3Dmax、ZBrush、SP、MD、Xgen、八猴渲染器、PS、UE5等软件,正式课包括角色道具、形体套装、风格化完整角色、写实完整角色4个阶段,正式课程周期7个月。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户是一位准大一学生的家长,希望与老师交流孩子的学习方向和规划,并预约在今晚九点半后进行沟通。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户已到达远中校区。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户告知销售已到达,销售回复让用户来3楼,用户确认在三楼后,销售表示过来接用户。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户已到达远中校区。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "别再纠结线上能不能学出来啦,咱就是说只要愿意学,结果不会差。恭喜线上场景班李同学拿到网易实习offer,大写的牛。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "3D角色建模课程是CG行业的核心课程之一,主要教授使用Maya、ZBrush等软件进行角色建模、雕刻、贴图绘制等技能,适合对游戏、影视角色制作感兴趣的学生。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "特效",\n "answer": "线上特效课程周期8-10个月,学习3dmax、unity、ue、SD、ps等软件,学习1个来月unity特效,7个月ue特效,主修ue特效。线上特效班上课安排:预科一周2节课,4-6周,周二、周四晚上,学习unity特效;正式课7个月,学习ue特效,一周3节课,每节课2个小时,都是晚上7点半到9点半直播,直播结束有回放,回放可永久观看,有问题微信班级群里问老师,老师在线答疑,答疑服务3年内有效。学费13800元。线下特效课程正式周期6个月,学习3dmax/maya、ue5、unity、SD、ps等软件,5个月ue特效课程学习+1个月作品集制作,学费36800元。线上线下学习的软件、制作流程、课程阶段一致,线上班需要自律。线下总部在上海,西安有分公司,线上班是上海总部的老师授课。"\n },\n {\n "intents": "上课地点",\n "answer": "线下总部在上海,西安有分公司。线上班是上海总部的老师授课。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "电脑配置",\n "answer": "用户赵老师电脑的盒子没电了,打不开,已联系IT处理。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "退费咨询",\n "answer": "用户已向宿管老师办理退租,但宿管老师表示退租相关费用由销售方收取。销售方确认用户已办理退租,并建议用户离开线下学习后,可转为线上网课学习,同时销售方表示愿意在用户有作品时,私下帮助联系就业老师进行辅导。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "报到流程",\n "answer": "用户到达后,销售指导其先上三楼等待,并告知会有老师来找他。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "线上直播教学",\n "answer": "线上有场景建模、角色建模、特效和UE开发四门课程可供选择。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户表示已经到达西安校区,并希望参观校区及查看在学同学的作品。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "老师,这里。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户谢斐、逯思含、史天骄三人计划于2026年7月27日下午4点左右前往西安线下参观了解,销售已安排西安张老师接待并统一报备预约。"\n },\n {\n "intents": "3D建模",\n "answer": "西安线下有场景建模、角色建模、动作、特效4门课,下午4点过去不一定能试听,老师可以带你们参观了解,如果要试听试学,可以再约时间。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "上课安排",\n "answer": "特效二班结束时间不固定,学生可根据自己学校开学时间自行决定离校日期。需提前两天找班主任签休学通知单,并对接线上教务老师开通线上班课程。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "调价通知",\n "answer": "用户询问是否涨价,目前3D场景建模的费用需要进一步确认。"\n },\n {\n "intents": "3D场景建模",\n "answer": "用户询问3D场景建模的报名费用和试听课,以及住宿费用。目前3D场景建模的报名费用需要确认,试听课可以发送,住宿费用为每月一定金额,具体金额需进一步确认。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "调价通知",\n "answer": "不能原价再收单,因为调价后所有学生都是统一标准,一旦破例会失去信誉,也无法向已交36800的学生交代,以后价格标准就不好说了。建议跟学生好好说,早点报名、早点毕业入行赚钱,早一个月毕业差价就回来了。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "转介绍规则",\n "answer": "这是一个转介绍的客户,是老板朋友的孩子,13岁,想学二次元原画作为兴趣学习,不需要就业,可能断断续续学习。对方之前电话沟通过,需要安排试听,由万老师对接,费用上可以打一个小折。孩子已经到店试听,家长在楼下咖啡店等待,销售回来后需要和家长在大会议室沟通具体安排。"\n },\n {\n "intents": "二次元风格",\n "answer": "有一个13岁的孩子想学二次元原画,是兴趣学习,不喜欢就业方向,只是很喜欢这一块,可能断断续续学习。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "发票开具",\n "answer": "发票开具到公司需要提供曹恒睿的在职证明,并加盖公司公章。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户表示还没到楼里,并询问老师在哪,需要确认老师的位置或引导用户到达指定地点。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "住宿咨询",\n "answer": "是的,您可以直接去公寓签合同,介绍费会直接抵扣到学费里。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户已到达门口。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户告知销售赵老师大约二十分钟后到校区,销售回复好的,并告知会与班主任拉群沟通。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "特效",\n "answer": "一位升大三的数媒学弟想了解特效的线上和线下课程,他的微信号是xtao-778。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "开课安排",\n "answer": "目前线下课程的开班安排需要结合具体情况确认。用户提到上周才放假,因此具体开班时间需进一步沟通确定。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "线上场景建模课程学习3dmax/maya,zbrush,sp,八猴渲染器,ue5,ps等软件,包括预科+正式课道具,硬表面,单体建筑物,ue环境4个阶段。课程周期8~10个月,前1-2个月预科每周2节课,后8个月正式课每周一、三、五晚上7点半到9点半直播,有录播回放可永久查看,课程服务周期3年,可无理由重修一次,学费总价13800元。场景适合新人学习,就业方向包括游戏动漫、影视、广告、元宇宙、医疗、消防、航天等行业。"\n },\n {\n "intents": "公司介绍",\n "answer": "第九联盟和点晴是一家的,点晴是游戏美术制作公司,第九联盟是其100%控股的子公司,做CG人才孵化。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "试听课",\n "answer": "试听课安排在下午2点,地点在总部:徐汇区桂菁路7号3号楼。如果找不到地方,可以拨打联系电话17301891081。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "同学你到远中校区了嘛?同学你这边是迟到明天再来,还是就不来取消了,看到消息了和老师说一下。用户回复:不好意思老师 今天迟到了 可以明天再来吗。销售回复:好的。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "线上直播教学",\n "answer": "线上场景建模8月17号有新班,角色建模8月27号有新班。线上基本每隔4-5个月才会开一期新班。"\n },\n {\n "intents": "就业咨询",\n "answer": "近期报名我们线上班的学生名单可以看看,大多数大一大二在校生居多。本科生的薪资水平可以达到9000到1.3w。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报到流程",\n "answer": "同学你到远中校区了嘛?用户已签到。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "我们线下课程有场景建模ue地编方向,线上也有场景建模课程。线下学习7个月,周一到周五上课,上午9点半到12点,下午1点半到6点。线上学习8-10个月,预科案例一周2节课,4-8周,正式课8个月,一周3节课,每节课2小时,晚上7点半到9点半直播,有回放,课程回放永久可看,老师答疑服务3年内。线下学费36800元,线上学费13800元。线下总部在上海,西安有分公司,青岛分公司在山东省青岛市黄岛区长江中路519号建国大厦。"\n },\n {\n "intents": "就业咨询",\n "answer": "考虑就业的话,只要选择一个方向专精学习即可。在我们这里学习的90%是数媒、视传、动画、环艺等美术生相关专业的学生。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户提到他们改学西点,因为能给他们带来大的利益容量,还是利益驱动。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "线下角色建模课程周期为8-10个月,学习maya、zbrush、sp、MD、xgen、八猴渲染器、ps等软件。包括预科+正式课角色道具,美型写实角色,二次元角色,风格化角色4个阶段。线下角色建模课程大纲包括学习maya/3dmax、zbrush、sp、MD、xgen、八猴渲染器、ps、ue5。正式课包括角色道具、形体套装、风格化完整角色、写实完整角色4个阶段,正式课程周期7个月。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "用户告知到访时间改为15:30左右,销售确认可以。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "垃圾处理",\n "answer": "用户反馈垃圾投放处的指纹识别无法使用,显示‘非法指纹’。销售表示已反馈问题,会再次联系IT同步处理。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "二次元风格",\n "answer": "二次元原画那边是有位置的,但由于里面有一个抑郁症随时可能会自杀的学生,万老师担心我们学生进去会引起那个学生的情绪,所以暂时不能安排学习。另外,李老师带的4个学生中,有两个都是有情绪病的,不一定有精力带实训生。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "用户通过了联系人验证,销售主动询问用户是否想了解线上建模课程。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D角色建模",\n "answer": "线上角色建模课程周期8-10个月,学习maya,zbrush,sp,MD,xgen,八猴渲染器,ps等软件。包括预科+正式课角色道具,美型写实角色,二次元角色,风格化角色4个阶段。线上班每隔3~5个月开一期新班,随报随学。目前8月27号会开一个新班,现在报名会先开通老班课程权限,可先看录播学习,等开新班后转到新班从头到尾跟一遍8-10个月的课程。线上每一期班级课程案例都不一样,不会重复学习,报名学生有一次免费转新班的机会。"\n },\n {\n "intents": "开课安排",\n "answer": "线上班每隔3~5个月开一期新班,随报随学。目前8月27号会开一个新班。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "公益课程",\n "answer": "绘啦有免费课程,感兴趣可以自学。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "校区分布",\n "answer": "用户已到达远中校区。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "原画就业",\n "answer": "孩子被绘画专业录取,如果以后走原画,建议尽早开始学习,具体的开始时间和作品集产出时长需要根据课程安排和个人进度确定。原画起薪确实相对较低,2-3年后随着经验积累,工资水平会有显著提升,但具体数值因个人能力和市场变化而异。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "报到流程",\n "answer": "王魏然还没到,其他同学都已经到了。陈雅萱明天来。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "同学已经到达远中校区,销售确认同学已到校,准备进行后续安排。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "您好,Firmiana simple!请问有什么可以帮助您的?"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "课程咨询",\n "answer": "同学,看到你在官网了解线上学习。主要是不太清楚哪些内容,可以直接与我沟通。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "原画就业",\n "answer": "我们原画没涨价,报的话还是31800。"\n }\n ]\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": []\n}', '{\n "qa_pairs": [\n {\n "intents": "预约参观",\n "answer": "您已到达远中校区,请前往7号楼3楼参观。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "交通咨询",\n "answer": "1楼大厅沙发后面有电梯,坐电梯到3楼来。"\n }\n ]\n}', '{\n "qa_pairs": [\n {\n "intents": "3D场景建模",\n "answer": "抱歉,该对话中没有提供关于3D场景建模的课程介绍或用户提问信息。"\n }\n ]\n}'] + logger.info(f"总共:{summary_list}") logger.info(f"识别到意图数量:{len(summary_list)}") @@ -194,36 +196,16 @@ class HistoryIntent: check_text = TextIntent() text_extract = TextExtract() - new_summary_merged: Dict[str, List[str]]={} for key, value in summary_merged.items(): - if key in standard_intent: - logger.info(f"已存在标准意图:{key}") - continue + # 重排序,取最相近的2个 reranked_value:List[str] = await self.rerank_merged_intents(value, key) # 检查意图, 并返回最匹配的意图 - intent_key: str = await check_text.intent_message(str(reranked_value), key, intent_list) - logger.info(f"老的意图:{key},新的意图:{intent_key}, value:{reranked_value}") - if intent_key in standard_intent: - logger.info(f"已存在标准意图:{intent_key}") - continue - key = intent_key - # 跟标准进行重排序 - std_pairs = [[key, std] for std in standard_intent] - try: - std_scores = self.reranker.compute_score(std_pairs, normalize=True) - if isinstance(std_scores, list): - max_sim = max(std_scores) if std_scores else 0.0 - else: - max_sim = std_scores or 0.0 - if max_sim > 0.9: - top_idx = std_scores.index(max_sim) if isinstance(std_scores, list) else 0 - logger.info(f"key[{key}]与标准意图[{standard_intent[top_idx]}]相似度{max_sim:.3f}>0.9,跳过") - continue - except Exception as e: - logger.warning(f"标准意图重排序失败: {e},继续处理") - + # intent_key: str = await check_text.intent_message(str(reranked_value), key, intent_list) + # logger.info(f"老的意图:{key},新的意图:{intent_key}, value:{reranked_value}") + # + # key = intent_key reranked_value_tmp: List[str] = [] for answers in reranked_value: @@ -233,24 +215,25 @@ class HistoryIntent: reranked_value = reranked_value_tmp #从milvus中获取 milvus_content = await intent_repo.get_content_by_intent_category(key) - #合并 - merged = list(dict.fromkeys(reranked_value + milvus_content)) - if len(merged) > 2: - # 重新排序 - merged = await self.rerank_merged_intents(merged, key, top_k=1) + milvus_contents = [item["content"] for item in milvus_content] + milvus_review_contents = [item["review_content"] for item in milvus_content if item.get("review_content")] + print(key,reranked_value, milvus_contents, milvus_review_contents) + # 调用模型 将重排序结构 , milvus_content, 标准内容 传给大模型总结,优先提取将重排序内容结果然后加milvus_content, 标准内容 总结 + new_content = await text_extract.message_extract("\n".join(reranked_value), "\n".join(milvus_review_contents), "\n".join(milvus_contents)) + logger.info(f"key[{key}]最新总结:{new_content}") + insert_data = [] + + insert_data.append({ + "intent_category": key, + "content": "\n".join(milvus_contents), + "review_content": new_content, + "content_vector" : [0.0] * 1024 + + }) + if insert_data: + await intent_repo.upsert_intent_data(insert_data) + logger.info(f"key[{key}]入库完成,upsert {len(insert_data)} 条") - for content in merged: - insert_data = [] - batch_embeddings = await self.embedding_client.aembed_documents([content]) - if batch_embeddings: - insert_data.append({ - "intent_category": key, - "content": content, - "content_vector": batch_embeddings[0] - }) - if insert_data: - await intent_repo.upsert_intent_data(insert_data) - logger.info(f"key[{key}]入库完成,upsert {len(insert_data)} 条") logger.info(f"运行结束:{(time.time() - stime)}") @@ -437,8 +420,8 @@ async def build(day:str): if __name__ == '__main__': - start = datetime(2026, 7, 21) - end = datetime(2026, 7, 21) + start = datetime(2026, 7, 28) + end = datetime(2026, 7, 28) result = [] temp = start diff --git a/app/chat_qa/classification/text_intent.py b/app/chat_qa/classification/text_intent.py index 3706165..b291e28 100644 --- a/app/chat_qa/classification/text_intent.py +++ b/app/chat_qa/classification/text_intent.py @@ -5,56 +5,35 @@ from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import PromptTemplate from app.llm import llm -from app.repository.milvus.intent_classification_repository import IntentClassificationRepository intent_prompt = """ -你是一个专业的意图提取专家。请分析以下文本内容,并结合当前已有的意图标签,判断是否符合;若不符合则生成一个新意图,符合则直接返回原意图。 +你是一个意图分类专家。你的任务是根据给定的文本内容,判断它是否匹配当前意图。如果不匹配,则从意图列表中选择最合适的意图。 -## 输入说明 -- **文本内容**:`{text}` -- **目前的意图**:`{intent}`(可能为空) +## 输入信息 +- **文本内容**:{text}(可能为多段文本,需综合判断整体核心意图,而非逐段独立判断) +- **当前意图**:{intent}(可能为空) +- **意图列表**:{intent_list} -## 核心规则 +## 意图层级说明 +意图列表中存在层级关系,分类时须优先识别: +- **概括性意图**:能够涵盖多个独立的具体子意图,例如 `学习模式`(涵盖线上直播教学、线下面授教学)、`课程咨询`(涵盖费用、周期、内容等综合问题)、`提供服务` 等。 +- **具体意图**:描述单一、明确的独立事项,例如 `线上直播教学`、`线下面授教学`、`UE引擎开发`、`住宿咨询`、`上课时间` 等。 -### 1. 意图提取与对比规则 -- 首先从文本中提取1个核心意图(提取方法见下方“意图提取规则”)。 -- 将提取出的意图与给定的`{{intent}}`进行对比: - - 若两者**完全相同**(字符串完全一致),则最终输出意图为原意图`{{intent}}`。 - - 若两者不同,或`{{intent}}`为空,则最终输出意图为新提取的意图。 -- 无论采用原意图还是新意图,都必须来自或可扩充自“意图分类体系”。 +## 判断规则 +1. 如果当前意图为空,直接从意图列表中选择最匹配的意图。 +2. **多意图混合优先原则(最重要)**:仅当文本**同时涉及意图列表中两个或以上独立意图的实质性并列、对比或综合介绍**时,才优先选择能够概括这些内容的上层意图(如 `学习模式`、`课程咨询`)。**严禁**把单一意图内部的多维度展开(如某课程包含多个技术点、案例类型、学习阶段)误判为多意图混合。 +3. **当前意图保持的严格条件**:只有当文本内容**主要且专门**围绕当前意图展开,且**不涉及其他独立意图的实质性并列或对比内容**时,才保持当前意图不变。如果文本在匹配当前意图的同时,还明显涉及其他独立意图的对比、补充或并列说明,则必须重新从意图列表中选择最合适的概括性意图,**不得因当前意图非空而强行保持**。 +4. 如果文本内容与当前意图完全不匹配(包括语义偏差、主题不符、情感不一致等),从意图列表中选择最匹配的意图进行替换。 +5. 如果意图列表中没有完全匹配的意图,选择最接近的一个,**不要自行创造新意图**。 +6. 如果文本内容模糊、无法判断,选择当前意图(若为空则选择意图列表中的"其他"或第一个兜底意图)。 -### 2. 意图提取规则(用于从文本中提取核心意图) -- 若文本包含用户明确的问题,提取其核心诉求对应的意图。 -- 若文本为销售介绍/陈述内容,**聚焦于其最想传达的核心功能或核心信息**,提取总结性意图。**不得将补充说明信息(如附带提到的地点、时间等)误判为核心意图。** - - 例如:文本为“线上课程后期可以转到线下,我们线下校区在上海”,核心是“线上转线下”这一功能,而非“校区分布”,因此应扩充为“线上转线下”,而不是使用“校区分布”。 -- 意图必须基于实际内容,不编造。 -- 仅提取1个意图标签。 +## 分析步骤(必须执行) +1. **提取核心主题**:综合分析文本列表的整体核心主题,忽略边缘细节。 +2. **判定是否多意图混合**:检查文本是否涉及**意图列表中两个或以上独立意图**的并列、对比或综合。注意:单一意图内部的技术点、案例、学习阶段等展开**不构成**多意图混合。 +3. **层级匹配**:若确认为多意图混合,匹配概括性意图;若为核心单一意图,匹配最具体的意图。 +4. **对比当前意图**:如果当前意图不为空,检查当前意图是否能准确概括文本**整体**内容。若不能,则放弃当前意图,重新选择。 -### 3. 单意图选择规则(关键) -**只能输出一个意图标签,不能以顿号、逗号或“和”分隔多个意图。** - -当内容可能对应多个意图时,按以下优先级选择唯一意图: - -| 优先级 | 选择规则 | 说明 | -|-------|---------|------| -| **P0** | **优先匹配已有意图标签** | 必须优先从已有意图体系(含扩展示例)中选择最匹配的标签。**若已有标签中无准确对应,则按扩充规则创建新标签,严禁使用仅部分相关或语义模糊的已有标签。** 当销售单方面介绍课程内容(无用户明确提问)时,直接使用对应的主题标签(如“3D场景建模”),若主题为已有标签未覆盖的功能/服务(如“线上转线下”),则应扩充新标签,不得强行归类为“校区分布”等。 | -| **P1** | **核心诉求优先** | 选择最能代表文本核心诉求的意图,**忽略次要的补充信息**。例如:文本“线上课程可转线下,校区在上海” → 核心是“线上转线下”,而非“校区分布”;报名流程说明 → “报名咨询”,而非“线上直播教学”。 | -| **P2** | **主题维度优先于动作维度** | 当主题和动作诉求冲突时,优先选择主题维度。例如:3D建模费用 → “3D建模”(主题) | -| **P3** | **直接提及优先于间接关联** | 文本明确说出的核心意图优先于推断出的意图 | -| **P4** | **去重合并** | 多个子诉求属于同一类别时,只输出一个意图标签 | - -### 4. 意图分类体系(必须从中选择或基于其扩充) -{intent_list} - -**扩充规则:** 当文本核心意图无法被已有标签准确覆盖时,必须创建更精准的新标签。创建时: -- 新标签应简洁体现核心语义(如“线上转线下”)。 -- 严格对比已有标签,确保无重复语义。 -- **示例**:文本“线上课程后期可以转到线下” → 已有标签无对应,扩充为“线上转线下”;文本“原画好就业吗” → 扩充为“原画就业”。 - -### 5. 多意图处理 -若同一段文本明确涉及多个不重叠的核心意图,仅选择最能代表核心内容的1个意图。 - -## 输出格式要求 +## 输出要求 - 输出纯JSON,不要任何解释、不要markdown标记、不要注释 - 确保所有字符串用双引号包裹 - 输出格式固定为: diff --git a/app/chat_qa_query/query_graph.py b/app/chat_qa_query/query_graph.py index 54b5330..79eb91e 100644 --- a/app/chat_qa_query/query_graph.py +++ b/app/chat_qa_query/query_graph.py @@ -45,7 +45,7 @@ if __name__ == '__main__': archive_messages_mysql_repository = ArchiveMessagesRepository(db_session) qa_milvus_repository = QARepository() - state: QueryQAState = QueryQAState(original_query="电脑需要什么配置", history=['2026-07-10T15:42:13 EXTERNAL 我想学角色,我不知道能不能学,好不好学\n',"老师 现在原画好就业吗","好的,老师,你这边就业,是推荐就业吗?还是包就业呀"]) + state: QueryQAState = QueryQAState(original_query="学习原画好就业吗", history=['2026-07-28T17:37:14 EXTERNAL 还有 3D 场景建模的试听课,你发我一下。另外,住宿要多少钱呢?一个月\n']) context = QueryQAContext(meta_mysql_repository=archive_messages_mysql_repository, qa_milvus_repository=qa_milvus_repository ) diff --git a/app/chat_qa_query/query_nodes/node_rewrite.py b/app/chat_qa_query/query_nodes/node_rewrite.py index 2fcfef0..ba71825 100644 --- a/app/chat_qa_query/query_nodes/node_rewrite.py +++ b/app/chat_qa_query/query_nodes/node_rewrite.py @@ -216,64 +216,107 @@ problem_rewriting_prompt1 = """ 请直接输出JSON: """ problem_rewriting_prompt = """ +# 智能客服意图分类助手提示词 + 你是一名智能客服意图分类助手。你的任务是根据用户的历史会话和当前问题,提取用户的核心诉求,并输出标准化的意图标签。 ## 参数说明 + 本提示词需要动态传入以下参数: -- {query}:用户当前提问 -- {history_text}:历史会话记录(可为空) -- {intent_tags}:完整的意图标签列表,格式为JSON字符串数组,例如:["3D建模", "2D原画", "课程咨询", "就业咨询", ...]。**所有输出的意图标签必须严格从该列表中选择,不得自创或修改。** + +- `{query}`:用户当前提问 +- `{history_text}`:历史会话记录(可为空) +- `{intent_tags}`:完整的意图标签列表,格式为 JSON 字符串数组,例如:`["3D建模", "2D原画", "课程咨询", "就业咨询", ...]`。**所有输出的意图标签必须严格从该列表中选择,不得自创或修改。** + +--- ## 核心原则(必须严格遵守) ### 1. 双维度提取原则 + 每个用户问题通常包含两个维度的意图,必须分别识别: + - **课程/服务主题维度**:用户想咨询的具体课程类型或业务主题 - **诉求/动作维度**:用户想了解的方面(费用、就业、难度等) -这两个维度相互独立,必须同时提取,不得遗漏任何一个。最终输出的标签本身不区分维度,但模型内部需要判断每个标签的维度,以便后续优先级排序(见P3规则)。判断维度的方法:若标签名称中包含“咨询”、“怎么办”、“分布”等特征词,通常属于诉求/动作维度;否则多属于主题维度。请结合语义自行判断。 +这两个维度相互独立,必须同时提取,不得遗漏任何一个。最终输出的标签本身不区分维度,但模型内部需要判断每个标签的维度,以便后续优先级排序(见 P3 规则)。 + +**维度判定规则(必须按语义本质判断,禁止仅看标签字面后缀):** + +- **主题维度**:表示用户想学习的**具体课程类型、专业方向或业务领域**。 + 例如:`3D建模`、`3D场景建模`、`3D角色建模`、`2D原画`、`UE引擎开发`、`游戏特效`、`地编`、`技术美术`、`游戏动作/分镜`、`二次元风格`、`写实风格` 等。 + +- **诉求/动作维度**:表示用户**想了解什么、想做什么、担心什么、需要什么服务**。 + 例如:`课程咨询`(想了解课程信息)、`就业咨询`(想了解就业)、`学不会怎么办`(担心学习效果)、`试听课`(想要试听服务)、`退费咨询`(想退费)、`住宿咨询`(想了解住宿)、`校区分布`(想了解位置)、`分期付款`(需要付款方式)、`开班安排`/`开课安排`/`上课时间`(想了解时间安排)、`报名流程`/`报到流程`(想了解报名动作)、`作品评估`(需要评估服务)、`预约参观`(想要参观)、`购买建议`(需要建议)、`重修政策`/`转班咨询`/`休学咨询`(想了解售后政策)等。 + +**关键原则**:如果标签表达的是「用户的一个动作、需求、顾虑或服务请求」,即使标签名称中不含「咨询」「怎么办」等词,也必须判定为**诉求/动作维度**。禁止仅凭标签名称是否包含特定后缀来判断维度。 + +**中心语优先原则(强制)** + +在包含"的"字的偏正短语中(如"3D场景建模的试听课"、"角色建模的课程内容"),**"的"字后面的成分(中心语)代表用户的核心诉求**,"的"字前面的成分(定语)仅为主题限定。 +- 中心语(诉求维度)的优先级 **必须高于** 定语(主题维度)。 +- 出现顺序判定以**中心语**在短语中的位置为准,而非字面首个词。 + +--- ### 2. 并列结构强制拆分 + 识别以下并列模式并强制拆分: -- 顿号/逗号分隔:"A、B、C" → [A, B, C] -- "和/与/及/还有"连接:"A和B" → [A, B] -- 疑问词并列:"多少钱、怎么报名、有就业吗" → [多少钱, 怎么报名, 有就业吗] + +- 顿号/逗号分隔:`"A、B、C"` → `[A, B, C]` +- `"和/与/及/还有"` 连接:`"A和B"` → `[A, B]` +- 疑问词并列:`"多少钱、怎么报名、有就业吗"` → `[多少钱, 怎么报名, 有就业吗]` **规则**:拆分后,每个子项必须独立分析,不得合并。 -### 3. 意图识别置信度评分体系 -每个意图标签在输出前必须经过置信度评分,**只有总分≥60分的标签才会被输出**。 +--- -#### 评分维度: +### 3. 意图识别置信度评分体系 + +每个意图标签在输出前必须经过置信度评分,**只有总分 ≥ 60 分的标签才会被输出**。 + +#### 评分维度 | 评分维度 | 分值 | 触发条件 | 说明 | |---------|------|---------|------| -| **直接匹配** | **60分** | 用户问题中直接出现标签关键词或同义词扩展词(见第5节) | 关键词完全匹配或同义词匹配,直接给60分,超过阈值 | -| **语义关联** | **40分** | 用户表达与标签语义高度相关,通过语义场推断 | 语义场匹配给40分,需配合上下文支持达到阈值 | -| **上下文支持** | **20分** | 历史会话或当前上下文支持该意图推断 | 与语义关联配合:40+20=60分,刚好达到阈值 | +| **直接匹配** | **60分** | 用户问题中直接出现标签关键词或同义词扩展词(见第5节) | 关键词完全匹配或同义词匹配,直接给 60 分,超过阈值 | +| **语义关联** | **40分** | 用户表达与标签语义高度相关,通过语义场推断 | 语义场匹配给 40 分,需配合上下文支持达到阈值 | +| **上下文支持** | **20分** | 历史会话或当前上下文支持该意图推断 | 与语义关联配合:40 + 20 = 60 分,刚好达到阈值 | | **历史补全** | **10分** | 意图完全依赖历史会话补全 | 仅作为辅助加分,不单独使用 | -#### 阈值判定规则: -- **总分 ≥ 60分** → 进入候选池 -- **总分 < 60分** → 直接过滤,不进入候选池 -- 无任何意图≥60分 → 输出 `{{"intents": []}}` +#### 阈值判定规则 -### 4. 强制截断规则(新增) -**无论识别到多少个意图,最终输出最多只返回2个意图标签。** +- **总分 ≥ 60 分** → 进入候选池 +- **总分 < 60 分** → 直接过滤,不进入候选池 +- 无任何意图 ≥ 60 分 → 输出 `{{"intents": []}}` -当候选池中超过2个意图时,按以下优先级排序,只保留前2个: +--- + +### 4. 强制截断规则 + +**无论识别到多少个意图,最终输出最多只返回 2 个意图标签。** + +当候选池中超过 2 个意图时,按以下优先级排序,只保留前 2 个: | 优先级 | 排序规则 | 说明 | |-------|---------|------| -| **P1(最高)** | 当前问题直接明确表达的 > 历史会话补全的 | 用户当前明确说出的诉求优先 | -| **P2** | 总分高的 > 总分低的 | 置信度更高的优先 | -| **P3** | 诉求维度 > 主题维度 | 用户更关心“做什么”而非“是什么” | -| **P4** | 出现顺序靠前的 > 出现顺序靠后的 | 用户先说的一般更关心 | +| **P1(最高)** | 当前问题直接明确表达的 > 历史会话补全的 | 用户当前明确说出的诉求优先 | +| **P2** | 总分高的 > 总分低的 | 置信度更高的优先 | +| **P3** | 诉求维度 > 主题维度 | 用户更关心"做什么"而非"是什么" | +| **P4** | 核心诉求出现顺序靠前的 > 靠后的 | 同一子诉求内,中心语(诉求维度)优先于定语(主题维度);跨子诉求时,按子诉求在原文中的先后顺序 | -**截断规则**:排序后,只保留前2个,其余全部丢弃。 +**P4 执行细则(强制)** + +排序时必须严格遵循 P1 → P2 → P3 → P4 的层级顺序,**严禁跨层级比较**。即:仅当 P1、P2、P3 均相同或无法区分时,才启用 P4。 +在"主题+诉求"的复合表达(如"X的Y")中,Y(诉求维度)视为该子诉求的核心,其 P4 顺序位始终优先于 X(主题维度)。 + +**截断规则**:排序后,只保留前 2 个,其余全部丢弃。 + +--- ### 5. 语义同义词扩展匹配 -匹配时不仅使用标签字面本身,还必须覆盖常见的同义词扩展。以下为常见标签的同义词映射表(**当且仅当 {intent_tags} 中包含与下列标准标签完全同名的标签时,才可使用该扩展**;若传入的标签不在该表中,则根据标签字面及通用语义进行匹配,禁止编造扩展词): + +匹配时不仅使用标签字面本身,还必须覆盖常见的同义词扩展。以下为常见标签的同义词映射表(**当且仅当 `{intent_tags}` 中包含与下列标准标签完全同名的标签时,才可使用该扩展**;若传入的标签不在该表中,则根据标签字面及通用语义进行匹配,禁止编造扩展词): - **就业咨询**:就业、找工作、工作推荐、就业支持、就业服务、就业保障、就业率、包就业、毕业安排、工作分配、推荐工作、就业方向、职业发展、入职、岗位推荐、能就业吗、好找工作吗、就业情况、就业数据、薪资、工资待遇、收入水平 - **学不会怎么办**:学不会、跟不上、没基础、怕学不会、能不能学、能学会吗、学得会吗、适合我学吗、零基础能学吗、没经验能学吗、纯小白能学吗、好不好学、难不难、难吗、简单吗、容易学吗、好学吗、有难度吗、门槛高吗、有门槛吗、担心自己学不会、不知道能不能学会、怕跟不上、怕太难、上手难、学不进、听不懂、理解不了 @@ -284,46 +327,61 @@ problem_rewriting_prompt = """ - **校区分布**:校区、地址、在哪、位置、分布、哪个城市、怎么去、交通、附近 - **优势/竞争力**:优势、竞争力、为什么选你们、和其他机构比、口碑、排名、实力、师资、教学质量 -(若传入的标签列表包含上述标签以外的标签,同义词匹配将仅基于标签文字及通用语义,不得臆造扩展。) +(若传入的标签列表包含上述标签以外的标签,同义词匹配将仅基于标签文字及通用语义,不得臆造扩展词。) + +--- ### 6. 信息补全与语义保持 + - 如果当前问题缺少主语,从历史会话补全 - 不得改变用户原始意图,不得引入历史会话中不存在的新信息 - 不得遗漏当前问题中的任何关键诉求 +--- + ## 输出格式 -- 仅输出JSON,不要任何解释性文字 -- **最多只返回2个意图标签**,超出部分强制截断 -- 所有标签必须来自传入的 {intent_tags} 列表 -- 输出格式示例:`{{"intents": ["标签1", "标签2"]}}` (若候选为空则 `{{"intents": []}}`) + +- 仅输出 JSON,不要任何解释性文字 +- **最多只返回 2 个意图标签**,超出部分强制截断 +- 所有标签必须来自传入的 `{intent_tags}` 列表 +- 输出格式示例:`{{"intents": ["标签1", "标签2"]}}`(若候选为空则 `{{"intents": []}}`) + +--- ## 分析流程(必须按顺序执行) -### 步骤1:并列拆分 +### 步骤 1:并列拆分 将当前问题拆分为独立的子诉求。 -### 步骤2:双维度扫描 + 置信度评分 -对每个子诉求,扫描 {intent_tags} 中的标签,按照第3节和第5节计算总分。每个意图独立评分。 +### 步骤 2:双维度扫描 + 置信度评分 +对每个子诉求,扫描 `{intent_tags}` 中的标签,按照第 3 节和第 5 节计算总分。每个意图独立评分。 -### 步骤3:阈值过滤 -只保留总分≥60分的意图,进入候选池。 +### 步骤 3:阈值过滤 +只保留总分 ≥ 60 分的意图,进入候选池。 -### 步骤4:优先级排序(当候选池超过2个时) -按P1→P2→P3→P4规则排序。 +### 步骤 4:优先级排序(当候选池超过 2 个时) +按 P1 → P2 → P3 → P4 规则排序。 -### 步骤5:强制截断 -只保留排序后的前2个意图标签。 +### 步骤 5:强制截断 +只保留排序后的前 2 个意图标签。 + +### 步骤 6:完整性自检(输出前必须执行) -### 步骤6:完整性自检(输出前必须执行) - [ ] 每个子诉求是否都经过了置信度评分? -- [ ] 是否有总分≥60分的意图被遗漏? -- [ ] 最终输出是否≤2个标签? +- [ ] 是否有总分 ≥ 60 分的意图被遗漏? +- [ ] 最终输出是否 ≤ 2 个标签? - [ ] 截断时是否按优先级规则执行? -- [ ] 所有输出的标签是否都在 {intent_tags} 中? +- [ ] 所有输出的标签是否都在 `{intent_tags}` 中? +- [ ] 每个标签的维度判定是否基于语义本质而非字面后缀? +- [ ] 是否遵循了中心语优先原则("的"字短语中诉求维度优先于主题维度)? -如果任何一项为“否”,重新分析。 +如果任何一项为"否",重新分析。 -## 分类示例(假设传入标签列表包含:3D建模、3D角色建模、课程咨询、就业咨询、住宿咨询、退费咨询、学不会怎么办) +--- + +## 分类示例 + +(假设传入标签列表包含:`3D建模`、`3D角色建模`、`课程咨询`、`就业咨询`、`住宿咨询`、`退费咨询`、`学不会怎么办`、`试听课`、`3D场景建模`) ### 示例1(2个意图,无需截断) 历史会话:(空) @@ -356,7 +414,7 @@ problem_rewriting_prompt = """ - 诉求维度2:"不知道能不能学" → 语义关联(40) + 上下文支持(20) = 60分 → 候选池 - 诉求维度3:"好不好学" → 语义关联(40) + 上下文支持(20) = 60分 → 候选池(与上同标签,去重) - 候选池:["3D角色建模", "课程咨询", "学不会怎么办"],共3个,需截断 - - 排序:课程咨询(P1当前直接) > 学不会怎么办(P1当前直接) > 3D角色建模(P3主题维度) + - 排序:课程咨询(P1当前直接) > 学不会怎么办(P1当前直接) > 3D角色建模(P3主题维度) - 截断后保留前2个 分类结果: {{"intents": ["课程咨询", "学不会怎么办"]}} @@ -371,7 +429,7 @@ problem_rewriting_prompt = """ - "住宿" → 直接匹配"住宿咨询" = 60分 → 候选池 - "退费" → 直接匹配"退费咨询" = 60分 → 候选池 - 候选池共5个,需截断 - - 排序:课程咨询(P1当前直接,出现第2) > 就业咨询(P1当前直接,出现第3) > 住宿咨询 > 退费咨询 > 3D建模(P3主题维度) + - 排序:课程咨询(P1当前直接,出现第2) > 就业咨询(P1当前直接,出现第3) > 住宿咨询 > 退费咨询 > 3D建模(P3主题维度) - 截断后保留前2个 分类结果: {{"intents": ["课程咨询", "就业咨询"]}} @@ -381,12 +439,12 @@ problem_rewriting_prompt = """ - 用户:我想学3D建模 当前问题:多少钱、就业情况、住宿条件 分析: - - 主题维度:"3D建模"历史补全 = 10分 < 60分 → 不进入候选池 + - 主题维度:"3D建模"历史补全 = 10分 < 60分 → 不进入候选池 - "多少钱" → 直接匹配"课程咨询" = 60分 → 候选池 - "就业情况" → 直接匹配"就业咨询" = 60分 → 候选池 - "住宿条件" → 直接匹配"住宿咨询" = 60分 → 候选池 - 候选池:["课程咨询", "就业咨询", "住宿咨询"],共3个,需截断 - - 排序:课程咨询(P1,出现第1) > 就业咨询(P1,出现第2) > 住宿咨询(P1,出现第3) + - 排序:课程咨询(P1,出现第1) > 就业咨询(P1,出现第2) > 住宿咨询(P1,出现第3) - 截断后保留前2个 分类结果: {{"intents": ["课程咨询", "就业咨询"]}} @@ -395,11 +453,31 @@ problem_rewriting_prompt = """ 历史会话:(空) 当前问题:这个课有意思吗 分析: - - "有意思" → 语义关联"课程咨询" = 40分,无上下文支持 = 0分,总分40分 < 60分 → 不进入候选池 + - "有意思" → 语义关联"课程咨询" = 40分,无上下文支持 = 0分,总分40分 < 60分 → 不进入候选池 - 候选池为空 分类结果: {{"intents": []}} +### 示例 7(中心语优先 + P3 排序生效) +历史会话:(空) +当前问题:还有 3D 场景建模的试听课,你发我一下。另外,住宿要多少钱呢? +分析: + 拆分:[3D场景建模的试听课, 住宿要多少钱] + - 子诉求1:"3D场景建模的试听课" + - 主题维度:"3D场景建模" → 直接匹配 = 60分 → 候选池 + - 诉求维度(中心语):"试听课" → 直接匹配 = 60分,语义为「用户想要试听服务」→ 候选池 + - 子诉求2:"住宿要多少钱" + - 诉求维度:"住宿咨询" → 直接匹配 = 60分 → 候选池 + - 候选池:["3D场景建模", "试听课", "住宿咨询"],共 3 个,需截断 + - 排序: + - P1:三者均为当前直接表达,平级 + - P2:三者均为60分,平级 + - P3:试听课(诉求) = 住宿咨询(诉求) > 3D场景建模(主题) + - P4:试听课(子诉求1中心语)> 住宿咨询(子诉求2中心语)> 3D场景建模(子诉求1定语) + - 截断后保留前 2 个 +分类结果: +{{"intents": ["试听课", "住宿咨询"]}} + --- ## 现在请处理以下输入 diff --git a/app/chat_qa_query/query_nodes/node_search_embedding.py b/app/chat_qa_query/query_nodes/node_search_embedding.py index 7934f62..cc4d0cc 100644 --- a/app/chat_qa_query/query_nodes/node_search_embedding.py +++ b/app/chat_qa_query/query_nodes/node_search_embedding.py @@ -19,12 +19,12 @@ async def search_embed(state: QueryQAState): intent_class = IntentClassificationRepository() result: List[Dict[str, Any]] = await intent_class.search_by_intent_category(intent_category=rewritten_query, top_k=3) logger.info(f"原始问题:{original_query},改写后的问题:{rewritten_query},匹配结果:{result}") - + qa_pairs = [] for item in result: qa_pairs.append({ "intent_category": item.get("intent_category", ""), - "content": item.get("content", ""), + "content": item.get("content", "") + "," +item.get("review_content", ""), "score": item.get("score", 0) }) diff --git a/app/repository/milvus/intent_classification_repository.py b/app/repository/milvus/intent_classification_repository.py index 2b0a2c3..f8a5059 100644 --- a/app/repository/milvus/intent_classification_repository.py +++ b/app/repository/milvus/intent_classification_repository.py @@ -35,6 +35,7 @@ class IntentClassificationRepository: schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True) schema.add_field(field_name="intent_category", datatype=DataType.VARCHAR, max_length=128) schema.add_field(field_name="content", datatype=DataType.VARCHAR, max_length=65535) + schema.add_field(field_name="review_content", datatype=DataType.VARCHAR, max_length=65535) schema.add_field(field_name="content_vector", datatype=DataType.FLOAT_VECTOR, dim=1024) schema.add_field(field_name="created_at", datatype=DataType.INT64) @@ -51,6 +52,90 @@ class IntentClassificationRepository: index_params=index_params ) + return True + # 迁移 + def migrate_add_review_content(self) -> bool: + if not milvus_client.has_collection(self.collection_name): + logger.error(f"集合 {self.collection_name} 不存在,无法迁移") + return False + + temp_collection = f"{self.collection_name}_temp" + + if milvus_client.has_collection(temp_collection): + milvus_client.client.drop_collection(temp_collection) + + schema = milvus_client.client.create_schema( + auto_id=True, + enable_dynamic_field=True, + description="意图分类向量集合(迁移:新增review_content)" + ) + schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True) + schema.add_field(field_name="intent_category", datatype=DataType.VARCHAR, max_length=128) + schema.add_field(field_name="content", datatype=DataType.VARCHAR, max_length=65535) + schema.add_field(field_name="review_content", datatype=DataType.VARCHAR, max_length=65535) + schema.add_field(field_name="content_vector", datatype=DataType.FLOAT_VECTOR, dim=1024) + schema.add_field(field_name="created_at", datatype=DataType.INT64) + + index_params = milvus_client.client.prepare_index_params() + index_params.add_index( + field_name="content_vector", + index_type="HNSW", + metric_type="COSINE", + params={"M": 32, "efConstruction": 300} + ) + milvus_client.client.create_collection( + collection_name=temp_collection, + schema=schema, + index_params=index_params + ) + logger.info(f"创建临时集合 {temp_collection} 成功") + + all_data = [] + offset = 0 + batch_size = 1000 + while True: + batch = milvus_client.client.query( + collection_name=self.collection_name, + output_fields=["intent_category", "content", "content_vector", "created_at"], + limit=batch_size, + offset=offset + ) + if not batch: + break + all_data.extend(batch) + if len(batch) < batch_size: + break + offset += batch_size + + logger.info(f"查询到旧数据 {len(all_data)} 条,开始迁移") + + migrated = 0 + for i in range(0, len(all_data), batch_size): + batch = all_data[i:i + batch_size] + insert_batch = [] + for item in batch: + insert_batch.append({ + "intent_category": item.get("intent_category", ""), + "content": item.get("content", ""), + "review_content": "", + "content_vector": item.get("content_vector", []), + "created_at": item.get("created_at", 0) + }) + milvus_client.client.insert( + collection_name=temp_collection, + data=insert_batch + ) + migrated += len(insert_batch) + logger.info(f"迁移进度: {migrated}/{len(all_data)}") + + logger.info(f"数据迁移完成,共 {len(all_data)} 条") + + milvus_client.client.drop_collection(self.collection_name) + logger.info(f"旧集合 {self.collection_name} 已删除") + + milvus_client.client.rename_collection(temp_collection, self.collection_name) + logger.info(f"临时集合重命名为 {self.collection_name},迁移完成") + return True async def save_intent_data(self, data: List[Dict[str, Any]]) -> List[int]: @@ -61,6 +146,7 @@ class IntentClassificationRepository: insert_data.append({ "intent_category": item.get("intent_category", ""), "content": item.get("content", ""), + "review_content": item.get("review_content", ""), "content_vector": item.get("content_vector", []), "created_at": created_at }) @@ -107,6 +193,7 @@ class IntentClassificationRepository: data=[{ "intent_category": category, "content": content, + "review_content": item.get("review_content", ""), "content_vector": vector, "created_at": created_at }] @@ -128,7 +215,7 @@ class IntentClassificationRepository: result = milvus_client.client.query( collection_name=self.collection_name, filter=expr, - output_fields=["intent_category", "content", "created_at"], + output_fields=["intent_category", "content", "review_content", "created_at"], limit=top_k ) return result @@ -143,7 +230,7 @@ class IntentClassificationRepository: "metric_type": "COSINE", "efSearch": 300 }, - output_fields=["intent_category", "content", "created_at"] + output_fields=["intent_category", "content", "review_content", "created_at"] ) results = [] @@ -152,6 +239,7 @@ class IntentClassificationRepository: item = { "intent_category": hit.entity.get("intent_category"), "content": hit.entity.get("content"), + "review_content": hit.entity.get("review_content"), "created_at": hit.entity.get("created_at"), "score": hit.get("distance", 0) } @@ -171,14 +259,20 @@ class IntentClassificationRepository: all_categories = await self.get_all_intent_categories() return [c for c in all_categories] - async def get_content_by_intent_category(self, intent_category: str) -> List[str]: + async def get_content_by_intent_category(self, intent_category: str) -> List[Dict[str, str]]: result = milvus_client.client.query( collection_name=self.collection_name, filter=f'intent_category == "{intent_category}"', - output_fields=["content"], + output_fields=["content", "review_content"], limit=1000 ) - return [item.get("content", "") for item in result if item.get("content")] + return [ + { + "content": item.get("content", ""), + "review_content": item.get("review_content", "") + } + for item in result if item.get("content") + ] async def delete_today_data(self) -> int: today_start = int(datetime.now().replace(hour=0, minute=0, second=0, microsecond=0).timestamp()) @@ -199,16 +293,62 @@ class IntentClassificationRepository: logger.info(f"删除今日数据 {len(ids_to_delete)} 条") return len(ids_to_delete) + def sync_content_to_review_content(self) -> int: + result = milvus_client.client.query( + collection_name=self.collection_name, + output_fields=["id", "intent_category", "content", "review_content", "content_vector", "created_at"], + limit=10000 + ) + if not result: + logger.info("无数据需要同步") + return 0 + + updated = 0 + batch_size = 1000 + for i in range(0, len(result), batch_size): + batch = result[i:i + batch_size] + ids_to_delete = [] + insert_batch = [] + for item in batch: + ids_to_delete.append(item["id"]) + insert_batch.append({ + "intent_category": item.get("intent_category", ""), + "content": item.get("content", ""), + "review_content": item.get("content", ""), + "content_vector": item.get("content_vector", []), + "created_at": item.get("created_at", 0) + }) + milvus_client.client.delete( + collection_name=self.collection_name, + ids=ids_to_delete + ) + milvus_client.client.insert( + collection_name=self.collection_name, + data=insert_batch + ) + updated += len(insert_batch) + logger.info(f"同步进度: {updated}/{len(result)}") + + logger.info(f"content → review_content 同步完成,共更新 {updated} 条") + return updated + async def main(): milvus_client.init() repo = IntentClassificationRepository() - style_categories = await repo.delete_today_data() + + # 1. 首次部署:迁移新增 review_content 字段 + # success = repo.migrate_add_review_content() + # print(f"迁移结果: {success}") + + # 2. 将 content 同步写入 review_content + # count = repo.sync_content_to_review_content() + # print(f"同步完成,共 {count} 条") + + style_categories = await repo.get_style_intent_categories() print(style_categories) if __name__ == "__main__": - # today_start = int(datetime.now().replace(hour=0, minute=0, second=0, microsecond=0).timestamp()) - # print(today_start) import asyncio asyncio.run(main())