学习如何在Java中使用Ollama生成结构化输出,通过实用示例和逐步指导。
https://it.wikipedia.org/wiki/Casina_Vanvitelliana 这链接指向意大利维基百科上的凡维泰利小屋页面。
大型语言模型(LLM)的应用突出了生成和使用如JSON或CSV这样的结构化数据的重要性。本文将会使用Ollama(一个可以在笔记本上运行的开源LLM运行器)和langchain4j(一个受Python框架LangChain启发的Java库)。
主要有四种方法,可以从AI模型生成JSON格式的输出,如下:
- 提示:通过结构良好的请求指导模型生成JSON输出。此方法被所有推理引擎支持。
- 函数调用:指定模型可以调用的函数,这些函数带有JSON格式的参数。
- JSON模式下的结构化输出:某些模型直接支持特定模式,以生成结构化的JSON输出。
- 带有JSON响应模式的结构化输出:定义一个JSON模式,模型在生成输出时会遵循该模式。
在这篇文章中,我们将探讨第一个方面“提示”。
示例场景:根据不同的指标排名前10的国家想象你需要快速了解人口最多的前10个国家的情况,以及一些关键指标:
- 人口数量
- 毕业生比例
- 用于科研和教育的GDP比例
工作流程:
- 你需要让 Ollama 以“服务器”模式运行(例如,使用
ollama serve
命令),这样它会让它在本地暴露一个HTTP端点(默认为http://localhost:11434
)。 - 使用 Ollama 的拉取命令拉取安装 llama3.1:1b
- 你需要使用 langchain4j 来构建你的提示并处理响应,我们会简单地用 Jackson 来简化最终的解析步骤,你可以根据需要将其调整为更复杂的 langchain4j 工作流程。
启动ollama服务
默认情况下,Ollama 会作为一个服务来安装,并已经在 http://localhost:11434
监听等待连接。你可以用一个简单的 curl
命令快速测试一下。
curl -X POST http://localhost:11434/ -d '{"prompt": "Hello!"}'
运行此命令向本地服务器发送POST请求并附带一个问候消息。
2. 安装 llama3.2:1b我们将使用Llama 3.2的轻量版以适应我的笔记本电脑有限的资源,该电脑配备了NVIDIA GeForce MX250 GPU,配备4GB的专用显存。
ollama pull llama3.2:1b
正在拉取镜像清单
正在下载 74701a8c35f6... 100% ▕████████████████████████████████████████████████████████▏ 1.3 GB
正在下载 966de95ca8a6... 100% ▕████████████████████████████████████████████████████████▏ 1.4 KB
正在下载 fcc5a6bec9da... 100% ▕████████████████████████████████████████████████████████▏ 7.7 KB
正在下载 a70ff7e570d9... 100% ▕████████████████████████████████████████████████████████▏ 6.0 KB
正在下载 4f659a1e86d7... 100% ▕████████████████████████████████████████████████████████▏ 485 B
正在验证 sha256 校验和
写入清单文件
成功完成
3. 使用langchain4j来创建一个Ollama聊天模型
以下展示了一个如何使用langchain4j让Ollama在Java中以结构化的格式(例如JSON)生成此数据的示例。
package com.sandbox.llm;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.request.ResponseFormat;
import dev.langchain4j.model.ollama.OllamaChatModel;
public class OllamaExample {
public static void main(String[] args) {
ChatLanguageModel model = OllamaChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("llama3.2:1b")
.responseFormat(ResponseFormat.JSON)
.timeout(java.time.Duration.ofMinutes(5))
.build();
// 定义一个提示,要求输出严格的JSON
String prompt = """
你是一个乐于助人的助手。请将以下数据以JSON格式输出:
{
"countries": [
{
"name": "...",
"population": 0,
"graduatesDistributionPct": 0,
"gdpResearchEducationPct": 0
}
]
}
用人口最多的前10个国家填充“countries”数组。
提供以下字段的真实数据:
- 名称
- 人口
- 毕业生分布百分比
- GDP用于研究和教育的比例
仅返回有效的JSON,不附加任何注释。
""";
// 通过我们定制的LLM调用Ollama
String rawJsonOutput = model.generate(prompt);
// 打印来自Ollama的原始JSON输出以便检查
System.out.println("=== 来自Ollama的原始JSON输出 ===");
System.out.println(rawJsonOutput);
}
}
以下你可以看到,即使是最简单的提示也会使 GPU 使用率达到 100%。当使用更复杂的模型运行相同提示时,执行操作会经常超时。接近 100% 的 3D 指标反映了处理模型任务所需的计算工作量,因为这些操作高度依赖 GPU 内核进行计算。同时,Copy 和 Copy 1 指标保持为零,因为在该特定任务中,几乎没有数据在 GPU 和系统内存之间或 GPU 内存内部传输。
小贴士与最佳做法- 格式提示:要明确。提供一个 JSON “模版”,并明确说明“仅返回有效的 JSON 数据”。
- 验证响应:有时,LLMs 可能会包含额外的文本或生成格式错误的 JSON。实现检查或使用 try-catch 块(如上所示)来处理潜在的解析错误。
- 安全:在本地运行 Ollama 可以保持数据仅限于您的机器。但是,如果您将 Ollama 部署到服务器上,请确保端点的安全(例如,通过 HTTPS 或私有网络)。
通过 langchain4j 调用 Ollama 是将本地大语言模型集成到 Java 应用程序中的强大方法。这使得可以进行本地推理,从而保护隐私并减少延迟。但对于我许多实验而言,使用大型语言模型的成本太高了。因此,我喜欢使用 langchain4j,因为它可以让我从本地的 Ollama 切换到远程推理服务,比如 Groq。
这篇文章仅代表我个人的看法,并且不代表我雇主的立场、观点或意见。
可以在这里关注我:https://www.linkedin.com/in/farinamaurizio/ 或 https://x.com/MaurizioDouble0。
注:将ChatGPT视为合著者
共同学习,写下你的评论
评论加载中...
作者其他优质文章