2026.05.09 更新:
本地调用太吃资源了,改为使用 Google AIStudio 提供的免费结构,通过轮询的方式来薅羊毛。
library(httr2)
# 替换为你的实际 API Key
api_key <- Sys.getenv("GEMINI_API_KEY1")
# 获取模型列表
models_req <- request("https://generativelanguage.googleapis.com/v1beta/models") |>
req_headers("x-goog-api-key" = api_key) |>
req_perform()
models_list <- models_req |> resp_body_json()
# 打印出所有包含 "gemma" 的模型名称
gemma_models <- sapply(models_list$models, function(x) x$name)
print(gemma_models[grepl("gemm|gemini", gemma_models, ignore.case = TRUE)])
# [1] "models/gemini-2.5-flash"
# [2] "models/gemini-2.5-pro"
# [3] "models/gemini-2.0-flash"
# [4] "models/gemini-2.0-flash-001"
# [5] "models/gemini-2.0-flash-lite-001"
# [6] "models/gemini-2.0-flash-lite"
# [7] "models/gemini-2.5-flash-preview-tts"
# [8] "models/gemini-2.5-pro-preview-tts"
# [9] "models/gemma-4-26b-a4b-it"
# [10] "models/gemma-4-31b-it"
# [11] "models/gemini-flash-latest"
# [12] "models/gemini-flash-lite-latest"
# [13] "models/gemini-pro-latest"
# [14] "models/gemini-2.5-flash-lite"
# [15] "models/gemini-2.5-flash-image"
# [16] "models/gemini-3-pro-preview"
# [17] "models/gemini-3-flash-preview"
# [18] "models/gemini-3.1-pro-preview"
# [19] "models/gemini-3.1-pro-preview-customtools"
# [20] "models/gemini-3.1-flash-lite-preview"
# [21] "models/gemini-3.1-flash-lite"
# [22] "models/gemini-3-pro-image-preview"
# [23] "models/gemini-3.1-flash-image-preview"
# [24] "models/gemini-3.1-flash-tts-preview"
# [25] "models/gemini-robotics-er-1.5-preview"
# [26] "models/gemini-robotics-er-1.6-preview"
# [27] "models/gemini-2.5-computer-use-preview-10-2025"
# [28] "models/gemini-embedding-001"
# [29] "models/gemini-embedding-2-preview"
# [30] "models/gemini-embedding-2"
# [31] "models/gemini-2.5-flash-native-audio-latest"
# [32] "models/gemini-2.5-flash-native-audio-preview-09-2025"
# [33] "models/gemini-2.5-flash-native-audio-preview-12-2025"
# [34] "models/gemini-3.1-flash-live-preview"
昨天 Google 发布了开源大预言模型 Gemma 4 的系列模型。这次开源协议有所变更,对企业应用更加友好,Google 显然也有其在开源生态上的目的。 但对普通开发者来说,最直观的利好是本地部署的门槛进一步降低了。
以我手头的 Mac M4 16G 版本为例,本地直接跑 e4b(40 亿参数)尺寸的小模型毫无压力,日常用它来执行一些简单的 NLP 任务刚好够用。
在终端通过 Ollama 启动服务之后,我们可以直接在 R 中进行调用。 不需要安装复杂的深度学习环境,只用原生的 httr2 包就能完成请求,并让模型输出规范的 JSON 数据。
library(httr2)
ask_gemma_json <- function(prompt) {
req <- request("http://localhost:11434/api/generate") |>
req_body_json(list(
model = "gemma4:e4b",
prompt = prompt,
stream = FALSE,
format = "json", # 强迫症福音:只允许输出合法的 JSON 格式
options = list(temperature = 0.0)
))
resp <- req_perform(req)
# 因为返回的是标准 JSON 字符串,我们可以直接用 jsonlite 把它变成 R 的 List
json_str <- resp_body_json(resp)$response
jsonlite::fromJSON(json_str)
}
# 测试结构化提取
prompt_json <- "提取这句话中的公司名和情感得分(1-10分),并严格以JSON格式输出,键名为 company 和 score。句子:苹果公司本季度营收大涨,超出华尔街预期。"
structured_data <- ask_gemma_json(prompt_json)
# > structured_data
# $company
# [1] "苹果公司"
#
# $score
# [1] 8
在上面的 API 调用中,能够实现快速响应,主要归功于以下两点参数控制:
- 利用
temperature = 0.0让模型每次预测下一个词时只选概率最高的那个,直接跳过了概率采样计算的耗时,同时也保证了输出的确定性。 - 结合明确的 Prompt 和 JSON 格式锁,切断了模型生成“思考”和“分析”等中间 Token 的链条。原本可能要生成 200 个废话词汇(需要 10 秒),现在被强行压缩到只生成 5 个有效结果词汇(不到 1 秒)。