欢迎光临
我们一直在努力

世界杯竞猜智能体:从零构建一个懂球、会算、能聊的 AI 助手

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 阿根廷 半决赛预测

  • 历史交锋:近5次交手,阿根廷 3胜1平1负,略占上风。
  • 近期状态:巴西近5场4胜1平,阿根廷近5场3胜2平,巴西状态更佳。
  • 阵容情况:双方主力均齐整,无关键伤病。
  • 综合预测:本场比赛看好巴西小胜,比分预测 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 助手。

    赞(0)
    未经允许不得转载:171主机测评 » 世界杯竞猜智能体:从零构建一个懂球、会算、能聊的 AI 助手
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址