结果总结
为节省各位看官的时间,文章前半部分就先介绍本次探索的结果,后半部分再补充实现过程细节。这样不喜欢细节的可直接跳过细节部分。
核心目标是使用Doris 4.0 AI函数对游戏玩家聊天数据进行智能化挖掘,探索通过大模型能力实现聊天内容的自动化分类、情感分析、敏感信息处理等场景。
1. 已落地的分析场景
2. 实际应用价值
- 快速舆情监控:实时统计玩家情感倾向占比;
- 违规内容识别:自动标记RMT广告、拉人等黑产信息;
- 游戏问题发现:分类统计BUG反馈、玩法吐槽;
- 玩家行为洞察:提取热门讨论的游戏元素,为后续设计提供参考。
3.遇到三大核心挑战
4. 实践建议
- 数据采样:采用统计学抽样,控制处理规模;
- 质量监控:设置错误率阈值,触发人工复核;
- 成本控制:评估业务价值,优先处理关键数据。
探索过程
1. Doris AI能力介绍
Doris 从 4.0 版本开始,引入了AI函数能力。深度融合了AI 函数、文本搜索、向量搜索MCP智能交互能力,构建从数据存储、检索到分析的完整 AI 数据栈。
本文主要探索其中的AI函数模块。看看AI函数的具体应用能力与方向。
目前Doris 4.0 版本支持的AI函数主要支持的功能有:
- 自动识别用户意图,情感;
- 批量检测并处理敏感信息以确保内容合规问题;
- 文本内容进行自动分类或总结摘要;
- 对文本进行智能纠错或者提取关键信息。
AI 函数的具体应用能力底层是调用大语言模型进行文本功能处理。所有大语言模型必须在 Doris 外部提供。所有 AI 函数调用的结果和成本取决于外部AI供应商及其所使用的模型。
目前直接支持的厂商有:OpenAI、Anthropic、Gemini、DeepSeek、Local、MoonShot、MiniMax、Zhipu、Qwen、Baichuan。
若有不在上列的厂商,但其 API 格式与 OpenAI/Anthropic/Gemini 相同的, 在填入参数ai.provider_type时可直接选择三者中格式相同的厂商。 厂商选择只会影响 Doris 内部所构建的 API 的格式。
目前支持的函数列表:
- AI_CLASSIFY: 在给定的标签中提取与文本内容匹配度最高的单个标签字符串
- AI_EXTRACT: 根据文本内容,为每个给定标签提取相关信息。
- AI_FILTER: 判断文本内容是否正确,返回值为bool类型。
- AI_FIXGRAMMAR: 修复文本中的语法、拼写错误。
- AI_GENERATE: 基于参数内容生成内容。
- AI_MASK: 根据标签,将原文中的敏感信息用[MASKED]进行替换处理。
- AI_SENTIMENT: 分析文本情感倾向,返回值为positive、negative、neutral、mixed其中之一。
- AI_SIMILARITY: 判断两文本的语义相似度,返回值为 0 - 10 之间的浮点数,值越大代表语义越相似。
- AI_SUMMARIZE: 对文本进行高度总结概括。
- AI_TRANSLATE: 将文本翻译为指定语言。
- AI_AGG: 对多条文本进行跨行聚合分析。
下面,我们以DeepSeek的chat模型为例,抽取部分函数进行探索。
2. 配置AI资源
2.1 创建AI资源
CREATE RESOURCE 'model_deepseek_chat'
PROPERTIES (
'type'='ai',
'ai.provider_type'='deepseek',
'ai.endpoint'='https://api.deepseek.com/chat/completions',
'ai.model_name' = 'deepseek-chat',
'ai.api_key' = 'sk-65**************************83'
);
Doris 通过资源机制 集中管理 AI API 访问,保障密钥安全与权限可控。 现阶段可选择的参数如下:
type: 必填,且必须为 ai,作为 ai 的类型标识。
ai.provider_type: 必填,外部AI厂商类型。
ai.endpoint: 必填,AI API 接口地址。
ai.model_name: 必填,模型名称。
ai_api_key: 除ai.provider_type = local的情况外必填,API 密钥。
ai.temperature: 可选,控制生成内容的随机性,取值范围为 0 到 1 的浮点数。默认值为 -1,表示不设置该参数。
ai.max_tokens: 可选,限制生成内容的最大 token 数。默认值为 -1,表示不设置该参数。Anthropic 默认值为 2048。
ai.max_retries: 可选,单次请求的最大重试次数。默认值为 3。
ai.retry_delay_second: 可选,重试的延迟时间(秒)。默认值为 0。
2.2设置默认资源(可选)
SET default_ai_resource = 'model_deepseek_chat';
3. AI函数使用
3.1 基础支撑
原始聊天数据表结构:
构建AI处理后的结果存储表:
设置部Doris分列更新:
set enable_insert_strict=false;set enable_unique_key_partial_update=true;
3.2 情感分类函数:AI_CLASSIFY
将玩家的聊天内容进行情感分类:积极(positive),消极(negative),中性(neutral),混合(mixed)。
insert into dwm_event_message (event_date,event_time,event_id,message,sentiment) SELECT event_date,event_time,event_id,message, AI_SENTIMENT(message) AS sentiment from ods_event_message where event_date='2025-11-30';
结果:144条游戏聊天数据运行了3分钟41秒,其中存在些许分类错误的情况。
统计负面信息或者正面信息占比:
select count(*) as "聊天信息总数", round(count(case when sentiment='negative' then 1 else null end)/count(*),4) as "负面占比",round(count(case when sentiment='positive' then 1 else null end)/count(*),4) as "正面占比" from dwm_event_message
快速查询所有各个分类信息:
#查询负面信息
select message from dwm_event_message where sentiment='negative'
#查询正面信息
select message from dwm_event_message where sentiment='positive'
3.3 分类标签函数:AI_CLASSIFY
将玩家的聊天内容进行指定标签分类:寻找队友,吐槽玩法, 赞扬游戏, RMT广告,游戏黑产拉人,诈骗信息,萌新求助,遇见BUG。
insert into dwm_event_message (event_date,event_time,event_id,message_id,message,classify) SELECT event_date,event_time,event_id,message, AI_CLASSIFY(message, ['寻找队友','吐槽玩法', '赞扬游戏', 'RMT广告','游戏黑产拉人','诈骗信息','萌新求助','遇见BUG']) AS classify from ods_event_message where event_date='2025-11-30';
结果:144条游戏聊天数据运行了3分钟59秒
根据标签获取对应聊天内容:
select message from dwm_event_message where classify='吐槽玩法'
select message from dwm_event_message where classify='游戏黑产拉人'
select message from dwm_event_message where classify='遇见BUG'
3.4 提取特定标签函数:AI_EXTRACT
用于从文本中提取特定标签对应的信息。该函数在当前探索的场景用处较小,因为在玩家的聊天信息里提取标签似乎意义不大。其主要是在新闻,论文,推文等类型的文本中发挥作用较大。
以下作为一个示例,从用法和结果出发,展示该函数的具体应用。
例如,我本次分析关注玩家对boss,地图,技能,装备的讨论重点。 于是可以从玩家的聊天信息中提取出所有提到的boss、地图、技能、装备等标签。
insert into dwm_event_message (event_date,event_time,event_id,message,`extract`) SELECT event_date,event_time,event_id, message, AI_EXTRACT(message, ['boss','map','skill','equipment']) AS `extract` from ods_event_message where event_date='2025-11-30';
结果:144条游戏聊天数据运行了4分钟50秒
3.5 文本过滤:AI_FILTER
根据给定条件对文本进行过滤,判断文本是否符合条件。返回值为bool类型。从而实现根据语义对文本进行过滤。
当我们仅仅想要获取一次玩家负面的聊天信息时,我们可以使用该函数对玩家的聊天内容进行过滤,查询负面的聊天信息。
SELECT event_date,event_time,event_id,message from ods_event_message where event_date='2025-11-30' and AI_FILTER('model_deepseek_chat', CONCAT('玩家遇到BUG,或者不认同游戏玩法从而对游戏情感到消极而输出负面的消息:',message));
结果:144条游戏聊天数据运行了4分钟50秒
4.结果探讨
其他AI函数都是同样的使用方式,关键在于使用者的分析和挖掘目标,只要明确了分析和挖掘目标,就可以根据AI函数的结果进行后续的分析和挖掘。
同时,在上面几个例子中也暴露出一些使用上会遇到的困难,总结起来主要包含以下几点:
- 数据清洗速度: 由于AI函数底层是调用大模型的API,处理速度较慢,因此在对大规模数据进行处理时,需要考虑到数据清洗的时间成本。
- 处理效果: 由于聊天信息文本的语义比较依赖上下文环境,单条文本的处理效果有时不是很理想。准确率难以保证。
例如联盟盟主拉人进盟的聊天,由于在调用AI时,缺少上下文的支撑,大模型直接识别人游戏黑产拉人。导致分类错误。 - 成本考虑: 少量文本成本可控,生产环境中的聊天信息动辄十亿百亿条,全量清洗估计hold不住模型的token成本。
以下针对上面几点问题给出解决方案参考:
- 清洗速度问题:
- 若是Doris内部进程请求AI大模型的的并发不足,则可以自己写脚本增加并发处理,加快效率。(不然只能挂在后台慢慢跑了)
- 若是海量数据处理效率低,可考虑对游戏服进行随机抽样,只处理随机选中的部分游戏服数据。从统计学上讲,结果依然具备全局解释能力。
- 处理效果问题:
- 使用自定义脚本处理,这样能够进行自定义Prompt,给出部分聊天上下文相关信息,给大模型提供更多的信息支撑。缺点是这样会脱离Doris的处理框架,虽然增强了自定义的能力,但工作量增多。流程复杂。
- 通过随机抽样的方式,在每个游戏服随机抽取部分样本,用于判断AI的清洗结果错误率,当错误率达到阈值时,采用人工脚本增强Prompt的方式重新清洗数据。
- 成本问题:
- 自己部署轻量级大模型,例如使用ollama部署一些轻量级的deepseek蒸馏版本。再使用one-api等开源工具提供api给Doris或者脚本调用。