Gemini 2.0 Flash Thinking 简介
Gemini 2.0 Flash Thinking 是一个明确展示其思想的实验模型。该模型基于 Gemini 2.0 Flash 的速度和性能,经过训练,能够以更强大的推理能力使用思想。
您将看到这些推理能力的示例,包括代码理解、几何和数学问题以及生成适合特定知识水平的问题。
正如您所看到的,该模型正在展示其思想,以便您可以查看其推理以及它是如何得出结论的。
0.设置
此部分安装 SDK,使用您的 API 密钥进行设置,导入相关库,下载示例视频并将其上传到 Gemini。
如果您想直接跳转到示例,只需折叠(单击标题左侧的小箭头)并运行此部分(不要忘记运行它,否则什么都不会起作用)。
安装 SDK
新的 Google Gen AI SDK 使用 Google AI for Developers 和 Vertex AI API 提供对 Gemini 2.0(及之前的型号)的编程访问。除了少数例外,在一个平台上运行的代码将在两个平台上运行。这意味着您可以使用 Developer API 为应用程序制作原型,然后将应用程序迁移到 Vertex AI,而无需重写代码。
有关此新 SDK 的更多详细信息,请参阅文档或入门笔记本。
!pip install -U -q "google-genai>=0.3.0"
设置您的 API 密钥
要运行以下单元,您的 API 密钥必须存储在名为 GOOGLE_API_KEY 的 Colab Secret 中。如果您还没有 API 密钥,或者您不确定如何创建 Colab Secret,请参阅身份验证以获取示例。
从 google.colab 导入用户数据
GOOGLE_API_KEY=userdata.get('GOOGLE_API_KEY')
初始化 SDK 客户端
使用新 SDK,您现在只需使用 API 密钥(如果使用 Vertex AI,则使用 OAuth)初始化客户端。现在每次调用时都会设置模型。
from google import genai
from google.genai import types
client = genai.Client(api_key=GOOGLE_API_KEY)
检查thinking模型信息
Gemini 2.0 Flash Thinking 模型针对需要多轮战略制定和迭代解决的复杂任务进行了优化。
有关所有 Gemini 模型的更多信息,请查看文档以获取有关每个模型的扩展信息。
from pprint import pprint
pprint(client.models.get(model="gemini-2.0-flash-thinking-exp").model_dump(exclude_defaults=True))
{‘description’: ‘Gemini 2.0 Flash Thinking Experimental’,
‘display_name’: ‘Gemini 2.0 Flash Thinking Experimental’,
‘input_token_limit’: 32767,
‘name’: ‘models/gemini-2.0-flash-thinking-exp’,
‘output_token_limit’: 8192,
‘supported_actions’: [‘generateContent’, ‘countTokens’],
‘tuned_model_info’: {},
‘version’: ‘2.0’}
import json
from PIL import Image
from IPython.display import display, Markdown
以下是 Gemini 2.0 思维模型可以解决的一些相当复杂的例子。
在每个例子中,您可以选择不同的模型来查看新模型与其前身相比如何。
在某些情况下,您仍会从其他模型中获得好的答案,在这种情况下,重新运行几次,您会发现 Gemini 2.0 思维由于其思维步骤而更加一致。
示例 1:代码简化
首先,尝试一个简单的代码理解和简化示例。
response = client.models.generate_content(
model="gemini-2.0-flash-thinking-exp",
contents='How can I simplify this? `(Math.round(radius/pixelsPerMile * 10) / 10).toFixed(1);`'
)
pprint(response.candidates[0].content)
Content(parts=[Part(video_metadata=None, thought=None, code_execution_result=None, executable_code=None, file_data=None, function_call=None, function_response=None, inline_data=None, text="Let's break down the thought process for simplifying that JavaScript expression.\n\n**1. Understanding the Goal:**\n\nThe primary goal is to simplify the expression `(Math.round(radius/pixelsPerMile * 10) / 10).toFixed(1)` while maintaining its functionality. This means it should still perform the following steps:\n\n* Divide `radius` by `pixelsPerMile`.\n* Multiply the result by 10.\n* Round the multiplied result to the nearest integer.\n* Divide the rounded result by 10.\n* Format the final result as a string with one
如您所见,您的回复包含多个部分。虽然您可以像往常一样使用 response.text 立即获取所有内容,但使用思维模型时分别检查每个部分实际上更有趣。
第一部分是模型的“内部思想”,它分析问题并提出策略:
# First part is the inner thoughts of the model
Markdown(response.candidates[0].content.parts[0].text)
Let's break down the thought process for simplifying that JavaScript expression.
- 理解目标:
主要目标是简化表达式 (Math.round(radius/pixelsPerMile * 10) / 10).toFixed(1),同时保持其功能。这意味着它仍应执行以下步骤:
将 radius 除以 pixelsPerMile。
将结果乘以 10。
将乘积结果四舍五入为最接近的整数。
将四舍五入的结果除以 10。
将最终结果格式化为带有一位小数的字符串。
- 识别冗余/低效率:
核心低效率在于执行单独的四舍五入和除以 10。乘以 10 然后除以 10 会有效地将小数点向右移动一位,然后再向左移动。当旨在四舍五入到特定的小数位时,这是一种常见的模式。
- 针对舍入逻辑:
表达式中负责将数字舍入到小数点后一位的核心部分是 Math.round(value * 10) / 10。这可以用更直接的舍入方法代替。
- 探索 Math.round() 的替代方法以实现小数精度:
标准 JavaScript Math 对象没有内置函数可以直接舍入到特定的小数位数。但是,有一些常用的技术:
字符串操作:转换为字符串,找到小数点,然后截断/舍入。这对于数值运算通常效率较低。
乘法和除法(原始方法):这是原始表达式所做的。
更早地使用 toFixed():.toFixed(1) 已经在末尾,但如果我们可以在应用 toFixed() 之前舍入到正确的整数,我们可以更早地利用它。
- 关注 toFixed() 的行为:
toFixed(n) 将数字四舍五入到小数点后 n 位。这意味着如果我们可以将 toFixed() 之前的值设为所需的四舍五入值(乘以 10),toFixed(1) 将处理最终格式。
- 乘法试错法:
考虑核心计算 radius / pixelsPerMile。我们希望将其四舍五入到小数点后一位。
错误方法(最初的想法):Math.round(radius / pixelsPerMile) – 这会四舍五入到最接近的整数,而不是我们需要的。
关键见解:要四舍五入到小数点后一位,我们需要有效地将数字乘以 10。这正是原始表达式在除以之前所做的。
- 与 toFixed() 结合:
如果我们在 toFixed() 之前执行乘以 10 的运算,toFixed() 中的舍入将处理其余部分。
尝试 1:(radius / pixelsPerMile * 10).toFixed(1) — 这几乎可行,但 toFixed() 在乘以 10 后进行舍入。我们需要在小数点移动的阶段舍入到最接近的整数。
正确方法:我们仍然需要在 toFixed() 之前使用 Math.round(),但我们可以在最后除以 10 之前将其应用于值:Math.round(radius / pixelsPerMile * 10).toFixed(1)
- 认识进一步简化(删除冗余除法):
现在,查看表达式 Math.round(radius / pixelsPerMile * 10)。这正是除以 10 之前的原始表达式的分子。由于 toFixed(1) 处理四舍五入到小数点后一位并转换为字符串,因此我们不再需要显式除以 10。
- 得出最简单的版本:
这导致最简洁、最有效的解决方案:(radius / pixelsPerMile).toFixed(1)
- 考虑边缘情况和替代方案(自我修正):
浮点精度:重要的是要意识到浮点算术有时会引入小的误差。对于大多数实际目的,简化版本就足够了。但是,在高度关键的金融应用中,可能会考虑更强大的十进制库。
替代舍入方法:虽然 toFixed() 是本例中最直接的方法,但从技术上讲,可以使用自定义函数或库来更精细地控制舍入行为(例如,向上舍入、向下舍入、舍入为偶数)。但是,对于给定的要求,toFixed() 是理想的选择。
这个详细的细分展示了识别核心功能、发现冗余、探索替代技术以及逐步将表达式细化为最简单、最有效形式的思维过程。它涉及一些反复试验和理解 JavaScript 数字和数学函数的行为。
大多数情况下,您不需要检查想法,因为您最感兴趣的是答案,但访问它们可以让您检查答案来自何处以及模型如何得出答案。它不再是一个黑匣子了!
如果您使用的是 v1alpha API,您将看到 thought=True,表示第一部分确实是想法。
然后第二部分是实际答案:
# Second part is the response from the model
Markdown(response.candidates[0].content.parts[1].text)
You're looking to round a calculated value to one decimal place. Let's break down the original expression and explore simplifications.
理解原始表达式:
- radius / pixelsPerMile:执行初始计算。我们将其结果称为中间值。
- 中间值 * 10:将结果乘以 10,实际上将小数点向右移动一位。
- Math.round(…):将移位后的值四舍五入为最接近的整数。
- / 10:将四舍五入后的整数除以 10,将小数点移回其原始位置,实际上将原始中间值四舍五入为小数点后一位。
- .toFixed(1):将数字转换为字符串并将其格式化为小数点后一位。
简化:
操作的核心是四舍五入为小数点后一位。JavaScript 提供了一种更直接的方法来实现这一点。
选项 1:直接使用 toFixed()(最常见且推荐)
您可以将 toFixed(1) 直接应用于除法结果:
(radius / pixelsPerMile).toFixed(1);
说明:
radius / pixelsPerMile 的计算方式与之前相同。
.toFixed(1) 然后获取此结果并:
将其四舍五入到小数点后一位。
将其转换为字符串。
为什么这样做更好:
更简洁易读:它直接表达了四舍五入到小数点后一位的意图。
可能更有效:避免中间的乘法、四舍五入为整数,然后除法。
选项 2:使用 Math.round() 并采用略有不同的方法(不太常见,但说明了要点)
您也可以使用 Math.round() 并稍作修改来实现相同的结果:
(Math.round((radius / pixelsPerMile) * 10) / 10).toFixed(1);
虽然这看起来与原始版本非常相似,但括号至关重要。它们确保在应用 toFixed(1) 之前先乘以 10。
但是,此选项仍然不如选项 1 直接,并且没有任何显着的优势。
原始表达式有效的原因(以及它多余的原因):
原始表达式有效,因为当您没有 toFixed() 可用或想要更好地控制舍入行为时,Math.round(value * 10) / 10 模式是一种常用的舍入到小数点后一位的技术。但是,toFixed() 是专门为此目的而设计的,可以简化代码。
选择哪个选项:
为了清晰、简洁和可能更好的性能,推荐的方法是选项 1:
(radius / pixelsPerMile).toFixed(1);
这直接表达了意图并利用了 toFixed() 的内置功能。
作为比较,以下是您使用“经典” Gemini 2.0 模型所获得的结果。
与思考模式不同,正常模型不会表达其想法并尝试立即回答,这可能导致对复杂问题的更简单答案。
response = client.models.generate_content(
model="gemini-2.0-flash-exp",
contents='How can I simplify this? `(Math.round(radius/pixelsPerMile * 10) / 10).toFixed(1);`'
)
Markdown(response.text)
示例 2:几何问题(带图像)
这个几何问题需要复杂的推理,并且还需要使用 Gemini 多模态能力来读取图像。
!wget https://storage.googleapis.com/generativeai-downloads/images/geometry.png -O geometry.png -q
im = Image.open("geometry.png").resize((256,256))
im
model_name = "gemini-2.0-flash-thinking-exp" # @param ["gemini-1.5-flash-8b","gemini-1.5-flash","gemini-1.5-pro","gemini-2.0-flash-exp", "gemini-2.0-flash-thinking-exp"] {"allow-input":true}
response = client.models.generate_content(
model=model_name,
contents=[
im,
"What's the area of the overlapping region?"
]
)
display(Markdown("## Thoughts"))
display(Markdown(response.candidates[0].content.parts[0].text))
display(Markdown("## Answer"))
display(Markdown(response.candidates[0].content.parts[1].text))
思考
让我们分解一下。重叠区域由四分之一圆和三角形组成。圆的半径为 3。整个圆的面积为
重叠区域涉及该圆的四分之一,因此四分之一圆的面积为:
三角形是直角三角形。三角形的底边和高均为 3。三角形的面积为:
再看一看图像,重叠区域不是四分之一圆和三角形的总和。重叠区域由圆和三角形的交点形成。
重叠区域的形状看起来像圆的扇形减去三角形。
圆的半径为 3。圆上显示“3”的线表明这些是半径。这些线形成直角。这意味着扇形是圆的四分之一。
四分之一圆的面积为 :
相交形成的三角形底边为3,高为3,是直角三角形。
重叠区域是四分之一圆的面积。我之前的思考过程犯了一个错误。重叠区域正好是圆的四分之一。三角形的边与圆的半径对齐。
我们再检查一下。三角形的左下角是圆心。三角形的两条边是圆的半径。由于三角形是直角三角形,所以这些半径之间的角度是90度。因此,重叠区域是圆心角为90度的圆的扇形。90度扇形是圆的四分之一。
圆的半径是3。圆的面积是
重叠区域(四分之一圆)的面积是
答案
重叠区域由圆与三角形的相交形成。
从图像中,我们可以观察到以下情况:圆的半径为 3。从圆心到圆周标记为“3”的部分表示半径。
三角形是一个直角三角形,两条边的长度为 3,形成直角。
重叠区域由圆的两个半径和圆的圆弧界定。这描述了圆的一个扇形。
形成直角的三角形的两条边与圆的半径重合。由于它是一个直角三角形,这两个半径之间的角度是 90 度。
因此,重叠区域是圆心角为 90 度的扇形。中心角为 90 度的扇形是整个圆的1/4,面积为:
最终答案为:
示例 #3:有转折的脑筋急转弯
这是另一个基于图像的脑筋急转弯,这次它看起来像一个数学问题,但实际上无法用数学方法解决。如果你检查模型的思路,你会发现它会意识到这一点并提出一个开箱即用的解决方案。
!wget https://storage.googleapis.com/generativeai-downloads/images/pool.png -O pool.png -q
im = Image.open("pool.png")
im
model_name = "gemini-2.0-flash-thinking-exp" # @param ["gemini-1.5-flash-8b","gemini-1.5-flash","gemini-1.5-pro","gemini-2.0-flash-exp", "gemini-2.0-flash-thinking-exp"] {"allow-input":true}
response = client.models.generate_content(
model=model_name,
contents=[
im,
"How do I use three of these numbers to sum up to 30?"
]
)
display(Markdown("## Thoughts"))
display(Markdown(response.candidates[0].content.parts[0].text))
display(Markdown("## Answer"))
display(Markdown(response.candidates[0].content.parts[1].text))
想法
这是我解答这个经典谜语的思考过程:
理解目标:目标是从集合 {7, 9, 11, 13} 中找到三个加起来等于 30 的数字。
初始方法 – 直接加法:我的第一反应是尝试三个数字的不同组合。我可能会从最大的数字开始:
13 + 11 + 9 = 33(太高)
13 + 11 + 7 = 31(太高)
考虑较小的组合:然后我可能会尝试使用较小数字的组合:
9 + 11 + 7 = 27(太低)
注意一个模式(奇数):我观察到所有给定的数字都是奇数。我想到了一个关键的数学概念:
奇数 + 奇数 = 偶数
偶数 + 奇数 = 奇数
因此,三个奇数的总和将始终为奇数。由于 30 是偶数,因此不可能直接将三个整数相加得到 30。
寻找转折/误导:当无法直接解决问题时,这类谜语通常会涉及技巧或文字游戏。我开始考虑数字表示是否有任何可以操纵的地方。
考虑数字的其他解释:数字可以有不同的解释吗?我能以某种方式改变它们的形式吗?这就是翻转或操纵数字的想法的用武之地。
关注潜在的数字转换:我查看每个数字并考虑如何将其转换为可以作为解决方案一部分的另一个数字。数字“9”是显而易见的候选者,因为它在翻转或旋转后可以变成“6”。
测试转换:如果我将其中一个“9”视为“6”,这有帮助吗?让我们尝试替换我之前尝试过的一个“9”:
13 + 11 + 6 = 30 成功!
形式化解决方案:找到组合后,我可以清楚地解释解决方案,突出其中的技巧。这包括说明使用的三个数字,并解释“9”如何变成“6”。
这个过程涉及直接计算、数学推理(数字奇偶性)和创造性解决问题的组合,以识别谜语中隐藏的转折。
答案
这是一个经典的谜语,它利用了我们如何看待数字。你不能简单地将 7、9、11 和 13 这三个数字按原样相加来得到 30。
技巧如下:
将数字 9 倒过来变成 6。
那么解决方案是:
11 + 13 + 6 = 30
示例 4:针对特定知识水平生成问题
这次,问题需要几种类型的知识,包括与物理 C 考试相关的知识。生成的问题并不是有趣的部分,但提出这些问题的推理表明它们并不是随机生成的。
model_name = "gemini-2.0-flash-thinking-exp" # @param ["gemini-1.5-flash-8b","gemini-1.5-flash","gemini-1.5-pro","gemini-2.0-flash-exp", "gemini-2.0-flash-thinking-exp"] {"allow-input":true}
response = client.models.generate_content(
model=model_name,
contents="Give me a practice question I can use for the AP Physics C exam?"
)
display(Markdown("## Thoughts"))
display(Markdown(response.candidates[0].content.parts[0].text))
display(Markdown("## Answer"))
display(Markdown(response.candidates[0].content.parts[1].text))
想法
以下是创建 AP 物理 C 练习题背后的思维过程的细分:
1.分析请求:用户需要 AP 物理 C 考试的练习题。这意味着问题应该具有适当的难度级别,涵盖可能要测试的概念,并且可以使用课程中教授的原理来解决。
2.确定核心概念:AP 物理 C 涵盖力学和电磁学。两者都经常被测试。对于力学,好的主题包括:
牛顿定律和力
功、能量和功率
旋转运动
简谐运动
振荡和波(在力学部分不太常见,在概念上更常见)
对于电磁学,好的主题包括:
电场和力
高斯定律
电势
电容
电流、电阻和电路(DC 和 RC)
磁场和力
安培定律
法拉第定律和感应
3.选择主题和难度级别:对于单个练习题,允许多个部分并连接不同想法的概念是好的。涉及能量和力的力学是一个不错的选择。具体来说,涉及弹簧、摩擦和可能的一些倾斜的系统可以测试几个核心原理。难度应该具有挑战性,但不要过于复杂——可以在合理的时间范围内完成。
4.设计场景:水平表面上的块连接到弹簧上是经典设置。增加摩擦力可以引入真实感并测试对非保守力的理解。在开始时包括速度会增加动态元素。
5.制定问题部分:逻辑地构建问题,从简单概念到复杂概念。
(a) 自由体图:一项基本技能。需要识别并正确标记力。
(b) 弹簧常数:测试在平衡状态下应用胡克定律的能力。这将力和弹簧特性联系起来。
(c) 摩擦做功:介绍非保守力做功的概念。需要了解力、位移和功之间的关系。
(d) 最大压缩:核心能量守恒问题。需要建立一个考虑初始动能、弹簧势能和摩擦做功的能量平衡方程。这通常是 AP 物理 C 中测试的一项关键技能。
(e) 恢复平衡速度:另一个能量守恒问题,但现在是从压缩状态开始。测试对运动过程中能量如何转换的理解。
指定考试相关信息:对于让它感觉像一个真正的 AP 问题至关重要。
6.背景:清楚地说明哪个 AP 物理 C 考试(力学)。
涵盖的概念:列出所涉及的关键物理原理。这有助于用户理解重点。
假设:提及任何简化假设(无质量弹簧、理想表面,除非另有说明)。
说明:提供有关展示工作和使用适当单位的明确说明。
时间建议:给出一个现实的时间估计,以鼓励在考试条件下练习。
提供详细的解决方案:解决方案与问题同样重要。
7.清晰的步骤:显示解决方案的逻辑进展。
相关方程式:明确说明使用的公式。
代数运算:演示求解未知数的步骤。
带单位的数值答案:提供带正确单位的最终数值答案。
推理解释:简要解释采取每一步的原因,强化底层物理。这对于学习至关重要。
8.自我纠正/改进:回顾问题和解决方案。有任何歧义吗?难度是否合适?解决方案中的步骤是否清晰易懂?例如,确保一致使用变量和清晰的符号。最初,我可能考虑过更复杂的场景,比如斜坡,但选择了水平表面以保持第一个练习问题的集中性。
通过遵循此过程,目标是创建一个代表 AP 物理 C 考试的练习题,有效测试关键概念,并为学生提供宝贵的学习机会。
回答
好的,这是 AP 物理 C:力学考试的练习题,重点关注工作、能量和旋转运动:
问题:
一个质量为 M 且半径为 R 的均匀实心圆盘最初静止在水平表面上。一根细绳缠绕在圆盘的边缘。在绳子的自由端施加一个大小为 F 的恒定水平力,使圆盘旋转和平移。圆盘与表面之间的动摩擦系数为 μk。
(a) 在下图中,画出并标记作用在圆盘上的所有力。
(b) 用 M、R、F、μk 和基本常数,推导出圆盘质心平移加速度 a 大小的表达式。
(c) 用 M、R、F、μk 和基本常数,推导出角加速度 α 大小的表达式
圆盘绕其质心的转动速度。
(d) 确定圆盘质心移动距离 d 时施加的力 F 所做的功。
(e) 确定圆盘质心移动距离 d 时旋转动能的变化。
(f) 使用功能定理,确定圆盘质心移动距离 d 后的平移速度 v。
图表:
/ \
| | <– 力 F
_______/
o(质心)
|
|
_(表面)
涵盖的概念:
自由体图
平移和旋转的牛顿第二定律
扭矩
固体圆盘的转动惯量
力所做的功
旋转动能
功能定理
解答技巧:
记住要同时考虑平移和旋转运动。
将质心的平移加速度与角加速度联系起来。
注意力和扭矩的符号和方向。
固体圆盘绕其质心的转动惯量为 (1/2)MR2。
这个问题测试学生的以下能力:
识别和应用相关物理原理。
绘制准确的自由体图。
建立和求解方程组。
将功能定理应用于具有平移和旋转运动的系统。
祝你好运!尝试后,如果您想要解决方案,请告诉我。
下一步
尝试 AI Studio 中的 Gemini 2.0 Flash Thinking 模型,解决所有疯狂的问题和脑筋急转弯。
有关 Gemini 2.0 功能的更多示例,请查看食谱的 Gemini 2.0 文件夹。您将学习如何使用 Live API、使用多种工具或使用 Gemini 2.0 空间理解能力。