Ollama进阶,在Python、Java、Go项目中集成Deepseek、QWQ大模型
Ollama系列文章:
Ollama入门,一键启动本地DeepSeek大模型
Ollama入门,Ollama技术架构与原理
Ollama进阶,在Python、Java、Go项目中集成Deepseek、QWQ大模型
Ollama进阶,在Javascript(nodejs)前后端项目中集成Deepseek、QWQ大模型
Ollama高手,玩转本地自定义大模型(LLM)
Ollama高手,调优Ollama环境变量,提高性能与安全性
Ollama高手,调优Ollama模型参数,提高模型输出质量
在“Ollama入门,一键启动本地DeepSeek大模型”一文中,我们介绍了Ollama的基本使用方法,同时也推荐了ChatBox、Cherry Studio等AI智能客户端来完成文字、图片、语音等多模态输入,实现与 AI 的交互。
但是,仅仅这样常常不足以满足实际的需要,而在线版的Deepseek、ChatGPT、豆包往往可以提供更好功能,这样在本地部署DeepSeek大模型就成了geek的自娱自乐了,因此我们必须将Ollama整合到项目中去,让它与自有系统整合起来,实现更加丰富的功能。
1、如何调用Ollama服务?
Ollama主要提供了两种方式供开发者在不同编程语言中使用其功能:
RESTful API: Ollama 提供强大的 RESTful API,使开发者能够方便地与大型语言模型进行交互。通过这些 API,用户可以发送请求并接收模型生成的响应,应用于自然语言处理、文本生成等任务。
SDK: Ollama 提供了官方的 Python SDK、Go SDK,允许开发者在 Python 环境中与本地运行的模型进行交互。通过该 SDK,用户可以轻松地将自然语言处理任务集成到 Python 项目中,执行各种操作,如文本生成、对话生成、模型管理等,而无需手动调用命令行。
2、如何查看和配置Ollama运行端口
查看Ollama运行端口
Ollama 默认监听 11434 端口,通常可以使用 lsof 命令(适用于 macOS 和 Linux)、netstat 命令(适用于 Windows 和 Linux)查看端口使用情况,如:
lsof -i -P -n | grep ollama
如果有输出,说明 Ollama 正在特定端口监听。也可以查看 Ollama 配置中的OLLAMA_HOST参数值来确定Ollama的运行端口:
echo $OLLAMA_HOST
如果 OLLAMA_HOST 被设置,例如:0.0.0.0:12345
自定义Ollama运行端口
如果项目需要自定义一个端口,则可以通过下面的方式设置一个临时可用的端口:
export OLLAMA_HOST=0.0.0.0:12345
ollama serve
如果你希望 每次启动 Ollama 时都使用新的端口,可以把 OLLAMA_HOST 添加到 shell 配置文件:
在Linux/macOS下,可以在 ~/.bashrc 或 ~/.zshrc(如果使用 Zsh)中添加:
export OLLAMA_HOST=0.0.0.0:12345
然后运行:
source ~/.bashrc # 或者 source ~/.zshrc
在Windows下,可以通过修改系统环境变量来完成同样的设置。
3、如何在Java中调用Ollama RESTful API
Ollama RESTful API规范
Ollama 提供了一套 RESTful API,使开发者能够方便地与大型语言模型进行交互。以下是主要的 API 端点及其调用参数:
文本生成接口
端点:
POST /api/generate
描述:
使用指定的模型,根据提供的提示生成响应。此端点支持流式响应,即服务器会持续发送数据流,直到完成生成。
请求参数:
• model (必需):模型名称。
• prompt:要生成响应的提示文本。
• suffix:模型响应后的文本。
• images (可选):包含 base64 编码的图像列表(适用于支持多模态的模型,如 llava)。
• format:指定返回响应的格式,可以是 json 或 JSON 模式。
• options:模型的其他参数,例如 temperature。
• system:系统消息(会覆盖 Modelfile 中定义的内容)。
• template:要使用的提示模板(会覆盖 Modelfile 中定义的内容)。
• stream:如果设置为 false,响应将作为单个对象返回,而不是流式对象。
• keep_alive:控制模型在内存中保持加载的时间,例如 “5m” 表示 5 分钟,0 表示生成响应后立即卸载模型。
请求示例:
curl http://localhost:11434/api/generate -d '{
"model": "qwq",
"prompt": "你是谁?"
}'
对话补全
端点:
POST /api/chat
描述:
使用指定的模型,基于提供的对话历史生成下一条消息。此端点也支持流式响应。
请求参数:
• model (必需):模型名称。
• messages:对话的消息列表,用于保持对话上下文。每条消息包含以下字段:
• role:消息发送者的角色,例如 user、assistant。
• content:消息内容。
• tools:模型可使用的工具列表(以 JSON 格式提供)。
• format:指定返回响应的格式,可以是 json 或 JSON 模式。
• options:模型的其他参数,例如 temperature。
• stream:如果设置为 false,响应将作为单个对象返回,而不是流式对象。
• keep_alive:控制模型在内存中保持加载的时间。
示例请求:
curl http://localhost:11434/api/chat -d '{
"model": "qwq",
"messages": [
{ "role": "user", "content": "你是谁?" }
]
}'
编写Java代码,对接API
在 Java 中,您可以使用诸如 Apache HttpClient、OkHttp 等 HTTP 客户端库来发送 HTTP 请求。以下是一个使用 Apache HttpClient 的示例:
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.Map;
public class OllamaClient {
private static final String OLLAMA_API_URL = "http://localhost:11434/api/generate";
public static void main(String[] args) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost postRequest = new HttpPost(OLLAMA_API_URL);
postRequest.setHeader("Content-Type", "application/json");
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("model", "llama2");
requestBody.put("prompt", "你好,Ollama!");
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(requestBody);
postRequest.setEntity(new StringEntity(json));
try (CloseableHttpResponse response = httpClient.execute(postRequest)) {
String responseString = EntityUtils.toString(response.getEntity());
System.out.println("Ollama 模型响应: " + responseString);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上述示例中,OLLAMA_API_URL 是 Ollama 的 API 端点,model 指定要使用的模型名称,prompt 是发送给模型的提示信息。
如果使用 Spring Boot 框架时,可以通过集成 Spring AI 来简化与 Ollama 的交互。
添加依赖: 在pom.xml 文件中添加以下依赖项:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
配置应用程序: 在 application.yml 中配置 Ollama 的基本信息:
spring:
ai:
ollama:
base-url: http://localhost:11434
编写控制器: 创建一个 REST 控制器,通过注入 OllamaChatModel 来与 Ollama 交互:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.ai.ollama.OllamaChatModel;
@RestController
public class OllamaController {
@Autowired
private OllamaChatModel ollamaChatModel;
@GetMapping("/chat")
public String chat(@RequestParam String prompt) {
return ollamaChatModel.chat(prompt);
}
}
通过上述配置,就可以在 Spring Boot 应用中轻松地与 Ollama 模型进行交互。
4、如何在Python中使用Ollama SDK
Ollama 提供了 HTTP API 和 Python SDK,可以使用 requests 发送 API 请求,也可以直接使用 Ollama 的 Python SDK 进行交互。
安装 Ollama 官方 Python SDK
可以通过pip安装Ollama 的 Python SDK
pip install ollama
使用 Python 代码调用Ollama服务
import ollama
response = ollama.chat(model='qwq', messages=[{'role': 'user', 'content': '你是谁?'}])
print(response['message']['content'])
其中:
• model=‘qwq’ 指定使用 QWQ 作为模型,可以通过 ollama list
命令查看安装在本地的模型。
• messages=[…] 传入对话内容,role 设为 user 代表用户输入的内容
• response[‘message’][‘content’] 获取 AI 生成的回答
5、如何在Go语言中使用Ollama SDK
在Ollama官方 GitHub 仓库的 api 包中提供了用于 Go 语言的 SDK,可以实现在Go语言中实现与文本生成和对话补全、模型管理等功能。
这里我们使用第三方的OllamaGo,这是一个强大且功能丰富的Go客户端,可将Ollama的功能无缝集成Go应用程序中。
安装OllamaGO
go get github.com/prathyushnallamothu/ollamago
使用 OllamaGO 代码调用Ollama服务
package main
import (
"context"
"fmt"
"log"
"time"
ollama "github.com/prathyushnallamothu/ollamago"
)
func main() {
baseURL := "http://localhost:11434"
client := ollama.NewClient(
ollama.WithBaseURL(baseURL),
ollama.WithTimeout(time.Minute*5)
)
resp, err := client.Generate(context.Background(), &ollama.GenerateRequest{
Model: "qwq",
Prompt: "你是谁?",
})
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Response)
}
OllamaGO 的更多功能
Chat Completions
messages := []ollama.Message{
{
Role: "system",
Content: "You are a helpful assistant.",
},
{
Role: "user",
Content: "What's the weather like today?",
},
}
resp, err := client.Chat(context.Background(), &ollama.ChatRequest{
Model: "qwq",
Messages: messages,
})
Streaming Responses
req := &ollama.GenerateRequest{
Model: "llama2",
Prompt: "Write a story about a space adventure",
Stream: true,
}
err := client.GenerateStream(context.Background(), req, func(response *ollama.GenerateResponse) error {
fmt.Print(response.Response)
return nil
})
Model Management
models, err := client.ListModels(context.Background())
err = client.PullModel(context.Background(), &ollama.PullModelRequest{
Name: "llama2",
})
err = client.DeleteModel(context.Background(), &ollama.DeleteModelRequest{
Name: "llama2",
})
Embeddings
resp, err := client.CreateEmbedding(context.Background(), &ollama.EmbedRequest{
Model: "llama2",
Prompt: "Hello, world!",
})
作者:GeekABC