ellmer 
ellmer 让从 R 中使用大型语言模型(LLM)变得简单。它 支持多种 LLM 提供商,并实现了一系列丰富的功能,包括流式输出、工具/函数调用、结构化 数据提取等。
ellmer 是 Posit 创建的一系列 LLM 相关包之一:
- 在 python 中寻找类似的东西?请查看 chatlas!
- 想要评估你的 LLM?请尝试 vitals。
- 需要 RAG?请查看 ragnar。
- 想要制作一个美观的 LLM 驱动聊天机器人?请考虑 shinychat。
- 正在使用 MCP?请查看 mcptools。
安装
你可以从 CRAN 安装 ellmer:
install.packages("ellmer")
提供商
ellmer 支持多种模型提供商。官方提供商 得到积极维护,在错误修复和新 功能方面享有优先支持。社区提供商由 社区贡献和维护;欢迎提交改进它们的贡献。
官方提供商
- Anthropic 的 Claude:
chat_anthropic()。 - AWS Bedrock:
chat_aws_bedrock()。 - Azure OpenAI:
chat_azure_openai()。 - Databricks:
chat_databricks()。 - DeepSeek:
chat_deepseek()。 - Google Gemini/Vertex AI:
chat_google_gemini(),chat_google_vertex()。 - Ollama:
chat_ollama()。 - OpenAI:
chat_openai()。 - Posit AI:
chat_posit()。 - Snowflake Cortex:
chat_snowflake()和chat_cortex_analyst()。
社区提供商
- Cloudflare:
chat_cloudflare()。 - Groq:
chat_groq()。 - Hugging Face:
chat_huggingface()。 - LM Studio:
chat_lmstudio()。 - Mistral:
chat_mistral()。 - OpenRouter:
chat_openrouter()。 - perplexity.ai:
chat_perplexity()。 - Portkey:
chat_portkey()。 - VLLM:
chat_vllm()。
提供商/模型选择
如果你在组织内使用 ellmer,你可能有内部
政策,限制你只能使用大型云提供商的模型,
例如 chat_azure_openai()、chat_aws_bedrock()、chat_databricks(),
或 chat_snowflake()。
如果你出于个人探索目的使用 ellmer,你将拥有更多 自由度,因此我们有一些建议帮助你入门:
-
chat_openai()或chat_anthropic()是不错的起点。chat_openai()默认使用 GPT-5.4,但你可以使用model = "gpt-5.4-nano"来选择更便宜、更快的模型。chat_anthropic()默认使用 Claude Sonnet 4.6,我们发现 它在编写 R 代码方面表现尤为出色。 -
chat_google_gemini()是一个强大的模型,提供免费层级(缺点是 你的数据会被 用于 改进模型),如果你不想花费任何钱,它是一个很好的起点。 -
chat_ollama(),它使用 Ollama,允许你 在自己的计算机上运行模型。虽然你能在本地运行的最大模型 不如最先进的托管模型,但它们 不会共享你的数据,并且实际上免费。
身份验证
身份验证根据提供商的不同而略有不同。 一些流行的提供商(包括 OpenAI 和 Anthropic)要求你获取 一个 API 密钥。我们建议你将其保存在环境变量中,而不是 直接在代码中使用它,并且如果你部署了一个使用 ellmer 的应用或报告 到另一个系统,你需要确保该 环境变量在那里也可用。
ellmer 还会自动检测许多由大型云提供商使用的基于 OAuth 或 IAM 的
凭据(目前
chat_azure_openai()、chat_aws_bedrock()、chat_databricks()、
chat_snowflake())。这包括由 Posit
Workbench
和 Posit
Connect 管理的这些平台的凭据。
如果你发现 ellmer 无法从这些云提供商之一检测凭据的情况, 请随时提交一个 issue;如果需要,我们很乐意添加 更多的身份验证机制。
使用 ellmer
你可以以几种不同的方式使用 ellmer,具体取决于 你是交互式工作还是编程式工作。它们都以 创建一个新的聊天对象开始:
library(ellmer)
chat <- chat_openai("Be terse", model = "gpt-4o-mini")
聊天对象是有状态的 R6 对象:它们
保留对话的上下文,因此每个新查询都建立在
之前的查询之上。你使用 $ 调用它们的方法。
交互式聊天控制台
使用 ellmer 最具交互性且最少编程性的方式是
在 R 控制台或浏览器中通过 live_console(chat) 或
live_browser() 直接进行聊天:
live_console(chat)
#> ╔════════════════════════════════════════════════════════╗
#> ║ Entering chat console. Use """ for multi-line input. ║
#> ║ Press Ctrl+C to quit. ║
#> ╚════════════════════════════════════════════════════════╝
#> >>> Who were the original creators of R?
#> R was originally created by Ross Ihaka and Robert Gentleman at the University of
#> Auckland, New Zealand.
#>
#> >>> When was that?
#> R was initially released in 1995. Development began a few years prior to that,
#> in the early 1990s.
请记住,chat 对象会保留状态,因此当你进入 chat 控制台时,与该 chat 对象之前的任何交互仍然是对话的一部分,而你在 chat 控制台中进行的任何交互在你退出并返回到 R 提示符后都会持续存在。无论你使用哪个 chat 函数,这都是正确的。
交互式方法调用
第二种最具交互性的聊天方式是调用 chat() 方法:
chat$chat("What preceding languages most influenced R?")
#> R was primarily influenced by:
#>
#> 1. **S** - The predecessor to R, which introduced many foundational concepts.
#> 2. **Scheme** - A dialect of Lisp that influenced R's functional programming
#> aspects.
#> 3. **Fortran** - Influenced R's efficiency and mathematical capabilities.
#> 4. **C** - Impacted R's performance and low-level programming features.
#>
#> These languages contributed to R's design and functionality in statistics and
#> data analysis.
如果在全局环境中初始化聊天对象,chat
方法会将响应流式传输到控制台。当整个响应
接收完毕后,它也会(不可见地)作为字符向量返回。
这在您希望看到响应到达时的情况,但不想进入聊天控制台时很有用。
如果您想询问关于图像的问题,您可以使用 content_image_file() 和/或
content_image_url() 传递一个或多个额外的输入参数:
chat$chat(
content_image_url("https://www.r-project.org/Rlogo.png"),
"Can you explain this logo?"
)
#> The logo features a stylized letter "R" within a circular shape. The design
#> reflects the programming language R, which is widely used for statistical
#> analysis and data visualization. The circular element suggests continuity and
#> completeness, while the bold "R" emphasizes its identity. Overall, the logo
#> conveys modernity and practicality, aligning with R's functionality in data
#> science.
流式传输与捕获
在大多数情况下,ellmer 会将输出流式传输到控制台。你可以通过在创建聊天对象时或调用 $chat() 时设置 echo 参数来控制此行为。将 echo = "none"
设置为返回字符串:
my_function <- function() {
chat <- chat_openai("Be terse", model = "gpt-4o-mini", echo = "none")
chat$chat("What is 6 times 7?")
}
str(my_function())
#> 'ellmer_output' chr "6 times 7 is 42."
如有需要,你可以使用 echo
参数手动控制此行为。当结果不打算供人类阅读,或者你希望在显示之前处理响应时,
这在用 ellmer 进行编程时非常有用。
了解更多
ellmer 附带了一系列 vignettes,帮助你深入学习:
- 在
vignette("ellmer")中学习关键术语并查看示例用例。 - 在
vignette("prompt-design")中学习如何设计你的提示词。 - 在
vignette("tool-calling")中了解工具/函数调用。 - 在
vignette("structured-data")中学习如何提取结构化数据。 - 在
vignette("streaming-async")中了解流式和异步 API。