ollama搭建本地ai大模型并应用调用的操作方法

 更新时间:2024年11月11日 09:40:52   作者:小G同学  
这篇文章详细介绍了如何下载、安装和使用OLLAMA大模型,包括启动配置模型、配置UI界面、搭建本地知识库、配置文件开发、环境变量配置以及通过Golang实现接口调用的示例

1、下载ollama

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

2、启动配置模型

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

ollama run llama3

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

ollama run qwen2

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

3、配置UI界面

安装docker并部署web操作界面

 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"为变量值

OLLAMA_HOST= "0.0.0.0:11434"

MAC版

配置OLLAMA_HOST

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

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例子:流式响应

package main
import (
    "bufio"
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "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:   true,
            //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
        }
               resutlmessage := ""
        streamReader := resp.Body
        buf := make([]byte, 1024) // 或者使用更大的缓冲区来提高读取性能
        var completionResponse olChatCompletionResponse
        fmt.Print("AI 回复:")
        for {
            n, err := streamReader.Read(buf)
            if n > 0 {
                // 处理接收到的数据,这里简单打印出来
                //fmt.Print(string(buf[:n]))
                err = json.Unmarshal(buf[:n], &completionResponse)
                fmt.Print(string(completionResponse.Message.Content))
                               resutlmessage+=string(completionResponse.Message.Content)
                if err != nil {
                    fmt.Println("Error unmarshalling response body:", err)
                    continue
                }
            }
            if err != nil {
                if err == io.EOF {
                    fmt.Println("")
                    break
                }
                panic(err)
            }
        }
        // 将用户的消息添加到历史记录中
        history = append(history, struct {
            Role    string `json:"role"`
            Content string `json:"content"`
        }{
            Role:    completionResponse.Message.Role,
            Content: resutlmessage,//completionResponse.Message.Content, // 假设用户的消息是第一个
        })
    }
}

到此这篇关于ollama搭建本地ai大模型并应用调用的操作方法的文章就介绍到这了,更多相关ollama搭建本地ai大模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JetBrains 学生认证教程(Pycharm,IDEA… 等学生认证教程)

    JetBrains 学生认证教程(Pycharm,IDEA… 等学生认证教程)

    这篇文章主要介绍了JetBrains 学生认证教程(Pycharm,IDEA… 等学生认证教程)文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • IntelliJ IDEA下的SVN使用(傻瓜式教学)

    IntelliJ IDEA下的SVN使用(傻瓜式教学)

    这篇文章主要介绍了IntelliJ IDEA下的SVN使用(傻瓜式教学),文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • VSCode远程SSH免密登录配置实现

    VSCode远程SSH免密登录配置实现

    这篇文章主要介绍了VSCode远程SSH免密登录配置实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 编程趣事:当下流行编程语言的”讨厌”程度排行榜

    编程趣事:当下流行编程语言的”讨厌”程度排行榜

    这篇文章主要介绍了编程趣事:当下流行编程语言的”讨厌”程度排行榜,和小编的感觉一样,需要的朋友可以参考下
    2014-07-07
  • vscode添加GIT和SVN的方法示例

    vscode添加GIT和SVN的方法示例

    这篇文章主要介绍了vscode添加GIT和SVN的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 不同的编程语言输出 “Hello World” 代码

    不同的编程语言输出 “Hello World” 代码

    对很多人来说,每当学习一门新的编程语言,写下的第一行代码可能都是“Hello,World!“。因此,”Hello,World!" 已经成为一段经典程序。在成长中,程序员通常会使用多种编程语言,大部分程序员甚至实现过十几种”Hello,World!”版本。
    2022-12-12
  • HttpGet请求与Post请求中参数乱码原因剖析与解决方案

    HttpGet请求与Post请求中参数乱码原因剖析与解决方案

    这篇文章主要介绍了HttpGet请求与Post请求中参数乱码原因剖析,文中有相关的代码示例,具有一定的参考价值,需要的朋友可以参考下
    2023-07-07
  • asp.net php asp jsp 301重定向的代码(集合)

    asp.net php asp jsp 301重定向的代码(集合)

    介绍一下针对各类程序系统实施301重定向的代码,需要的朋友可以参考下。
    2010-11-11
  • Idea 2022激活码最新汇总(亲测有效)

    Idea 2022激活码最新汇总(亲测有效)

    JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。今天给大家分享大批IDEA 激活码到期之后的乱象,大家可以参考下
    2020-07-07
  • Python实现用户登录并且输入错误三次后锁定该用户

    Python实现用户登录并且输入错误三次后锁定该用户

    这篇文章主要介绍了Python实现用户登录并且输入错误三次后锁定该用户,文中通过c#代码给大家补充介绍了密码输入三次错误后锁定用户功能,需要的朋友可以参考下
    2020-01-01

最新评论