1. 概览
人工智能现在已成为许多软件系统的一部分,但构建 AI 应用与构建用户可以信任的应用并不相同。在许多实际应用环境中,挑战不仅仅在于生成回答。挑战在于如何生成及时、有事实依据、切实可行且符合人类专业知识的回答。
在此 Codelab 中,您将构建一个赛跑教练模拟器,以具体而有趣的方式演示这些想法。该应用使用虚拟赛车的遥测数据来制作赛道上的动画,并生成指导建议。虽然我们以赛车为场景,但相同的架构理念也适用于医疗保健、制造、物流和其他信任至关重要的领域。
您将处理高速遥测数据流,将其转换为对 AI 推理有用且高效的形式,并将基于大语言模型的输出与编码的人工指导相结合,以生成更可信的回答。
构建内容
在此 Codelab 中,您将构建一个可信赖的 AI 原型,该原型具有以下功能:
- 从在 Google Cloud 中运行的虚拟赛车流式传输遥测数据
- 使用 Chrome 可视化汽车在赛道上行驶
- 将原始遥测数据重塑为可供 AI 使用的输入
- 应用由 Google Gemini 提供支持的策略层
- 将模型输出与编码的人工指导和安全规则相结合
- 通过面向用户的界面提供指导反馈
学习内容
学完此 Codelab 后,您将能够:
- 说明哪些因素会使 AI 系统更值得信赖
- 解释模块化 AI 架构的用途
- 创建简单的模拟遥测流水线
- 准备有用的结构化数据以供 LLM 使用
- 应用安全护栏和人工引导规则来提高可信度
- 评估此架构如何应用于其他网域
2. 所需条件
在开始之前,请确保您已准备好所需的账号、工具和服务。
前提条件
您应该:
- 使用 Gmail 邮箱的个人 Google 账号
- 能够访问 Google Cloud,并且对 CLI 有初步了解
- 有效的结算账号或云积分
- 对 Google Cloud 和使用 Gemini 的生成式 AI 有大致了解
Gemini 是 Google 的 AI 模型,以先进的推理能力为基础,可将任何创意变为现实。它在多模态理解、智能体编程和氛围编程方面表现出色。

获取用于使用 Google Cloud 的赠金
如需申领积分,请访问此链接,然后使用 Gmail 电子邮件地址(gmail.com 网域)登录。然后,在您的 Google Cloud Platform (GCP) 结算账号中接受赠金,赠金就会应用到您的账号中。
3. 可信赖的 AI 的重要性
许多 AI 系统都能生成流畅且令人信服的回答,但流畅并不等同于可信。在实际应用系统中,用户通常需要及时、有依据的回答,这些回答会受到安全规则的限制,并受到领域专业知识的影响。
当系统处理快速变化的数据时,这一点尤为重要。如果响应到达得太晚,可能就毫无用处了。如果回答听起来很自信,但忽略了重要的背景信息,则可能会产生误导。即使回答听起来很完美,但如果与人类专业知识毫无关联,也可能难以信任。
在此 Codelab 中使用的赛车场景中,问题不在于 AI 是否能说出有趣的内容,问题在于,系统能否提供有用、安全、及时且适合具体情况的建议。
我们来看一个小规模的遥测数据样本,并比较两种可能的输出:
Racing Car Telemetry Data
{
"speedMph": 118,
"throttle": 91,
"frontGrip": "nominal",
"rearGrip": "low",
"trackPosition": "Turn 1 Entry"
}
幼稚的 AI 回答
"Stay aggressive on the throttle and carry your speed into Turn 1"
信任感知型回答
"Rear grip is low at Turn 1 entry. Reduce your throttle slightly and prioritize a stable corner entry"
注意到区别了吗?
如果我们只依赖于简单的 AI 回答,会发生什么情况?
第一个回答听起来很有信心,但忽略了风险。第二个回答更有用,因为它反映了上下文和限制条件。
您需要将 LLM 视为更广泛架构的一部分,而不是将其视为整个系统,这样才能提高可信度。此外,许多应用需要快速提供建议,以便采取行动,例如赛车、医疗程序、航空、电网、交易系统、航海导航等。
现在,我们来了解如何创建此类架构。
4. 了解高速 AI 和模块化可信架构
有些 AI 系统需要非常不同的行为。它们必须能够快速应对不断变化的情况,同时支持更慢、更周到的推理。
模块化架构会将这些职责分离到不同的路径中。一种路径可以是反射性的,用于立即对传入信号进行时效性解读。另一种路径可以侧重于策略,支持更高级别的推理和更具情境感知能力的决策。其他路径则针对其他类型的功能。

有些决策必须实时做出。有些决策需要更长时间的思考。
可信赖的 AI 通常需要同时满足这两个条件。
这种架构分离有助于系统保持响应性,同时仍支持更丰富的 AI 驱动的指导。它还为引入人工引导的限制条件和领域知识提供了一个清晰的位置。
在这个小程序中,我们实现了反射路径和策略路径,它们都是 Python 函数。
const telemetry = {
speed: 147,
grip: 0.68,
corner_type: "sharp",
lap_trend: "entering_corners_too_fast",
};
function reflexPath(event: typeof telemetry): string {
if (event.grip < 0.70) {
return "REFLEX: Reduce throttle now";
}
return "REFLEX: No urgent issue";
}
function strategyPath(event: typeof telemetry): string {
if (event.lap_trend === "entering_corners_too_fast") {
return "STRATEGY: Brake earlier and prioritize corner exit";
}
return "STRATEGY: Driving pattern looks stable";
}
console.log(reflexPath(telemetry));
console.log(strategyPath(telemetry));
在给定相同的遥测数据时,这两个函数的行为会有所不同。反射函数是一种立即警告。策略函数会根据规则提供指导建议。
您认为将此逻辑分开有何用处?
现在,我们来构建一个有趣的多部分应用,看看这种架构如何将快速反应和更深层次的推理转化为您可以实际体验的可信赖的 AI 系统。
5. 构建遥测流式传输服务器
现在,您已经了解了架构目标,接下来可以构建驱动应用的数据流水线了。
在本部分中,您将为虚拟赛车创建一个简单的遥测数据流。数据将来自包含 GPS 或轨迹位置数据的 CSV 源,您的应用会将其转换为界面和 AI 层可以使用的实时数据流。
在此部分中,您将完成以下各项:
- 在 Google Cloud 中为我们的流式传输服务器和应用创建新项目
- 创建用于发出遥测数据的小型服务器
- 将这些事件流式传输到浏览器界面或控制台
1. 打开 Cloud Shell
A. 前往 Google Cloud 控制台。
B. 为此 Codelab 创建一个新项目。点击顶部的项目下拉菜单。

创建项目时,最好关联结算账号:
(可选)如果您已创建项目,可以打开左侧面板,点击 Billing,然后查看结算账号是否已与此 GCP 账号相关联。
C. 获取 Gemini API 密钥
启用 Google Cloud 积分后,您需要 Gemini API 密钥才能在 Google Cloud 中访问 Gemini。
如需创建 Gemini API 密钥,我们需要使用 Google Vertex AI Studio 生成密钥。
在 Vertex AI Studio 中,点击左下角“文档”上方的“获取 API 密钥”。为 Gemini 创建 API 密钥(看起来像一长串看似随机的字符)。请将此密钥保存在安全的位置。我们将在第 6 步“构建赛车模拟器”中使用此 API 密钥来验证我们对 Google Cloud 中 Gemini 的访问权限。
D. 点击顶部栏中的 Cloud Shell 图标(终端图标),打开基于浏览器的终端。
E. 等待终端会话开始。

2. 获取代码
克隆主代码库。
git clone https://github.com/ocupop/trustable-ai-codelab.git
cd trustable-ai-codelab
请注意,此代码库中有两个文件夹:“koru-application”(Web 应用)和“streaming-telemetry-server”(模拟的实时赛车遥测)。此步骤介绍了“streaming-telemetry-server”。我们将在下一步中使用“koru-application”。
3. 启用必需的 API
为每个项目运行一次:
# Set Project ID
gcloud config set project YOUR_PROJECT_ID
# Enable APIs
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com
将 YOUR_PROJECT_ID 替换为您的实际项目 ID(如果已设置项目,则跳过第一行)。
您可以在项目列表中找到 YOUR_PROJECT_ID

4. 将后端部署到 Cloud Run
从代码库根目录(即确保您位于 trustable-ai-codelab 文件夹中):
gcloud run deploy streaming-telemetry-server \
--source streaming-telemetry-server \
--platform managed \
--region us-central1 \
--allow-unauthenticated
请注意,您可能需要在看到提示时按“Y”
- 首次运行可能会提示您启用 API 或创建 Artifact Registry 代码库;请根据需要接受。
- 如果您使用的区域不是
us-central1,请使用--region指定相应区域 - 部署完成后,gcloud 会输出服务网址。我们只需在此网址中附加“events”,即可将其用作遥测服务器的完整端点。
5. 使用直播网址
遥测服务器现在正在使用服务器发送的事件 (SSE) 在以下形式的端点上发出模拟遥测数据:
service-URL/events // service-URL - the last line displayed by "deploy"
在浏览器中进行测试:使用 Chrome 访问此直播端点网址。您应该会在浏览器中看到传入的流式数据,这些数据模拟的是赛车上传感器发出的数据。

您可以关闭浏览器标签页来终止连接。
使用 curl 进行测试:
现在,我们从 shell 命令行进行测试。
curl -N service-URL/events # Replace service-URL with actual deployment endpoint
您应该会在 Cloud Shell 窗口中看到传入的流式数据。

我们将使用此遥测数据来模拟赛车中传感器发出的数据。此 Codelab 的其余部分将使用这些数据。您可以在终端窗口中输入 CTRL-C 来终止 curl 程序。
您应注意的事项
在完成本部分时,请注意传入数据的性质。原始遥测数据通常量大、对时间敏感,并且不适合立即用于 AI 推理。构建前端应用后,我们需要将原始数据过滤为 LLM 可以快速处理的高效格式。
不过,我们先来构建用于直观呈现数据的 Web 前端。
6. 构建赛车模拟器
在此部分中,您将完成以下各项:
- 构建赛车模拟
- 将遥测服务器连接到赛车 Web 应用
- 查看模拟的竞态
至此,我们已在云端运行了一个赛车遥测数据的有效模拟。现在,我们来构建在本地机器上运行、连接到 Google Cloud 并将数据可视化的应用。
我们可信赖的 AI 应用同时利用了 Google Cloud 服务的强大功能和灵活性,以及在 Chrome 中运行的本地智能。
流式遥测服务在 Google Cloud 中运行,但赛车应用在本地机器上运行。这意味着您需要再次克隆该代码库,这次是克隆到笔记本电脑或台式电脑上。
为简单起见,同一代码库包含流式传输服务器和赛车应用的代码。
从 GitHub 克隆前端应用:
git clone https://github.com/ocupop/trustable-ai-codelab.git
cd trustable-ai-codelab
在笔记本电脑或桌面设备上克隆代码库后,我们来运行应用。
cd koru-application # racing car simulation app
npm install
npm run dev

在 Chrome 中,打开本地计算机上的端口(如上例中的 http://localhost:5173)。您将看到“AI 赛车指导”应用的着陆页。

点击“打开信息中心 ->”按钮。这将启动应用的界面。

至此,您已拥有一个在 Google Cloud 中生成模拟赛车遥测数据的遥测服务器,以及一个可以直观呈现该数据并连接到 LLM 的本地 Web 应用。让我们将它们连接起来,并连接到 Gemini LLM 服务。
点击应用右上角的齿轮图标(设置)。

输入您在第 2 步中获得的 Gemini API 密钥。这样,您就可以在 Google Cloud 中使用 Gemini 服务。
点击“保存”,以便应用记住您的 API 密钥。
现在,我们将应用连接到遥测服务器。在应用信息中心内,点击“实时会话”。

在显示“SSE URL or .txt file path”的文本字段中,输入基于云的遥测服务器的具体网址(第 5 步)。我们的 SSE 网址采用以下格式:
https://streaming-telemetry-server-${PROJECT_NUMBER}.${REGION}.run.app/events
输入遥测服务器端点网址后,点击“连接”(位于文本字段的右侧)。别忘了在网址末尾添加“events”。
现在,您应该会看到应用直观呈现模拟数据!
如果扬声器音量调高,您就可以听到不同类型的教练提供的赛车建议。每位教练的性格都各不相同。尝试选择不同的教练,看看他们提供的各种跑步建议和不同的声音风格。如果需要,您可以点击扬声器图标来停用音频。

现在我们已经有了一个可正常运行的应用,接下来我们来探索如何准备数据以供 LLM 高效处理,以及如何添加其他功能来提高整个系统的可信度。
7. 为 AI 推理准备遥测数据
原始遥测数据对于模拟很有用,但通常过于详细且过于频繁,无法直接发送到 LLM。如果您发送所有遥测数据而不做任何更改,可能会增加延迟时间、引入噪声并降低生成的指导的质量。
在本部分中,您将把遥测数据重塑为更有用的形式。
在此部分中,您将完成以下各项:
- 检查原始遥测 JSON
- 确定哪些字段与推理最相关
- 过滤或汇总数据
- 减少不必要的细节
- 准备适合 AI 的驾驶状态表示形式
这是打造值得信赖的 AI 的重要一步。回答的质量不仅取决于模型,还取决于模型接收的数据的结构和相关性。
现在,我们来探索赛车的具体数据。我们可以通过更改应用中的特定值、重新加载应用并观察结果来进行实验。
../src/services/telemetryStreamService.ts near line 180
// Clamp G-forces
gLat = Math.max(-3, Math.min(3, gLat)); // sideways G-force
gLong = Math.max(-3, Math.min(3, gLong)); // front/back G-force
汽车中的 G 力用于衡量加速或减速。在赛车中,了解重力有助于提升赛车的操控性和整体性能。如果我们的应用没有这些信息,就很难为司机提供建议。注释掉这两行,将 gLat 和 gLong 值都设置为 0.0,然后重新运行应用。
请注意,当车辆接近弯道时,系统不会提供任何建议。这对赛车手来说没什么帮助!
然后,撤消所做更改并重新运行应用。请注意,当汽车到达弯道时,系统会提供有用的音频建议。重力数据点对于向驾驶员提供建议至关重要。
现在,我们人为地将车速限制为 30 英里的悠闲速度。我们不会以这种速度赢得任何比赛,但它肯定会展示我们接受的指导类型。
在同一文件 (telemetryStreamService.ts) 中,您会在第 158 行附近找到函数 processPoint()。在该函数中,我们来限制速度。
更改:
private processPoint(point: GpsSSEPoint) {
...
const speedKmh = point.speed > 200 ? point.speed : point.speed * 3.6;
...
收件人:
private processPoint(point: GpsSSEPoint) {
...
let speedKmh = point.speed > 200 ? point.speed : point.speed * 3.6;
speedKmh = Math.min(speedKmh, 48); // 48 kmh is approx 30 mph
...
重新运行应用。我们现在会收到哪类指导建议?如果我们只是休闲驾驶,则不需要太多。
现在,还原这些更改并重新运行应用。
显然,车速是一个有价值的数据点。了解哪些特定数据对于提供有价值的建议至关重要非常重要。评估哪些数据不相关也同样重要。
您还应开始考虑安全性和信任度。即使输入内容准备充分,也无法保证获得可靠的回答。我们仍需引入人为指导的规则和明确的限制。
数据准备不仅仅是一个预处理步骤。这是信任策略的关键组成部分。输入内容越干净,输出内容通常就越专注、越可靠。
8. 添加了安全防护措施和编码的人类专业知识
可信赖的 AI 系统不应仅依赖模型输出。在许多情况下,最可靠的系统会将大语言模型推理与明确的规则、领域知识和人工引导的限制相结合。
在本部分中,您将添加该层。
您可以将此层视为编码的指导知识。它可能包括首选回答模式、验证规则、安全检查或结构化指导,有助于系统保持可靠性和实用性。
在此部分中,您将完成以下各项:
- 引入用于控制模型行为的回答规则
- 应用安全检查来减少误导性建议
- 将编码的人类专业知识纳入流水线
- 比较添加这些内容前后的回答
接下来,我们来探讨如何将领域专业知识添加到应用中。
LLM 通常不会接受赛车或赛车性能物理学方面的训练。如果我们的应用包含该领域的专业知识,用户就可以更信任其提供的指导。这种指导来自基于人类专业知识的规则,换句话说,来自领域专业知识层。
../src/utils/coachingKnowledge.ts near line 115
...
export const RACING_PHYSICS_KNOWLEDGE = `
CORE PRINCIPLES:
1. **The Friction Circle:** A tire has 100% grip. If you use 100% for braking, you have 0% for turning.
- *Error:* Turning while 100% braking = Understeer (Plowing).
- *Fix:* "Trail braking" (releasing brake pressure as steering angle increases).
2. **Weight Transfer:**
- Braking shifts weight forward (Front grip UP, Rear grip DOWN).
- Accelerating shifts weight backward (Front grip DOWN, Rear grip UP).
- *Error:* Lifting off throttle mid-corner shifts weight forward abruptly -> Oversteer (Spin risk).
3. **The racing line:**
...
这些赛车原则是提供可信赖输出的关键要素。如果我们没有这种专业知识,会发生什么情况? 让我们来一探究竟。
我们来移除 RACING_PHYSICS_KNOWLEDGE,探索我们的赛车建议。
export const RACING_PHYSICS_KNOWLEDGE = ``;
重新运行应用。我们现在会收到哪类指导建议?
请注意一般建议。
我们不再获得有关摩擦力、重量转移、出弯速度等的详细信息。没有这些信息,我们的可信度会降低。恢复赛车专业知识,然后重新运行应用。
这一步是打造可信赖的 AI 系统的关键。更强的提示并不能神奇地创造信任。信任源于系统设计和批判性思维。
LLM 是解决方案的一部分,但不是整个解决方案。当 AI 输出由明确的人类知识引导时,信任度会提高。
9. 设计指导角色和用户体验
推理流水线就绪后,下一个问题是系统应如何与用户沟通。
在本部分中,您将通过定义策略层与驾驶员之间的通信方式来塑造指导体验。您将针对其中一个教练角色优化系统提示,并考虑如何清晰、及时且最重要的是以可操作的方式提供指导。
在此部分中,您将完成以下各项:
- 为教练角色创建或优化系统提示
- 尝试不同的指导风格
- 观察提示更改对回答的影响
- 定义可信反馈的界面要求
- 了解文字转语音 (TTS) 功能对紧急消息和非紧急消息的支持情况
我们的应用包含多种指导角色。每种建议都提供不同类型的指导。
PERSONA | 特征 |
Tony | 激励性、基于感觉 |
Rachel | 技术性强,侧重于物理 |
AJ | 直接、生硬的命令 |
Garmin | 以数据为中心,进行增量优化 |
Super AJ | 自适应,按错误类型切换 |
这些角色在文件 ../src/utils/coachingKnowledge.ts 中定义。
在此文件中,您会看到一个将字符串键与 CoachPersonas 相关联的对象映射 (COACHES)。CoachPersona 包含每种类型的教练的属性。一个重要属性是 systemPrompt。每种角色设定都有自己的 systemPrompt,用于指导 LLM 如何回答。
我们来更改其中一个 system prompts,看看 LLM 会如何回答。
在第 31 行附近,您会看到“AJ”的 systemPrompt,他的建议非常直接和坦率。让我们将 systemPrompt 更改为 AJ 过分礼貌。
systemPrompt: `You are AJ, a race engineer that is excessively polite.
Use telemtry terminology. Be actionable
Examples: "Lat G settling. please throttle",
"Brake when its convenient."
Keep responses under 12 words. Never explain — just command.`
重新运行应用,选择 AJ 作为教练,看看生成了哪些类型的回答。
现在,恢复原始 systemPrompt 并重新运行应用。请注意,系统提示对于引导 LLM 提供符合角色设定的回答至关重要。
信任不仅仅关乎正确性。还与配送有关。即使建议在技术上准确无误,如果不够清晰、时机不当或令人分心,也可能无法发挥效用。
可信赖的系统必须能够顺畅地进行沟通。用户体验是信任架构的一部分。
10. 查看端到端架构
至此,您已构建了系统的大部分组件。现在,让我们退后一步,看看它们是如何协同运作的。
您的应用现在包含以下组件:
- 遥测数据流
- 可视化层
- AI 就绪型数据转换阶段
- 由推理 LLM 提供支持的策略组件
- 安全护栏和编码的人工指导
- 面向用户的指导体验
一种简单实用的方法是向应用添加日志记录,以便了解这些组件的整体流程。
我们将添加日志记录,以查看遥测数据在路径中的流动情况。
首先,我们先查看一下遥测数据。在 telemetryStreamService.ts 中,在第 212 行附近(在 this.emit(frame) 之前),添加一行来显示速度、横向 G 力(侧向加速度)以及驾驶员踩刹车踏板的力度。
console.log('FRAME', {
speed: frame.speed.toFixed(1),
gLat: frame.gLat.toFixed(2),
brake: frame.brake.toFixed(0) }
);
重新加载应用。在运行应用之前,我们先在 Chrome 的开发者工具中打开控制台,以查看此调试信息。

在应用中,输入遥测端点,然后点击“连接”。 您现在可以看到传入的遥测数据。
现在,我们为反射路径和策略路径添加日志记录。
在 ../src/services/coachingService.ts 中,大约在第 71 行 this.emit() 之前,添加一行用于记录 reflex 路径的日志:
console.log('Reflex', {
action: rule.action,
text,
coach: this.coachId }
);
在同一文件中,在第 287 行附近,在 this.emit() 之前,为 strategy 路径添加类似的日志记录行(我们添加了 Gemini API 返回的指导回答 text):
console.log('Strategy', {
coach: coach.id,
chars: text.length,
preview: text.slice(0, 60) }
);
重新运行应用。您会在控制台中看到遥测数据如何从来源通过这些路径流动。系统会对传入的流进行过滤,然后将其发送给 LLM,并使用可信的人工专业知识进行验证,最后通过适当的用户界面呈现给用户。
请注意,我们已将各种技术组件关联起来,以实现可信赖 AI 的宏大目标。架构的价值不在于任何单个组件本身。价值源于各部分之间的相互加强。
可信赖的 AI 是一种架构成果,而不是单一功能。
清理(移除服务)
请务必记得在不再需要该服务时将其移除。完成对遥测服务器和应用的测试后,您应删除 Cloud Run 服务并停止为其付费:
gcloud run services delete streaming-telemetry-server \
--region us-central1 \
--platform managed
请记得根据需要将 us-central1 替换为您在部署时使用的区域。在系统提示时确认。
11. 挑战
现在,核心应用已正常运行,并且您已了解各种组件,接下来可以尝试扩展设计。
建议的挑战
- 将更多指导逻辑移至边缘
- 修改模拟以支持下雨或减少牵引力
- 了解模型调优或微调如何提高性能
- 针对其他领域(例如医学、制造或物流)调整架构
例如,在将本实验中获得的经验应用到其他网域时,请考虑以下问题:
- 其他领域中与赛车遥测(即连续数据)相当的数据是什么?
- 哪些决策需要立即做出,哪些决策更具战略意义?
- 需要编码哪种类型的人类专业知识?
- 用户需要看到哪些内容才能相信系统是可信的?
这些挑战旨在鼓励您跳出竞速示例的框架,认识到本 Codelab 背后的可信度这一更广泛的设计模式。
12. 总结和后续步骤
在此 Codelab 中,您构建的不仅仅是一个赛车演示。您构建了一个具体示例,展示了如何设计可信赖的 AI 系统。
您从原始遥测数据入手,将其转换为 LLM 可用的格式,应用 AI 推理,并通过编码的人工指导和响应限制来增强输出。在此过程中,您了解到信任源自架构,而不仅仅是模型输出。
可信赖的 AI 系统通常会结合以下要素:
- 结构化实时数据
- 基于模型的推理
- 编码的专业领域知识
- 显式防护措施
- 周到的用户体验设计
赛车场景有助于将这些想法具体化,但同样的方法可用于任何需要 AI 推荐及时、可行且可靠的场景。
