1. 什么是世界杯竞猜智能体
世界杯竞猜智能体是一个基于大语言模型的 AI 应用,它能够:
- 理解用户关于世界杯赛事的提问;
- 结合实时数据或历史资料输出竞猜建议;
- 模拟分析对阵双方的优劣势,给出有理有据的预测。
本质上,它是一个集 知识检索、推理规划、工具调用 于一体的智能代理。
2. 技术栈选型
构建这样一个智能体,推荐以下技术组合:
| 大模型 | OpenAI GPT-4o / 文心一言 / 通义千问 |
| 智能体框架 | LangChain / LangGraph |
| 数据源 | 维基百科 API、实时比分 API |
| 向量存储 | Chroma / FAISS(用于历史数据检索) |
| 前端 | Streamlit / Gradio(快速搭建交互界面) |
3. 智能体核心设计
3.1 整体架构
#mermaid-svg-bLQJXlvjiXPG6XI3{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bLQJXlvjiXPG6XI3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bLQJXlvjiXPG6XI3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bLQJXlvjiXPG6XI3 .error-icon{fill:#552222;}#mermaid-svg-bLQJXlvjiXPG6XI3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bLQJXlvjiXPG6XI3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bLQJXlvjiXPG6XI3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bLQJXlvjiXPG6XI3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bLQJXlvjiXPG6XI3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bLQJXlvjiXPG6XI3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bLQJXlvjiXPG6XI3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bLQJXlvjiXPG6XI3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bLQJXlvjiXPG6XI3 .marker.cross{stroke:#333333;}#mermaid-svg-bLQJXlvjiXPG6XI3 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bLQJXlvjiXPG6XI3 p{margin:0;}#mermaid-svg-bLQJXlvjiXPG6XI3 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-bLQJXlvjiXPG6XI3 .cluster-label text{fill:#333;}#mermaid-svg-bLQJXlvjiXPG6XI3 .cluster-label span{color:#333;}#mermaid-svg-bLQJXlvjiXPG6XI3 .cluster-label span p{background-color:transparent;}#mermaid-svg-bLQJXlvjiXPG6XI3 .label text,#mermaid-svg-bLQJXlvjiXPG6XI3 span{fill:#333;color:#333;}#mermaid-svg-bLQJXlvjiXPG6XI3 .node rect,#mermaid-svg-bLQJXlvjiXPG6XI3 .node circle,#mermaid-svg-bLQJXlvjiXPG6XI3 .node ellipse,#mermaid-svg-bLQJXlvjiXPG6XI3 .node polygon,#mermaid-svg-bLQJXlvjiXPG6XI3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bLQJXlvjiXPG6XI3 .rough-node .label text,#mermaid-svg-bLQJXlvjiXPG6XI3 .node .label text,#mermaid-svg-bLQJXlvjiXPG6XI3 .image-shape .label,#mermaid-svg-bLQJXlvjiXPG6XI3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-bLQJXlvjiXPG6XI3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bLQJXlvjiXPG6XI3 .rough-node .label,#mermaid-svg-bLQJXlvjiXPG6XI3 .node .label,#mermaid-svg-bLQJXlvjiXPG6XI3 .image-shape .label,#mermaid-svg-bLQJXlvjiXPG6XI3 .icon-shape .label{text-align:center;}#mermaid-svg-bLQJXlvjiXPG6XI3 .node.clickable{cursor:pointer;}#mermaid-svg-bLQJXlvjiXPG6XI3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bLQJXlvjiXPG6XI3 .arrowheadPath{fill:#333333;}#mermaid-svg-bLQJXlvjiXPG6XI3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bLQJXlvjiXPG6XI3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bLQJXlvjiXPG6XI3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bLQJXlvjiXPG6XI3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bLQJXlvjiXPG6XI3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bLQJXlvjiXPG6XI3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bLQJXlvjiXPG6XI3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bLQJXlvjiXPG6XI3 .cluster text{fill:#333;}#mermaid-svg-bLQJXlvjiXPG6XI3 .cluster span{color:#333;}#mermaid-svg-bLQJXlvjiXPG6XI3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bLQJXlvjiXPG6XI3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bLQJXlvjiXPG6XI3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-bLQJXlvjiXPG6XI3 .icon-shape,#mermaid-svg-bLQJXlvjiXPG6XI3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bLQJXlvjiXPG6XI3 .icon-shape p,#mermaid-svg-bLQJXlvjiXPG6XI3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bLQJXlvjiXPG6XI3 .icon-shape .label rect,#mermaid-svg-bLQJXlvjiXPG6XI3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bLQJXlvjiXPG6XI3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bLQJXlvjiXPG6XI3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bLQJXlvjiXPG6XI3 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
竞猜预测
赛程查询
闲聊
用户提问:巴西 vs 德国谁会赢?
智能体入口
意图识别
调用球队数据工具
调用赛程 API
直接生成回复
检索历史交战记录
分析近期状态
LLM 综合推理
生成竞猜建议 + 理由
3.2 工具定义
智能体需要定义若干工具,让模型能主动调用外部数据:
/**
* 定义智能体可调用的工具
*/
public class WorldCupAgentTools {
/**
* 工具1:查询两队历史交战记录
*/
public static String getHeadToHead(String teamA, String teamB) {
// 实际场景中调用维基百科或体育数据库
return String.format(
"%s 与 %s 近5次交手:%s 3胜1平1负,占据心理优势",
teamA, teamB, teamA
);
}
/**
* 工具2:查询球队近期战绩
*/
public static String getRecentForm(String team) {
// 模拟返回近5场战绩
return String.format(
"%s 近5场:4胜1平,进12球失3球,状态火热", team
);
}
/**
* 工具3:查询球队伤病与阵容
*/
public static String getTeamNews(String team) {
return String.format(
"%s 主力阵容齐整,核心球员均可出战", team
);
}
}
3.3 智能体配置
使用 LangChain 构建智能体的核心配置:
/**
* 世界杯竞猜智能体配置
*/
public class WorldCupAgent {
private final ChatModel chatModel;
private final List<Tool> tools;
public WorldCupAgent() {
// 初始化大模型(以 OpenAI 为例)
this.chatModel = new OpenAiChatModel("gpt-4o");
// 注册工具
this.tools = List.of(
Tool.builder()
.name("get_head_to_head")
.description("查询两支球队的历史交战记录")
.function(
args -> getHeadToHead(
args.get("team_a"), args.get("team_b")
)
)
.build(),
Tool.builder()
.name("get_recent_form")
.description("查询某支球队的近期战绩")
.function(
args -> getRecentForm(args.get("team"))
)
.build(),
Tool.builder()
.name("get_team_news")
.description("查询球队伤病与阵容动态")
.function(
args -> getTeamNews(args.get("team"))
)
.build()
);
}
public String predict(String userInput) {
// 交由 AgentExecutor 驱动推理与工具调用
AgentExecutor executor = AgentExecutor.builder()
.agent(createReActAgent())
.tools(tools)
.build();
return executor.run(userInput);
}
}
3.4 部署与运行
有了核心代码,接下来把它打包成可运行的 Spring Boot 应用。以下步骤从零搭建即可。
3.4.1 Maven 依赖配置(pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>worldcup-agent</artifactId>
<version>1.0.0</version>
<name>World Cup Agent</name>
<properties>
<java.version>17</java.version>
<langchain4j.version>0.35.0</langchain4j.version>
</properties>
<dependencies>
<!– Spring Boot Web –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!– LangChain4j 核心 –>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<!– LangChain4j OpenAI 集成 –>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>${langchain4j.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
说明:这里使用 LangChain4j 作为 Java 侧的 LangChain 实现。如果你在前文中使用了其他 SDK,替换对应依赖即可。
3.4.2 编写启动类
package com.example.worldcup;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Spring Boot 启动入口
*/
@SpringBootApplication
public class WorldCupAgentApplication {
public static void main(String[] args) {
SpringApplication.run(WorldCupAgentApplication.class, args);
}
}
3.4.3 注册智能体 Bean
将 WorldCupAgent 注入 Spring 容器,方便控制器调用:
package com.example.worldcup.config;
import com.example.worldcup.agent.WorldCupAgent;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AgentConfig {
@Bean
public WorldCupAgent worldCupAgent() {
return new WorldCupAgent();
}
}
3.4.4 提供 REST 接口
package com.example.worldcup.controller;
import com.example.worldcup.agent.WorldCupAgent;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/agent")
public class PredictController {
private final WorldCupAgent worldCupAgent;
public PredictController(WorldCupAgent worldCupAgent) {
this.worldCupAgent = worldCupAgent;
}
@PostMapping("/predict")
public String predict(@RequestBody PredictRequest request) {
return worldCupAgent.predict(request.getQuestion());
}
public static class PredictRequest {
private String question;
public String getQuestion() { return question; }
public void setQuestion(String question) { this.question = question; }
}
}
3.4.5 打包与启动
# 进入项目根目录,执行 Maven 打包
mvn clean package -DskipTests
# 启动应用(确保 8080 端口未被占用)
java -jar target/worldcup-agent-1.0.0.jar
启动后通过 cURL 验证:
curl -X POST http://localhost:8080/api/agent/predict \\
-H "Content-Type: application/json" \\
-d '{"question": "巴西 vs 阿根廷谁会赢?"}'
至此,一个可直接部署、对外提供 RESTful API 的世界杯竞猜智能体就完成了。
4. 运行效果示例
用户输入:
巴西和阿根廷接下来要踢半决赛了,帮我分析一下谁会赢?
智能体输出:
根据我的综合分析:
巴西 vs 阿根廷 半决赛预测
综合预测:本场比赛看好巴西小胜,比分预测 2:1。
理由:巴西近期攻防两端表现更均衡,且在杯赛淘汰赛阶段经验丰富。
5. 界面展示
以下是基于 Streamlit 搭建的智能体交互界面示例,用户可以通过浏览器直接与竞猜智能体对话。
① 主界面:输入问题,获取竞猜预测
用户在前端文本框输入竞猜问题,点击"提交"后,智能体会调用工具链检索数据并给出预测结果。
左侧侧边栏配置 API Key 及模型参数,主区域展示对话历史与竞猜结果。每次交互会记录完整的推理链,包括调用了哪些工具(如"查询历史交战记录"“查询近期战绩”)。
② 工具调用过程可视化
智能体在执行竞猜分析时,界面会实时展示每一步工具调用及返回数据,提升可信度与可解释性。
展示了智能体依次调用 get_head_to_head、get_recent_form、get_team_news 三个工具的中间过程,用户可清晰看到数据来源与推理路径。
③ 多轮对话与上下文记忆
支持多轮对话,智能体能记住上文提到的球队、比赛等信息,无需重复输入。
用户可以持续追问淘汰赛走势、冠军归属等后续问题,智能体基于上下文连贯回答,体验流畅。
5. 进阶优化方向
| 实时数据接入 | 对接体育数据 API(如 TheSportsDB、API-Football)获取实时比分和统计 |
| 记忆能力 | 引入 LangGraph 实现多轮对话记忆,让竞猜体验更连贯 |
| 情感分析 | 对社交媒体舆情做情感分析,辅助判断大众心理预期 |
| 可视化输出 | 用 ECharts 展示胜率分布、历史交锋数据等图表 |
6. 总结
世界杯竞猜智能体是一个典型的 LLM + 工具调用 应用,核心在于定义好数据工具、编排好推理链。将大模型的知识与外部实时数据结合,就能打造出一个“懂球又会算”的 AI 助手。




