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

物联沃分享整理
物联沃-IOTWORD物联网 » Ollama进阶,在Python、Java、Go项目中集成Deepseek、QWQ大模型

发表回复