Ollama:本地模型运行引擎

代码模型 (根据自身需求选用)

此处 以 qwen2.5-coder:7b-instruct 为例

Open WebUI:本地网页界面,类似 ChatGPT 窗口,粘贴代码直接对话;断网可用

安装Ollama

外网环境下载安装包

  • 官网下载 Ollama:https://ollama.com/download
  • 双击安装,一路下一步;安装完成打开 PowerShell
  • 拉取代码模型(下载一次,之后离线永久使用)
ollama pull qwen2.5-coder:7b-instruct

文件大小约 4.7GB,下载完成后,可以彻底断网运行

测试离线运行

 ollama run qwen2.5-coder:7b-instruct

运行起来就可以输入问题了

ctrl+d 可以退出

安装 部署 Open WebUI (未实现)

这里考虑到python环境冲突问题,不适用pip 方式安装,使用 Open WebUI Windows 独立桌面版(单文件 exe)

下载地址(GitHub 官方): Release v0.0.20 · open-webui/desktop · GitHub

找最新版本:open-webui-x64-setup.exe

安装后打不开http://127.0.0.1:8080/ 我跳过了这步😂

配置网页访问ollama服务(可行方案)

1. 新建一个文件夹(路径不要中文、不要空格),新建ollama-ui.html,代码内容如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Ollama Local Chat</title>
    <style>
        * {box-sizing: border-box;margin:0;padding:0;font-family:Consolas,system-ui}
        body{background:#111;color:#eee;padding:16px;max-width:1200px;margin:0 auto}
        .top-bar{display:flex;gap:12px;align-items:center;margin-bottom:16px;flex-wrap:wrap}
        select,input,button{padding:8px 12px;font-size:14px;border-radius:6px;border:none}
        select,input{background:#222;color:#fff;border:1px solid #444}
        button{background:#2563eb;color:#fff;cursor:pointer}
        button:active{opacity:0.85}
        #chat{height:60vh;overflow-y:auto;border:1px solid #333;padding:12px;border-radius:8px;margin-bottom:12px}
        .msg{margin:8px 0;white-space:pre-wrap;line-height:1.5}
        .user{color:#7dd3fc}
        .ai{color:#a7f3d0}
        .code{background:#1e1e1e;padding:10px;border-radius:6px;overflow-x:auto;margin:6px 0}
        #prompt{width:100%;height:120px;background:#1a1a1a;color:#eee;border:1px solid #333;padding:10px;border-radius:8px;resize:none;font-size:14px}
    </style>
</head>
<body>
    <div class="top-bar">
        <label>模型:</label>
        <select id="model"></select>
        <button id="refresh">刷新模型</button>
        <label>Temperature:</label>
        <input id="temp" type="number" value="0.1" min="0" max="1" step="0.05">
    </div>
    <div id="chat"></div>
    <textarea id="prompt" placeholder="粘贴C驱动代码,输入提问..."></textarea>
    <div style="margin-top:8px;display:flex;gap:8px">
        <button id="send">发送</button>
        <button id="clear">清空对话</button>
    </div>

    <script>
        const API_URL = "http://127.0.0.1:11434/api";
        const chatEl = document.getElementById("chat");
        const modelSel = document.getElementById("model");
        const promptEl = document.getElementById("prompt");
        const tempEl = document.getElementById("temp");

        async function loadModels(){
            const res = await fetch(`${API_URL}/tags`);
            const json = await res.json();
            modelSel.innerHTML = "";
            json.models.forEach(m=>{
                const opt = document.createElement("option");
                opt.value = m.name;
                opt.innerText = m.name;
                modelSel.appendChild(opt);
            });
        }
        document.getElementById("refresh").onclick = loadModels;
        document.getElementById("clear").onclick = ()=>chatEl.innerHTML="";

        function appendMsg(text, cls){
            const div = document.createElement("div");
            div.className = "msg "+cls;
            div.innerHTML = renderMarkdown(text);
            chatEl.appendChild(div);
            chatEl.scrollTop = chatEl.scrollHeight;
            return div;
        }
        function renderMarkdown(s){
            return s.replace(/```([\s\S]*?)```/g,'<div class="code">$1</div>');
        }

        document.getElementById("send").onclick = async ()=>{
            const prompt = promptEl.value.trim();
            if(!prompt) return;
            appendMsg(prompt, "user");
            promptEl.value = "";
            const aiDiv = appendMsg("", "ai");
            const resp = await fetch(`${API_URL}/chat`,{
                method:"POST",
                headers:{"Content-Type":"application/json"},
                body:JSON.stringify({
                    model: modelSel.value,
                    messages: [{role:"user", content:prompt}],
                    stream:true,
                    options:{temperature: parseFloat(tempEl.value)}
                })
            });
            const reader = resp.body.getReader();
            const decoder = new TextDecoder();
            let fullText = "";
            while(true){
                const {done,value} = await reader.read();
                if(done) break;
                const chunk = decoder.decode(value);
                const lines = chunk.split("\n").filter(Boolean);
                for(const line of lines){
                    const obj = JSON.parse(line);
                    if(obj.message?.content){
                        fullText += obj.message.content;
                        aiDiv.innerHTML = renderMarkdown(fullText);
                        chatEl.scrollTop = chatEl.scrollHeight;
                    }
                }
            }
        }
        loadModels();
    </script>
</body>
</html>

2. 打开 PowerShell,cd 进入这个文件夹

3. 启动简易 HTTP 服务

python -m http.server 8000

看到输出 Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 代表成功。

4. 浏览器访问

http://127.0.0.1:8000/ollama-ui.html

5. 关闭方式

  • 直接在PowerShell里面 ctrl+C
  • 查找占用 8000 端口的进程并杀掉:
netstat -ano | findstr :8000

最后一列数字是 PID,然后执行:

taskkill /F /PID 这里替换成查到的PID

安装 配置VS Code插件 (可行方案)

安装:

在扩展插件栏 搜索:Continue - open-source AI code agent

点击【安装】,重启 VSCode

配置:

左侧边栏打开 Continue 面板(图标六边形)

点击面板右上角 ⚙设置 → Open Config(打开new config.yaml)

清空原有内容,粘贴下面这份配置

version: 0.0.1
schema: v1

models:
  - name: Qwen2.5-Coder 7B-Instruct
    provider: ollama
    model: qwen2.5-coder:7b-instruct
    apiBase: http://127.0.0.1:11434
    roles:
      - chat
      - edit
    completionOptions:
      temperature: 0.1
      num_ctx: 8192

报错 完成配置

之后就可以选中代码 ctrl+L 唤起 Continue 对话,或者直接在 Continue面板进行提问

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐