1、下载ollama

1)https://ollama.com 进入网址,点击download下载
2)下载后直接安装即可。

2、启动配置模型

默认是启动cmd窗口直接输入

1 ollama run llama3

启动llama3大模型 或者启动千问大模型

1 ollama run qwen2

启动输入你需要输入的问题即可

3、配置UI界面

安装docker
并部署web操作界面

1 docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui --restart always ghcr.io/open-webui/open-webui:main

安装完毕后,安装包较大,需等待一段时间。
localhost:3000即可打开网址

4、搭建本地知识库

AnythingLLM

5、配置文件

开发11434端口,便于外部访问接口,如果跨域访问的话配置OLLAMA_ORIGINS=*

Windows版

只需要在系统环境变量中直接配置,

OLLAMA_HOST为变量名,"0.0.0.0:11434"为变量值

1 OLLAMA_HOST= "0.0.0.0:11434"

MAC版

配置OLLAMA_HOST

1 sudo sh -c 'echo "export OLLAMA_HOST=0.0.0.0:11434">>/etc/profile'launchctl setenv OLLAMA_HOST "0.0.0.0:11434"

Linux版

配置OLLAMA_HOST

1 Environment="OLLAMA\_HOST=0.0.0.0"

6、程序调用接口

golang实现例子:流式响应速度更快,用户体验更佳。

golang例子:非流式响应

package main

import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"strings"
"time"
)

const (
obaseURL = "http://localhost:11434/api"
omodelID = "qwen2:0.5b" // 选择合适的模型
oendpoint = "/chat" //"/chat/completions"
)

// ChatCompletionRequest 定义了请求体的结构
type olChatCompletionRequest struct {
Model string `json:"model"`
Messages []struct {
Role string `json:"role"`
Content string `json:"content"`
} `json:"messages"`
Stream bool `json:"stream"`
//Temperature float32 `json:"temperature"`
}

// ChatCompletionResponse 定义了响应体的结构
type olChatCompletionResponse struct {
//Choices []struct {
Message struct {
Role string `json:"role"`
Content string `json:"content"`
} `json:"message"`
//} `json:"choices"`
}

// sendRequestWithRetry 发送请求并处理可能的429错误
func olsendRequestWithRetry(client *http.Client, requestBody []byte) (*http.Response, error) {
req, err := http.NewRequest("POST", obaseURL+oendpoint, bytes.NewBuffer(requestBody))
if err != nil {
return nil, err
}

req.Header.Set("Content-Type", "application/json")
//req.Header.Set("Authorization", "Bearer "+apiKey)

resp, err := client.Do(req)
if err != nil {
return nil, err
}

if resp.StatusCode == http.StatusTooManyRequests {
retryAfter := resp.Header.Get("Retry-After")
if retryAfter != "" {
duration, _ := time.ParseDuration(retryAfter)
time.Sleep(duration)
} else {
time.Sleep(5 * time.Second) // 默认等待5秒
}
return olsendRequestWithRetry(client, requestBody) // 递归重试
}

return resp, nil
}

func main() {
client := &http.Client{} // 创建一个全局的 HTTP 客户端实例

// 初始化对话历史记录
history := []struct {
Role string `json:"role"`
Content string `json:"content"`
}{
{"system", "你是一位唐代诗人,特别擅长模仿李白的风格。"},
}

// 创建标准输入的扫描器
scanner := bufio.NewScanner(os.Stdin)

for {
fmt.Print("请输入您的问题(或者输入 'exit' 退出): ")
scanner.Scan()
userInput := strings.TrimSpace(scanner.Text())

// 退出条件
if userInput == "exit" {
fmt.Println("感谢使用,再见!")
break
}

// 添加用户输入到历史记录
history = append(history, struct {
Role string `json:"role"`
Content string `json:"content"`
}{
"user",
userInput,
})

// 创建请求体
requestBody := olChatCompletionRequest{
Model: omodelID,
Messages: history,
Stream: false,
//Temperature: 0.7,
}

// 构建完整的请求体,包含历史消息
requestBody.Messages = append([]struct {
Role string `json:"role"`
Content string `json:"content"`
}{
{
Role: "system",
Content: "你是一位唐代诗人,特别擅长模仿李白的风格。",
},
}, history...)

// 将请求体序列化为 JSON
requestBodyJSON, err := json.Marshal(requestBody)
if err != nil {
fmt.Println("Error marshalling request body:", err)
continue
}
fmt.Println("wocao:" + string(requestBodyJSON))
// 发送请求并处理重试
resp, err := olsendRequestWithRetry(client, requestBodyJSON)
if err != nil {
fmt.Println("Error sending request after retries:", err)
continue
}
defer resp.Body.Close()

// 检查响应状态码
if resp.StatusCode != http.StatusOK {
fmt.Printf("Received non-200 response status code: %d\n", resp.StatusCode)
continue
}

// 读取响应体
responseBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response body:", err)
continue
}
//fmt.Println("0000" + string(responseBody))
// 解析响应体
var completionResponse olChatCompletionResponse
err = json.Unmarshal(responseBody, &completionResponse)
if err != nil {
fmt.Println("Error unmarshalling response body:", err)
continue
}
fmt.Printf("AI 回复: %s\n", completionResponse.Message.Content) // choice.Message.Content
// 将用户的消息添加到历史记录中
history = append(history, struct {
Role string `json:"role"`
Content string `json:"content"`
}{
Role: completionResponse.Message.Role,
Content: completionResponse.Message.Content, // 假设用户的消息是第一个
})

}
}

golang例子:流式响应
  1 package main
2
3 import (
4 "bufio"
5 "bytes"
6 "encoding/json"
7 "fmt"
8 "io"
9 "net/http"
10 "os"
11 "strings"
12 "time"
13 )
14
15 const (
16 obaseURL = "http://localhost:11434/api"
17 omodelID = "qwen2:0.5b" // 选择合适的模型
18 oendpoint = "/chat" //"/chat/completions"
19 )
20
21 // ChatCompletionRequest 定义了请求体的结构
22 type olChatCompletionRequest struct {
23 Model string `json:"model"`
24 Messages []struct {
25 Role string `json:"role"`
26 Content string `json:"content"`
27 } `json:"messages"`
28 Stream bool `json:"stream"`
29 //Temperature float32 `json:"temperature"`
30 }
31
32 // ChatCompletionResponse 定义了响应体的结构
33 type olChatCompletionResponse struct {
34 //Choices []struct {
35 Message struct {
36 Role string `json:"role"`
37 Content string `json:"content"`
38 } `json:"message"`
39 //} `json:"choices"`
40 }
41
42 // sendRequestWithRetry 发送请求并处理可能的429错误
43 func olsendRequestWithRetry(client *http.Client, requestBody []byte) (*http.Response, error) {
44 req, err := http.NewRequest("POST", obaseURL+oendpoint, bytes.NewBuffer(requestBody))
45 if err != nil {
46 return nil, err
47 }
48
49 req.Header.Set("Content-Type", "application/json")
50 //req.Header.Set("Authorization", "Bearer "+apiKey)
51
52 resp, err := client.Do(req)
53 if err != nil {
54 return nil, err
55 }
56
57 if resp.StatusCode == http.StatusTooManyRequests {
58 retryAfter := resp.Header.Get("Retry-After")
59 if retryAfter != "" {
60 duration, _ := time.ParseDuration(retryAfter)
61 time.Sleep(duration)
62 } else {
63 time.Sleep(5 * time.Second) // 默认等待5秒
64 }
65 return olsendRequestWithRetry(client, requestBody) // 递归重试
66 }
67
68 return resp, nil
69 }
70
71 func main() {
72 client := &http.Client{} // 创建一个全局的 HTTP 客户端实例
73
74 // 初始化对话历史记录
75 history := []struct {
76 Role string `json:"role"`
77 Content string `json:"content"`
78 }{
79 {"system", "你是一位唐代诗人,特别擅长模仿李白的风格。"},
80 }
81
82 // 创建标准输入的扫描器
83 scanner := bufio.NewScanner(os.Stdin)
84
85 for {
86 fmt.Print("请输入您的问题(或者输入 'exit' 退出): ")
87 scanner.Scan()
88 userInput := strings.TrimSpace(scanner.Text())
89
90 // 退出条件
91 if userInput == "exit" {
92 fmt.Println("感谢使用,再见!")
93 break
94 }
95
96 // 添加用户输入到历史记录
97 history = append(history, struct {
98 Role string `json:"role"`
99 Content string `json:"content"`
100 }{
101 "user",
102 userInput,
103 })
104
105 // 创建请求体
106 requestBody := olChatCompletionRequest{
107 Model: omodelID,
108 Messages: history,
109 Stream: true,
110 //Temperature: 0.7,
111 }
112
113 // 构建完整的请求体,包含历史消息
114 requestBody.Messages = append([]struct {
115 Role string `json:"role"`
116 Content string `json:"content"`
117 }{
118 {
119 Role: "system",
120 Content: "你是一位唐代诗人,特别擅长模仿李白的风格。",
121 },
122 }, history...)
123
124 // 将请求体序列化为 JSON
125 requestBodyJSON, err := json.Marshal(requestBody)
126 if err != nil {
127 fmt.Println("Error marshalling request body:", err)
128 continue
129 }
130 fmt.Println("wocao:" + string(requestBodyJSON))
131 // 发送请求并处理重试
132 resp, err := olsendRequestWithRetry(client, requestBodyJSON)
133 if err != nil {
134 fmt.Println("Error sending request after retries:", err)
135 continue
136 }
137 defer resp.Body.Close()
138
139 // 检查响应状态码
140 if resp.StatusCode != http.StatusOK {
141 fmt.Printf("Received non-200 response status code: %d\n", resp.StatusCode)
142 continue
143 }
144 resutlmessage := ""
145 streamReader := resp.Body
146 buf := make([]byte, 1024) // 或者使用更大的缓冲区来提高读取性能
147 var completionResponse olChatCompletionResponse
148 fmt.Print("AI 回复:")
149 for {
150 n, err := streamReader.Read(buf)
151 if n > 0 {
152 // 处理接收到的数据,这里简单打印出来
153 //fmt.Print(string(buf[:n]))
154 err = json.Unmarshal(buf[:n], &completionResponse)
155 fmt.Print(string(completionResponse.Message.Content))
156 resutlmessage+=string(completionResponse.Message.Content)
157 if err != nil {
158 fmt.Println("Error unmarshalling response body:", err)
159 continue
160 }
161 }
162 if err != nil {
163 if err == io.EOF {
164 fmt.Println("")
165 break
166 }
167 panic(err)
168 }
169 }
170
171 // 将用户的消息添加到历史记录中
172 history = append(history, struct {
173 Role string `json:"role"`
174 Content string `json:"content"`
175 }{
176 Role: completionResponse.Message.Role,
177 Content: resutlmessage,//completionResponse.Message.Content, // 假设用户的消息是第一个
178 })
179 }
180 }

感谢观看,谢谢!
 
 

ollama搭建本地ai大模型并应用调用的更多相关文章

  1. AI大模型学习了解

    # 百度文心 上线时间:2019年3月 官方介绍:https://wenxin.baidu.com/ 发布地点: 参考资料: 2600亿!全球最大中文单体模型鹏城-百度·文心发布 # 华为盘古 上线时 ...

  2. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  3. 保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话

    导读 在当今的人工智能时代,大型AI模型已成为获得人工智能应用程序的关键.但是,这些巨大的模型需要庞大的计算资源和存储空间,因此搭建这些模型并对它们进行交互需要强大的计算能力,这通常需要使用云计算服务 ...

  4. Dnsmasq安装与配置-搭建本地DNS服务器 更干净更快无广告DNS解析

    默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...

  5. 【转】使用Apache Kylin搭建企业级开源大数据分析平台

    http://www.thebigdata.cn/JieJueFangAn/30143.html 本篇文章整理自史少锋4月23日在『1024大数据技术峰会』上的分享实录:使用Apache Kylin搭 ...

  6. IIS搭建本地服务器,花生壳实现外网通过域名访问网站

    配置服务器 作为一个青年,没有实力,做不出标图所示的服务器. 作为一个学生,买不起服务器 作为一个小孩,买不起域名 但别忘了 作为一个平民玩家,只要有耐心 装备迟早会做出来的 (注:感觉有钱与没钱还是 ...

  7. centos 如何用 rsyslog 搭建本地日志服务(续1: omprog模块与php deamon的配合使用)

    上一篇说到了如何用 rsyslog 搭建本地的日志服务,地址在这里,没有看的童鞋可以先瞅一眼 : http://www.cnblogs.com/smallrookie/p/5677004.html 显 ...

  8. spring boot / cloud (十八) 使用docker快速搭建本地环境

    spring boot / cloud (十八) 使用docker快速搭建本地环境 在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情 特别是现在,系统越来越复杂,所需要连接的一些中间件也越 ...

  9. EF框架搭建小总结--CodeFirst模型优先

    前言:之前在下总结编写了一篇 EF框架搭建小总结--ModelFirst模型优先 博文,看到一段时间内该博文的访问量蹭.蹭蹭.蹭蹭蹭...往上涨(实际也不是很多,嘿嘿),但是还是按捺不住内心的喜悦(蛮 ...

  10. HBase实践案例:知乎 AI 用户模型服务性能优化实践

    用户模型简介 知乎 AI 用户模型服务于知乎两亿多用户,主要为首页.推荐.广告.知识服务.想法.关注页等业务场景提供数据和服务, 例如首页个性化 Feed 的召回和排序.相关回答等用到的用户长期兴趣特 ...

随机推荐

  1. Google 发布最新开放大语言模型 Gemma 2,现已登陆 Hugging Face Hub

    Google 发布了最新的开放大语言模型 Gemma 2,我们非常高兴与 Google 合作,确保其在 Hugging Face 生态系统中的最佳集成.你可以在 Hub 上找到 4 个开源模型(2 个 ...

  2. Linux 内核:I2C子系统分析(0)整体框架介绍

    --- title: Linux I2C子系统分析:1-整体框架介绍 EntryName: linux-subsystem-i2c-0-about date: 2020-10-13 04:19:26 ...

  3. Libgdx游戏开发(6)——游戏暂停

    原文: Libgdx游戏开发(6)--游戏暂停-Stars-One的杂货小窝 暂停也是一个游戏的必要功能了,本文研究了Libgdx实现游戏暂停 例子以桌面端游戏实现讲解为主,至于移动端,可能之后会进行 ...

  4. 全志T113-i+玄铁HiFi4开发板(双核ARM Cortex-A7 )规格书

    评估板简介 创龙科技TLT113-EVM是一款基于全志科技T113-i双核ARM Cortex-A7 + 玄铁C906 RISC-V + HiFi4 DSP异构多核处理器设计的国产工业评估板,ARM ...

  5. InvocationTargetException和UndeclaredThrowableException异常介绍

    今天来介绍了两个陌生又熟悉的异常类,熟悉是因为我们经常会遇到它们,陌生是好像又从来不知道它们是做什么的 假定读者已经清楚了Java的异常分类: 一是程序不能处理的错误(Error), 二是程序应该避免 ...

  6. win10 VMware 关闭虚拟机失败导致再打开时显示连接不上虚拟机的一种解决方法

    VMware关闭虚拟机失败,强行关闭后,再次打开VMware,打开虚拟机时提示连接不上虚拟机,没有访问权限. 先试了退出后,用管理员权限打开,无果. 然后从网上查资料,cmd->services ...

  7. SpringBoot连接数据库的方式

    1.Spring集成的服务 直接通过注入方式使用,如redis,jdbc等等服务. spring: redis: host: localhost port: 6379 password: 123456 ...

  8. Java中final用法与详解

    final作为Java中经常用到的关键字,了解final的使用方法是非常有必要的. 这里从final关键字在数据域.方法和类中三个方面分析final关键字的主要用法. final应用于基本数据类型 1 ...

  9. Vue 处理异步加载顺序问题:在Konva中确保文本在图片之上显示

    Vue 处理异步加载顺序问题:在Konva中确保文本在Konva之上显示 在使用Konva开发应用时,我们经常会遇到需要将文本绘制在图片之上的情况.一个常见的问题是,由于图像加载是异步的,文本有时会显 ...

  10. 搜索Python编程获取相关图书信息

    1.获取相关图书信息 #搜索"Python编程"获取相关图书信息 from selenium import webdriver from selenium.webdriver.su ...