小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Deepseek本地部署詳細(xì)指南!從 Ollama 到個(gè)人知識(shí)庫應(yīng)用

 逍逍遙遙 2025-02-10 發(fā)布于安徽

丨作者:lushen 每個(gè)人都能擁有專屬 AI 助手,安全高效,開啟智能化知識(shí)管理新體驗(yàn)。

系統(tǒng)介紹

  1. mbp pro
    圖片

、Ollama 安裝與配置


1.1 跨平臺(tái)安裝指南

Ollama 作為本地運(yùn)行大模型的利器,支持三大主流操作系統(tǒng):

# macOS一鍵安裝
# Windows用戶
訪問官網(wǎng) https:///download 下載安裝包

# Linux安裝(Ubuntu/Debian為例)
curl -fsSL https:///install.sh | sudo bash
sudo usermod -aG ollama $USER  # 添加用戶權(quán)限
sudo systemctl start ollama    # 啟動(dòng)服務(wù)

1.2 服務(wù)驗(yàn)證

ollama -v

# 輸出ollama version is 0.5.7

出現(xiàn)上述則表示安裝成功,可瀏覽器訪問http://localhost:11434/驗(yàn)證

二、Deepseek 模型部署

2.1 模型下載與加載

以 deepseek r1 模型為例:

  1. 訪問https:///library/deepseek-r1,默認(rèn)為 7b 模型,如需其他模型,可以在當(dāng)前頁搜索所需模型

  2. 模型詳情頁復(fù)制安裝命令ollama run deepseek-r1 

  3. 安裝完成后在終端執(zhí)行:

ollama run deepseek-r1
# 執(zhí)行后
pulling manifest
pulling 96c415656d37... 100% ▕██████████████▏ 4.7 GB
pulling 369ca498f347... 100% ▕██████████████▏ 387 B
pulling 6e4c38e1172f... 100% ▕██████████████▏ 1.1 KB
pulling f4d24e9138dd... 100% ▕██████████████▏ 148 B
pulling 40fb844194b2... 100% ▕██████████████▏ 487 B
verifying sha256 digest
writing manifest
success
> > > Send a message (/? for help)
> > > `
> > > 當(dāng)看到上述提示,即可開始模型對(duì)話。
  • mac 后臺(tái)標(biāo)識(shí)

    圖片

  • win 后臺(tái)標(biāo)識(shí)

    見任務(wù)欄托盤區(qū)

2.2 模型驗(yàn)證測(cè)試

運(yùn)行交互式對(duì)話測(cè)試:

請(qǐng)用Python寫一個(gè)快速排序算法

當(dāng)看到完整代碼輸出,說明模型已成功加載。

硬件要求建議:

  • 最低配置:16GB 內(nèi)存 + 8GB 顯存

  • 推薦配置:32GB 內(nèi)存 + 16GB 顯存(RTX 3060 級(jí)別)

三、安裝交互 ui

3.1 chatbox

  1. 下載地址chatboxai.app

  2. 配置本地模型

  • 進(jìn)入設(shè)置頁面

圖片

  • 選擇 ollama api (本地部署)

  • 配置本機(jī)地址,默認(rèn)http://127.0.0.1:11434

圖片

至此即可開啟問答模式

3.2 Page Assist 瀏覽器插件 

  1. 安裝地址Page Assist - 本地 AI 模型的 Web UI

  2. 安裝后簡單配置即可開啟問答模式,功能豐富,可以參考官方引導(dǎo)

  3. 本插件支持本地知識(shí)庫建設(shè),因本次使用 Dify 建設(shè),在此不贅述。

圖片

四、Dify 知識(shí)庫搭建

參考文檔地址Docker Compose 部署

4.1 環(huán)境準(zhǔn)備

1.拉取源代碼,準(zhǔn)備環(huán)境

# mac os
# 克隆 Dify 源代碼至本地環(huán)境。
git clone https://github.com/langgenius/dify.git

# 進(jìn)入 Dify 源代碼的 Docker 目錄
cd dify/docker

# 復(fù)制環(huán)境配置文件
cp .env.example .env

2.啟動(dòng) Docker 容器(需要先安裝 D ocker)

docker compose up -d
# 如果版本是 Docker Compose V1,使用以下命令:
docker-compose up -d

# 正常返回
[+] Running 74/9
 ? db Pulled                                                    834.2s
 ? sandbox Pulled                                              1120.7s
 ? weaviate Pulled                                              526.5s
 ? web Pulled                                                   174.0s
 ? redis Pulled                                                 893.7s
 ? api Pulled                                                  2919.8s
 ? worker Pulled                                               2919.8s
 ? ssrf_proxy Pulled                                            494.0s
 ? nginx Pulled                                                 184.7s
[+] Running 11/11
 ? Network docker_default             Created                     0.0s
 ? Network docker_ssrf_proxy_network  Created                     0.0s
 ? Container docker-db-1              Started                     1.1s
 ? Container docker-web-1             Started                     1.1s
 ? Container docker-redis-1           Started                     1.1s
 ? Container docker-sandbox-1         Started                     1.1s
 ? Container docker-weaviate-1        Started                     1.1s
 ? Container docker-ssrf_proxy-1      Started                     1.1s
 ? Container docker-api-1             Started                     0.7s
 ? Container docker-worker-1          Started                     0.7s
 ? Container docker-nginx-1           Started                     0.8s

在此階段可能會(huì)遇到下列失敗的情況,可以嘗試切換源解決 我當(dāng)時(shí)的條件

  1. 修改配置后重啟 docker

  2. 辦公網(wǎng)環(huán)境下
docker compose up -d

[+] Running 9/9
 ? web Error        context canceled                             14.9s
 ? redis Error      context canceled                             14.9s
 ? db Error         context canceled                             14.9s
 ? nginx Error      context canceled                             14.9s
 ? ssrf_proxy Error context canceled                             14.9s
 ? sandbox Error    Head 'https://...               14.9s
 ? api Error        context canceled                             14.9s
 ? worker Error     context canceled                             14.9s
 ? weaviate Error   context canceled                             14.9s
Error response from daemon: Head '
https://cker.io/v2/langgenius/dify-sandbox/manifests/0.2.10': Get 'https://auth./token?scope=repository%3Alanggenius%2Fdify-sandbox%3Apull&service=registry.': EOF

解決方法

  • 右上角齒輪圖標(biāo)進(jìn)入設(shè)置 -> Docker engine,在配置中添加

  • 寫入以下內(nèi)容 ocker)


{
  // ...
  'registry-mirrors': [
    'https://docker.',
    'https://docker.m.',
    'https://docker.',
    'https://docker.',
    'http://mirrors.ustc.edu.cn',
    'https://docker.',
    'http://mirror.',
    'https://',
    'https://',
    'https://hub.v'
  ]
}

4.2 Dify 創(chuàng)建聊天

  1. 訪問http://localhost/(默認(rèn) 80 端口) 進(jìn)入 dify

  2. 首次進(jìn)入初始化設(shè)置賬號(hào)密碼

  3. 點(diǎn)擊 Dify 平臺(tái)右上角頭像 → 設(shè)置 → 模型供應(yīng)商,選擇 Ollama,輕點(diǎn)“添加模型”。

圖片

圖片

在配置 url 時(shí),因?yàn)槭?docker 服務(wù),http://localhost:11434 存在無法訪問的情況,可以嘗試http://host.ernal:11434

4.至此,可以開始創(chuàng)建應(yīng)用,在主頁選擇 全部 -> 創(chuàng)建空白應(yīng)用 -> 填入應(yīng)用信息即可

圖片

4.3 Dify 知識(shí)庫創(chuàng)建

  1. 主頁選擇 知識(shí)庫 -> 創(chuàng)建知識(shí)庫 -> 上傳知識(shí) -> 等待處理完成

    圖片

  2. 進(jìn)入聊天應(yīng)用,選擇剛才創(chuàng)建的知識(shí)庫,即可開始帶有私域知識(shí)的溝通

圖片

五、應(yīng)用測(cè)試

5.1 翻譯場(chǎng)景

1.本地客戶端具有部分國際化測(cè)試文件需要執(zhí)行翻譯,格式示例如下,多層嵌套的 json 格式,value 為string類型。需要利用大模型對(duì)整個(gè) json 文件進(jìn)行翻譯,將中文翻譯為英文后按原格式返回


// zh.json
{
  'window': {
    'willUnload': {
      'title''確認(rèn)刷新當(dāng)前頁面嗎?',
      'message''系統(tǒng)可能不會(huì)保存您做的更改',
      'unload_bt''重新加載',
      'cancel_bt''取消'
    }
  }
}
ocker)

2.實(shí)際應(yīng)用測(cè)試,以deepseek-r1:7b/14b模型做測(cè)試。得到結(jié)果如下

3.執(zhí)行腳本trans.js 

const fs = require('fs');
const axios = require('axios');

// 1. 讀取本地JSON文件
const readJsonFile = (filePath) => {
  return new Promise((resolve, reject) => {
    fs.readFile(filePath, 'utf8', (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(JSON.parse(data));
      }
    });
  });
};

const MODEL = 'deepseek-r1:14b';

// 2. 調(diào)用本地大模型接口進(jìn)行翻譯
const translateText = async (text, key) => {
  let response;
  try {
    console.time(`run worker ${key}`);
    response = await axios.post('http://localhost:11434/api/generate', {
      // model: 'deepseek-r1:7b',
      model: MODEL,
      prompt: `有部分客戶端國際化的配置文件,內(nèi)容為json格式,需要翻譯,要求按步驟進(jìn)行翻譯:
      1. 將中文翻譯為英文
      2. 保持原有json格式不變,將value替換成翻譯后的文本
      3. 你始終以合法的JSON格式響應(yīng),返回結(jié)果格式如: {'key1':'翻譯后的文本1','key2':'翻譯后的文本2'},直接返回結(jié)果,不需要符號(hào)包裹
      配置文件
      '''${JSON.stringify(text)}'''`,
      stream: false,
    });
    console.timeEnd(`run worker ${key}`);

    const splitText = '</think>';
    const startIndex = response.data.response.indexOf(splitText);
    const result = response.data.response
      .slice(startIndex + splitText.length)
      .trim()
      .replace(/<<+|>>+/g, '');
    // console.log('response.data.response:', response.data.response, JSON.parse(result), result)
    return JSON.parse(result); // 假設(shè)接口返回的翻譯結(jié)果在response.data.translatedText中
  } catch (error) {
    console.error('翻譯出錯(cuò):', key);
    return translateText(text, key); // 如果翻譯失敗,返回原文
  }
};

// 3. 并行翻譯邏輯(手動(dòng)控制并發(fā))
const translateJson = async (jsonData, concurrency = 5) => {
  const entries = Object.entries(jsonData);
  const translatedData = {};
  let currentIndex = 0; // 當(dāng)前處理的任務(wù)索引

  // 定義工作線程:每個(gè)線程不斷處理下一個(gè)任務(wù)
  const worker = async () => {
    while (currentIndex < entries.length) {
      const index = currentIndex++;
      if (index >= entries.length) break; // 所有任務(wù)已完成
      const [key, value] = entries[index];
      try {
        translatedData[key] = await translateText(value, key);
      } catch (error) {
        translatedData[key] = value; // 保留原文
      }
    }
  };

  // 啟動(dòng)指定數(shù)量的工作線程
  const workers = Array(concurrency).fill(null).map(worker);
  await Promise.all(workers); // 等待所有線程完成

  const result = {};

  // 保持原有順序
  entries.forEach(([key, value]) => {
    result[key] = translatedData[key] || value;
  });

  return result;
};

// 4. 將翻譯后的內(nèi)容生成新的文件
const writeTranslatedJson = (filePath, data) => {
  return new Promise((resolve, reject) => {
    fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf8', (err) => {
      if (err) {
        reject(err);
      } else {
        resolve();
      }
    });
  });
};

function compareObjectsWithPath(obj1, obj2, path = '') {
  // 類型不同時(shí)直接返回路徑
  if (typeof obj1 !== typeof obj2) {
    return { success: false, path: path || 'root' };
  }

  // 處理可遍歷對(duì)象(對(duì)象或數(shù)組)
  if (typeof obj1 === 'object' && obj1 !== null && obj2 !== null) {
    const isArr1 = Array.isArray(obj1);
    const isArr2 = Array.isArray(obj2);

    // 數(shù)組類型不一致
    if (isArr1 !== isArr2) {
      return { success: false, path: path || 'root' };
    }

    if (isArr1) {
      // 數(shù)組長度不同
      if (obj1.length !== obj2.length) {
        return { success: false, path: path || 'root' };
      }

      // 遞歸檢查數(shù)組元素
      for (let i = 0; i < obj1.length; i++) {
        const currentPath = `${path}[${i}]`;
        const result = compareObjectsWithPath(obj1[i], obj2[i], currentPath);
        if (!result.success) return result;
      }
      return { success: true };
    } else {
      // 檢查是否為純對(duì)象(字面量對(duì)象)
      const isPlainObj1 = isPlainObject(obj1);
      const isPlainObj2 = isPlainObject(obj2);

      if (isPlainObj1 !== isPlainObj2) {
        return { success: false, path: path || 'root' };
      }

      // 非純對(duì)象(如 Date、RegExp)需檢查是否均為字符串
      if (!isPlainObj1) {
        return typeof obj1 === 'string' && typeof obj2 === 'string'
          ? { success: true }
          : { success: false, path: path || 'root' };
      }

      // 合并所有 key 并檢查數(shù)量
      const keys1 = Object.keys(obj1);
      const keys2 = Object.keys(obj2);
      const allKeys = new Set([...keys1, ...keys2]);

      if (allKeys.size !== keys1.length || allKeys.size !== keys2.length) {
        return { success: false, path: path || 'root' };
      }

      // 遞歸檢查每個(gè)屬性
      for (const key of allKeys) {
        const currentPath = path ? `${path}.${key}` : key;

        if (!keys1.includes(key) || !keys2.includes(key)) {
          return { success: false, path: currentPath };
        }
        const result = compareObjectsWithPath(
          obj1[key],
          obj2[key],
          currentPath
        );
        if (!result.success) return result;
      }
      return { success: true };
    }
  } else {
    // 基本類型:檢查是否均為字符串
    return typeof obj1 === 'string' && typeof obj2 === 'string'
      ? { success: true }
      : { success: false, path: path || 'root' };
  }
}

// 判斷是否為純對(duì)象(字面量對(duì)象)
function isPlainObject(value) {
  return Object.prototype.toString.call(value) === '[object Object]';
}

// 主函數(shù)
const main = async () => {
  console.time('run main');

  const inputFilePath = './locales/zh.json'; // 輸入的JSON文件路徑
  const outputFilePath = `output_${MODEL}.json`; // 輸出的JSON文件路徑

  try {
    // 讀取JSON文件
    const jsonData = await readJsonFile(inputFilePath);

    // 翻譯JSON內(nèi)容
    const translatedData = await translateJson(jsonData);

    // 將翻譯后的內(nèi)容寫入新文件
    await writeTranslatedJson(outputFilePath, translatedData);

    console.log(
      '翻譯完成,結(jié)果是否存在遺漏項(xiàng):',
      compareObjectsWithPath(jsonData, translatedData)
    );
    console.log('翻譯完成,結(jié)果已寫入:', outputFilePath);
  } catch (error) {
    console.error('處理過程中出錯(cuò):', error);
  }
  console.timeEnd('run main');
};

// 執(zhí)行主函數(shù)
main();

7b


run worker window: 1:16.909 (m:ss.mmm)
翻譯出錯(cuò): window
run worker contextMenu: 1:19.915 (m:ss.mmm)
翻譯出錯(cuò): contextMenu
run worker autoUpdater: 1:24.182 (m:ss.mmm)
run worker menu: 1:54.272 (m:ss.mmm)
run worker openWindowWarn: 2:08.219 (m:ss.mmm)
翻譯出錯(cuò): openWindowWarn
run worker contextMenu: 54.257s
翻譯出錯(cuò): contextMenu
run worker createPreloadFileWarn: 1:05.595 (m:ss.mmm)
翻譯出錯(cuò): createPreloadFileWarn
run worker window: 1:13.320 (m:ss.mmm)
翻譯出錯(cuò): window
run worker openWindowWarn: 42.933s
run worker renderer: 1:06.620 (m:ss.mmm)
run worker contextMenu: 58.129s
run worker createPreloadFileWarn: 51.205s
run worker window: 1:10.067 (m:ss.mmm)
翻譯出錯(cuò): window
run worker window: 17.583s
翻譯出錯(cuò): window
run worker window: 16.479s
翻譯出錯(cuò): window
run worker window: 53.783s
翻譯完成,結(jié)果是否存在遺漏項(xiàng): { success: false, path: 'menu' }
翻譯完成,結(jié)果已寫入: output_deepseek-r1:7b.json
run main: 5:08.166 (m:ss.mmm)
![img_1.png](img_1.png)

----------------
run worker openWindowWarn: 27.835s
翻譯出錯(cuò): openWindowWarn
run worker window: 47.317s
翻譯出錯(cuò): window
run worker contextMenu: 1:00.365 (m:ss.mmm)
翻譯出錯(cuò): contextMenu
run worker openWindowWarn: 42.320s
run worker window: 1:00.580 (m:ss.mmm)
翻譯出錯(cuò): window
run worker menu: 2:01.575 (m:ss.mmm)
翻譯出錯(cuò): menu
run worker contextMenu: 1:05.158 (m:ss.mmm)
run worker autoUpdater: 2:08.553 (m:ss.mmm)
run worker createPreloadFileWarn: 1:41.123 (m:ss.mmm)
run worker window: 1:28.518 (m:ss.mmm)
翻譯出錯(cuò): window
run worker renderer: 1:46.725 (m:ss.mmm)
run worker menu: 1:54.031 (m:ss.mmm)
翻譯出錯(cuò): menu
run worker window: 57.867s
run worker menu: 1:16.267 (m:ss.mmm)
翻譯完成,結(jié)果是否存在遺漏項(xiàng): { success: false, path: 'menu' }
翻譯完成,結(jié)果已寫入: output_deepseek-r1:7b.json
run main: 5:11.880 (m:ss.mmm)
![img_2.png](img_2.png)

翻譯結(jié)果

 'window': {
   'willUnload': {
     'title''What should you confirm before refreshing the current page?',
     'message''the system might not save your changes',
     'unload_bt''Reload',
     'cancel_bt''Cancel'
   }
 },

14b

run worker window: 2:15.983 (m:ss.mmm)
run worker contextMenu: 2:17.554 (m:ss.mmm)
run worker autoUpdater: 3:02.960 (m:ss.mmm)
run worker menu: 4:06.753 (m:ss.mmm)
run worker openWindowWarn: 4:14.074 (m:ss.mmm)
run worker createPreloadFileWarn: 2:04.443 (m:ss.mmm)
run worker renderer: 2:21.099 (m:ss.mmm)
翻譯完成,結(jié)果是否存在遺漏項(xiàng): { success: true }
翻譯完成,結(jié)果已寫入: output_deepseek-r1:14b.json
run main: 4:38.673 (m:ss.mmm)


------------------------

run worker autoUpdater: 1:34.068 (m:ss.mmm)
run worker openWindowWarn: 1:57.715 (m:ss.mmm)
run worker window: 2:09.907 (m:ss.mmm)
run worker contextMenu: 2:14.214 (m:ss.mmm)
run worker renderer: 1:38.631 (m:ss.mmm)
run worker createPreloadFileWarn: 2:24.484 (m:ss.mmm)
run worker menu: 4:16.409 (m:ss.mmm)
翻譯出錯(cuò): menu
run worker menu: 2:00.482 (m:ss.mmm)
翻譯完成,結(jié)果是否存在遺漏項(xiàng): { success: true }
翻譯完成,結(jié)果已寫入: output_deepseek-r1:14b.json
run main: 6:16.900 (m:ss.mmm)

翻譯結(jié)果


'window': {
    'willUnload': {
      'title''Confirm to refresh the current page?',
      'message''The system may not save your changes.',
      'unload_bt''Reload',
      'cancel_bt''Cancel'
    }
  },

4.整體體驗(yàn)下來,14b 模型在翻譯工作上比 7b 模型更為準(zhǔn)確,一次性翻譯成功率高。7B 模型翻譯結(jié)果噪聲多,返回結(jié)果可序列化效果差。翻譯結(jié)果遠(yuǎn)遠(yuǎn)不如 14b。

結(jié)論

14b 在 macos 執(zhí)行效率能滿足特定業(yè)務(wù)場(chǎng)景要求


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多