驰网飞飞 发表于 2025-7-10 15:06:04

Ollama搭建本地AI大模型并应用调用

1、下载Ollama
1)打开Ollama官网,点击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, // 假设用户的消息是第一个                })
      }}

感谢您的阅读,服务器大本营-技术文章内容集合站,助您成为更专业的服务器管理员!
页: [1]
查看完整版本: Ollama搭建本地AI大模型并应用调用

点击直接加入[服务器大本营QQ频道]