本地部署llama 3.1生成API并且内网穿透后Spring Boot调用

首先看下流程图,大概就是下载ollama客户端后下载llama3.1模型启动服务,使用花生壳内网穿透获得新的API地址,然后SpringBoot中采用OKHttpClient调用。

01、下载安装ollama客户端

官网下载地址: https://ollama.com/download

选择自己的系统,我这里演示Windows的

下载完成后获得.exe文件双击安装,一直下一步就行

安装完成后,Win+R键调出运行窗口:

ollama -v

出现 版本号就成功了

 02、下载Llama 3.1 大模型

因为大模型比较大,推荐不要使用默认下载地址(默认下载到C盘)

(1)修改环境变量

搜索环境

新建我这三个变量

OLLAMA_HOST   0.0.0.0:11434

OLLAMA_ORIGINS  *

OLLAMA_MODELS  [自定义模型存的位置]

 (2)下载llama3.1模型

下载地址:https://ollama.com/library/llama3.1

 

这里家用电脑就选8b就行,复制命令:

ollama run llama3.1

键盘win+R 打开cmd运行上面这个命令

 下载完成后随便和他聊会天,测试下

原版的llama3.1-8b模型中文能力几乎没有,后面我出如何改中文模型这里不过多说明

可以对话,就说明安装成功

  03、测试API

上面的cmd不要关!!!

(1)浏览官方API文档

API文档地址:https://github.com/ollama/ollama/blob/main/docs/api.md#create-a-blob

快速上手试一试

打开你的postman,我这里用的是Apifox,都一样,能发post请求就行

 

返回成我这样就成功了

注:如果出现这个错误

格式化一下就可以 

postman里面应该是“美化”,反正都一样。

 03、内网穿透

首先下载花生壳客户端

下载地址:花生壳客户端官方下载 - 贝锐花生壳官网

一样获得.exe的安装文件,双击一直下一步安装完成(可以自定义安装路径)

 

 点击添加映射,去网页填上自己的IPV4的地址

 最后获得了映射的公网IP

:关闭之前启动的cmd (重要

重新用ollama serve启动

ollama serve

 

第一个报错:是因为开机自动启动ollama,用任务管理器关掉就可以

看到第二个的内容就是正常启动了

将你的内网穿透的地址复制到浏览器如果出现这个就成功了

也可以用postman测试玩一下

 04、Spring Boot中api调用

打开你的springboot项目

public String talkToLlama(String text) throws IOException {
        String url = "https://你的内网穿透地址/api/chat";//请求地址

        OkHttpClient client = new OkHttpClient()
                .newBuilder()
                .connectTimeout(60, TimeUnit.SECONDS) // 设置连接超时时间
                .writeTimeout(60, TimeUnit.SECONDS) // 设置写入超时时间
                .readTimeout(60, TimeUnit.SECONDS) // 设置读取超时时间
                .build();

        // 定义请求体的媒体类型为JSON
        MediaType JSON = MediaType.get("application/json; charset=utf-8");

        String json = "{\n" +
                "\"model\": \"llama3.1\"," +
                "\"messages\": [{\"role\": \"user\", \"content\": \""+text+"\"}],"+
                "\"stream\": "+false+"}";
        RequestBody body = RequestBody.create(json, JSON);

        //发送POST请求并获取响应:
        Request request = new Request.Builder().url(url)
                .header("Authorization", "Bearer " + apiKey)
                .header("Content-Type", "application/json") // 显式设置Content-Type头
                .post(body) // 使用POST方法并传递请求体
                .build();
        // 发送请求并获取响应
        Response response = client.newCall(request).execute();
        String result = response.body().string();

        JSONObject returnJsonObject = new JSONObject(result);
        JSONObject messages = returnJsonObject.getJSONObject("message");
        // 提取 content 的值
        String content = messages.getString("content").replace("“", "").replace("\"", "").replace("\r", "").replace("\n", "");
        // 输出 content 的值
        System.out.println("回答的: " + content);
        return  content;
    }

需要使用的时候调用:

String resultText = talkToLlama("自我介绍下")

总结:

经过实测,虽然llama-8b的使用体验不如ChatGPT-4等成熟的闭源大模型(别拿405b的比较,哪个家用电脑用的起),但是本地运行模式还是有其存在的意义的,对于私密性要求较强的用户,也可以在断网的情况下本地加载运行,不用担心相关信息泄露等等。

免责声名:

一切均严格参照ollama开源策略,没有任何侵权意图,本文章全由自己编写,如出现任何问题请联系我,我将删除。

Ollema是一个轻量级、高度可配置的Web框架,它允许开发者快速构建RESTful API和服务。FastAPI则是由意大利人Gabriele Oliani创建的现代高性能Python web框架,特别适合构建RESTful API,以其简洁的API设计和优秀性能而闻名。 结合ollama和fastapi,你可以创建一个类似ChatGPT风格的流式响应服务。首先,你需要在ollama中设置基础路由结构,然后利用fastapi的功能来处理HTTP请求,特别是其异步特性,可以让你的API能够更顺畅地返回大量数据。你可以创建一个自定义视图或处理器,通过分页或者迭代器逐步返回结果,模拟逐行或逐块的数据输出,类似于聊天交互的体验。 以下是简单的步骤概述: 1. **设置ollama路由**:定义API的基本结构,如`@app.route('/generate')`。 2. **fastapi处理函数**:编写异步函数,例如`async def generate_data(request: Request) -> Response[StreamResponse]`,这里使用了`StreamResponse`来表示流式输出。 3. **分页或迭代**:使用`yield from`生成器,按需提供每个数据块,而不是一次性加载所有内容。 ```python from fastapi import FastAPI, StreamingResponse from starlette.responses import StreamResponse @app.route("/generate", methods=["GET"]) async def generate_stream(): # 假设你有一个生成数据的大列表 data = [...] async def generate(): for item in data: yield item.to_json() return StreamingResponse(generate(), media_type="application/json") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值