如果只允许用一个语言模型来做体育问答,会发生什么?你大概会得到一个聊起来很顺畅的助手:能解释越位,能复述比赛经过,能对一名球员的风格发表看法。可一旦你问“这名前锋最近8场的射门转化率是多少”,它要么凭印象给一个像样的数字,要么承认自己不知道。前一种答案危险,后一种答案没用。半岛体育官网把体育搜索、数据分析和知识图谱放进同一个AI系统,并不是为了把功能摆得更多,而是因为这三件事各自解决的是不同性质的问题,任何一个单独拿出来,都撑不起“可靠地回答体育问题”。

只用一个语言模型,会在哪里出错

先看三个具体的失败方式。它们不是模型“不够聪明”,而是任务与工具的错配。

算错:把计算当成语言任务

语言模型生成的是下一个最可能出现的词。当问题是“球员A最近10场场均得分”,它很可能生成一个看起来合理的数字,比如“大约在二十分上下”。但真实的数字来自10个具体比赛记录的求和与相除,这是一个确定性的过程,需要读取数据,而不是估计语言分布。让模型代替数据库做这件事,输出的是猜测。

连错:把关系当成文本

问“某教练执教期间,后来又效力另一支球队的球员有哪些”,答案取决于教练的任职区间、每名球员的效力区间,以及两个区间是否有重叠。语言模型可能记得某几位球员和某位教练的故事,但它无法保证列表完整,也无法保证每一条关系的起止时间准确。缺一个人,模型不会告诉你缺了。

过时:把训练时的知识当成现在的事实

语言模型的知识停留在训练截止时间,而体育数据每天都在更新。“球队本赛季目前排名第几”“某球员是否已经转会”这类问题的答案,会在几天内改变。一个不读取最新数据的系统,答案的时效是无法保证的。

这三种失败背后是同一个道理:不同的问题需要不同性质的能力。文本理解是语言模型的强项,精确统计是数据库和计算引擎的强项,关系与时间推理是图结构的强项。把三项都压给一个模型,等于让一个擅长写作的人同时兼任会计和档案员。

半岛体育官网里的四个部件,各管一件事

我们的思路是把一个体育问题拆开,让每种能力处理它最擅长的那部分。半岛体育官网上介绍的这套系统由四个协作的部件构成,下表列出了它们各自的职责与边界。

部件 负责什么 不该负责什么典型输入输出
体育搜索理解用户在找什么,判断问题类型,从文本资料中检索规则、背景、报道不直接给出统计数字 输入:自然语言问题;输出:问题类型、候选文本、需要的数据范围
数据分析引擎 读结构化数据库,做过滤、排序、聚合、窗口计算 不解释含义,不猜测缺失数据 输入:明确的查询条件;输出:表格结果与计算依据
知识图谱 保存球员、球队、教练、比赛之间带时间区间的关系,支持多跳查询 不做大规模数值聚合输入:实体与关系条件;输出:满足条件的实体集合及有效时间
大模型 理解问题、拆解条件、选择工具、把结果写成人话不凭记忆产出数字,不绕过数据直接回答 输入:用户问题与各部件返回的结果;输出:带条件说明的回答

看这张表时,不妨注意“不该负责什么”那一列。系统设计里最重要的往往不是每个部件能做什么,而是明确它不做什么。搜索部件不给数字,是因为文章里的数字会过期;数据引擎不解释含义,是因为解释需要背景;图谱不做聚合,是因为把上万条记录放进图里求平均既低效又容易出错;大模型不绕过数据,是因为这正是前面那三种失败的根源。

一个混合问题,怎样在四个部件之间流转

用一个虚构的示例来看协作。用户问:“示例队甲换帅之后,球员B的出场时间变化了多少?另外,换帅前后教练的阵型偏好有什么不同的说法?”这是一个把两类问题混在一起的问句,恰好可以看出为什么需要分工。所有数字都是示例数据。

  1. 大模型拆句。把问句拆成两部分:一部分是数值问题(出场时间变化),另一部分是文本类问题(关于阵型偏好的说法)。同时识别出时间条件“换帅之后”,需要先确定一个具体日期。
  2. 图谱确定时间边界。向图谱查询“示例队甲的教练任职记录”,得到新教练任职起始日为 2026-01-10(示例)。这一步返回的是一个日期,而不是一段文字。
  3. 数据引擎计算变化。拿着这个日期,数据引擎分别计算球员B在任职前10场和任职后10场的场均出场分钟数,返回两个数字与所用的场次列表:任职前示例值 72,任职后示例值 81。
  4. 搜索部件找文本。对于阵型偏好的“说法”,从赛后报道和战术分析文章中检索相关段落,并把它们标记为“评论性资料”。
  5. 大模型合成回答。把数值结果写成一句话,附上口径和场次范围;把文本资料单独放在一个段落,并明确标注“以下为文章观点,并非统计结果”。

整个过程里,每个数字都有明确的来源部件,每一段文字也标明了是数据还是观点。用户读到回答时,可以区分出哪部分是被计算出来的,哪部分是被引用的。如果只有一个语言模型,这两类内容会被融合成一段流畅的文字,界限被抹平了。

真正难的是部件之间的交接

把系统拆成四个部件之后,麻烦并没有消失,只是从“单个部件够不够强”变成了“交接处会不会掉东西”。我们在设计时发现,交接处至少有三个必须约定清楚的“契约”。

实体必须用编号交接,而不是名字

语言模型识别出“球员B”之后,交给数据引擎和图谱的应当是一个 player_id,而不是一个字符串。否则同名球员会在下游被各自解析,可能出现图谱里是一个人、数据表里是另一个人的情况。这个问题我们在同名球员怎么办里详细谈过,官网的系统设计遵循同一个原则:实体先确认,再查数据。

时间必须用具体区间交接,而不是词语

“换帅之后”“最近一个月”“本赛季”都是相对表达。交给下游之前,必须被换算成开始日期与结束日期的明确区间,并且带上换算所依据的基准日。否则数据引擎和图谱各自理解“最近”,结果无法对齐。

指标必须用口径条目交接,而不是名称

“转化率”“出场时间”“助攻”在不同数据来源里定义不同。系统内部用指标条目来传递:名称、公式、适用范围。这样即便用户换了说法,比如“效率”,被解析到同一个条目,最终的计算也是同一套。

这三份契约看起来像是无聊的工程细节,但决定了系统是不是可靠。一个部件的输出如果无法被下一个部件无歧义地读取,整个链路的答案就会在某个环节悄悄偏移,而且很难被发现。关于如何让语言模型在这些环节里选对工具,可以参考体育大模型为什么需要工具调用。

为什么不干脆做成三个互不相干的工具

一个自然的疑问是:既然搜索、数据分析、图谱各有专长,为什么不做成三个独立的入口,让用户自己选?原因在于,用户提问时通常并不知道自己的问题属于哪一类。“示例队甲换帅之后进攻变好了吗”看起来是一句话,实则同时需要教练任职时间(图谱)、比赛数据(数据引擎)和对“进攻变好”的口径定义(需要与用户确认,可能用到背景文本)。让用户先判断该用哪个工具,等于把系统设计里最难的一步转嫁给了用户。

放进同一个系统的另一个好处,是三个部件可以共用同一套实体编号、时间约定和指标口径。搜索里识别出的球员,与图谱里的球员是同一个 player_id;图谱给出的任职区间,可以直接作为数据引擎的过滤条件;数据引擎的计算依据,可以原样显示在回答里。共用这些底层约定,比让三个独立产品各说各话再由用户自己核对,要少出很多错。也正因如此,我们在半岛体育官网上把这三类能力放在同一个体系下介绍,而不是各自为政。

多部件协作的代价,我们也要如实说

在半岛体育官网上介绍这套系统时,我们也不想只说好处。分工合作有一些实实在在的代价。

  • 链路更长,延迟和出错点都增加。一个问题要经过解析、查询、校验、生成几步,任何一步失败,都需要有明确的降级方式。比如图谱查询不可用时,系统应当告诉用户“关系类条件暂无法验证”,而不是悄悄跳过。
  • 需要维护多套数据。数据库、图谱、文本库的更新节奏各不相同,如果它们对同一个事实的版本不一致,回答会自相矛盾。这要求有统一的实体编号和更新时间标注。
  • 问题类型判断本身可能出错。如果把一个需要统计的问题误判成文本问题,系统会去检索文章而不是查数据。所以类型判断之后仍需要校验,例如凡涉及具体数字的回答,必须能指向数据引擎的输出。
  • 不是所有问题都值得走完整流程。问“越位规则是什么”,直接检索规则文本就够了,启动整套链路只会浪费时间。系统需要根据问题类型选择最短的可靠路径。

需要说明的是,半岛体育官网本身是一个静态展示站点,本文描述的是产品的设计思路与协作原则,并不表示这里已有一个开放使用的在线查询系统。具体的问答步骤,可以在半岛体育官网的数据问答流程一文中逐步看到。

系统的可靠性来自分工,而不是某个更强的模型

回到最初的问题:为什么要把搜索、数据分析和知识图谱放进同一个系统?因为体育问题不是一种问题。它有时是在找一段规则文本,有时是在算一个窗口内的平均值,有时是在沿着教练和球员的关系走几步,更多时候是这三者的混合。一个系统如果只擅长其中一种,就会在另外两种上用同一种手段去硬撑,结果是回答看起来都很流畅,可靠性却参差不齐。

我们更愿意把语言模型看作一名负责沟通的协调者:它听得懂问题,知道该找谁,最后能把各方给出的结果整理成清楚的话;但它不替数据库算数,也不替图谱记关系。这样的设计并不保证零错误,因为数据本身会有缺失,实体识别也会有歧义,但每一处出错的位置更容易被定位,每个数字也更容易追溯来源。对于一个想回答体育数据问题的系统来说,能被检查,比显得聪明更重要。如果你想从栏目层面了解这套分工,可以到半岛体育AI大模型页面继续阅读。