[{"data":1,"prerenderedAt":1357},["ShallowReactive",2],{"article-\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F03.用-Dify-搭建本地知识库让-AI-读懂你写的博客":3,"article-around-\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F03.用-Dify-搭建本地知识库让-AI-读懂你写的博客":1139},{"id":4,"title":5,"author":6,"body":7,"category":1124,"cover":1125,"date":1126,"description":1127,"draft":1128,"extension":1129,"image":1130,"license":1125,"meta":1131,"minutes":268,"navigation":264,"path":1132,"pinned":1128,"seo":1133,"stem":1134,"tags":1135,"__hash__":1138},"blog\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F03.用 Dify 搭建本地知识库让 AI 读懂你写的博客.md","用 Dify 搭建本地知识库，让 AI 读懂你写的博客","张萌萌",{"type":8,"value":9,"toc":1092},"minimark",[10,15,24,27,37,47,51,56,62,73,80,84,87,172,182,186,189,193,215,219,284,298,321,324,366,399,403,410,414,425,429,439,482,486,489,512,521,525,529,540,638,656,660,666,719,728,732,735,760,763,774,780,784,834,850,854,857,879,885,892,896,905,951,959,963,967,970,974,980,1007,1017,1021,1041,1045,1051,1055,1080,1085,1088],[11,12,14],"h2",{"id":13},"_1-序言","1 序言",[16,17,18,19,23],"p",{},"博客写到几十篇之后，会出现一个尴尬的情况：",[20,21,22],"strong",{},"自己都记不清哪篇写过什么","。",[16,25,26],{},"「我是不是写过 DD 脚本的注意事项？」「那个 AdGuard 的部署端口是几来着？」——去搜索框翻关键词，效率其实不高，因为 Markdown 搜索只认字面匹配，你换个说法它就找不到了。",[16,28,29,32,33,36],{},[20,30,31],{},"大模型恰好擅长处理这个问题，前提是它能读到你的文章。"," 把文章交给通用在线模型有隐私顾虑，而且它根本不知道你写过什么。答案就是 ",[20,34,35],{},"RAG","：用本地模型 + 自己的文章，搭一个只回答你博客内容的知识库。",[16,38,39,40,43,44,23],{},"本文用 ",[20,41,42],{},"Dify"," 完成这套链路，语言模型和向量模型全部走本地 Ollama，",[20,45,46],{},"数据不出内网",[11,48,50],{"id":49},"_2-什么是-rag核心概念","2 什么是 RAG（核心概念）",[52,53,55],"h3",{"id":54},"_21-基础定义","2.1 基础定义",[16,57,58,61],{},[20,59,60],{},"RAG（检索增强生成）"," 是先检索、再生成的问答方式：",[63,64,69],"pre",{"className":65,"code":67,"language":68},[66],"language-text","你的问题 → 向量化 → 在知识库里找最相关的几段 → 连同问题一起交给大模型 → 生成回答\n","text",[70,71,67],"code",{"__ignoreMap":72},"",[16,74,75,76,79],{},"关键在于",[20,77,78],{},"中间那一步","：模型不是凭记忆回答，而是拿着你提供的原文片段来回答。",[52,81,83],{"id":82},"_22-rag-与微调的区别","2.2 RAG 与微调的区别",[16,85,86],{},"很多人一上来就问「要不要微调」，其实大部分「让 AI 懂我的资料」的需求都不需要：",[88,89,90,106],"table",{},[91,92,93],"thead",{},[94,95,96,100,103],"tr",{},[97,98,99],"th",{},"对比维度",[97,101,102],{},"RAG（检索增强）",[97,104,105],{},"微调（Fine-tuning）",[107,108,109,126,137,148,161],"tbody",{},[94,110,111,115,121],{},[112,113,114],"td",{},"解决什么",[112,116,117,118],{},"让模型",[20,119,120],{},"知道事实",[112,122,117,123],{},[20,124,125],{},"改变风格或技能",[94,127,128,131,134],{},[112,129,130],{},"数据更新",[112,132,133],{},"加一篇文档即可生效",[112,135,136],{},"要重新训练",[94,138,139,142,145],{},[112,140,141],{},"硬件要求",[112,143,144],{},"一台能跑推理的机器",[112,146,147],{},"需要训练显存，门槛高得多",[94,149,150,153,158],{},[112,151,152],{},"可溯源",[112,154,155],{},[20,156,157],{},"能指出答案出自哪一篇",[112,159,160],{},"不能",[94,162,163,166,169],{},[112,164,165],{},"适合场景",[112,167,168],{},"文档问答、知识库",[112,170,171],{},"固定格式输出、专业领域语气",[173,174,175],"blockquote",{},[16,176,177,178,181],{},"结论很直接：",[20,179,180],{},"「让我写的文章能被问答」是 RAG 的典型场景","，做微调是拿高射炮打蚊子，而且效果更差（幻觉更严重、无法溯源）。",[11,183,185],{"id":184},"_3-部署-dify","3 部署 Dify",[16,187,188],{},"Dify 是一套完整的 RAG 应用平台，自带知识库管理、检索调参和对话界面，省去自己写前后端。",[52,190,192],{"id":191},"_31-前置要求","3.1 前置要求",[194,195,196,203,209],"ul",{},[197,198,199,202],"li",{},[20,200,201],{},"资源","：至少 2 核 4 GB 内存，知识库文章多时建议 4 核 8 GB。",[197,204,205,208],{},[20,206,207],{},"磁盘","：Dify 本体加向量库约 5–10 GB，另需为模型留空间。",[197,210,211,214],{},[20,212,213],{},"Docker 与 Compose","：已安装。",[52,216,218],{"id":217},"_32-拉取并启动","3.2 拉取并启动",[63,220,224],{"className":221,"code":222,"language":223,"meta":72,"style":72},"language-bash shiki shiki-themes github-light github-dark","# 克隆官方仓库\ngit clone https:\u002F\u002Fgithub.com\u002Flanggenius\u002Fdify.git\ncd dify\u002Fdocker\n\n# 生成配置文件\ncp .env.example .env\n","bash",[70,225,226,235,249,259,266,272],{"__ignoreMap":72},[227,228,231],"span",{"class":229,"line":230},"line",1,[227,232,234],{"class":233},"sJ8bj","# 克隆官方仓库\n",[227,236,238,242,246],{"class":229,"line":237},2,[227,239,241],{"class":240},"sScJk","git",[227,243,245],{"class":244},"sZZnC"," clone",[227,247,248],{"class":244}," https:\u002F\u002Fgithub.com\u002Flanggenius\u002Fdify.git\n",[227,250,252,256],{"class":229,"line":251},3,[227,253,255],{"class":254},"sj4cs","cd",[227,257,258],{"class":244}," dify\u002Fdocker\n",[227,260,262],{"class":229,"line":261},4,[227,263,265],{"emptyLinePlaceholder":264},true,"\n",[227,267,269],{"class":229,"line":268},5,[227,270,271],{"class":233},"# 生成配置文件\n",[227,273,275,278,281],{"class":229,"line":274},6,[227,276,277],{"class":240},"cp",[227,279,280],{"class":244}," .env.example",[227,282,283],{"class":244}," .env\n",[16,285,286,289,290,293,294,297],{},[20,287,288],{},"启动前先改端口。"," Dify 默认用 nginx 监听 ",[70,291,292],{},"80","，大概率会和系统里已有服务冲突。编辑 ",[70,295,296],{},".env","：",[63,299,301],{"className":221,"code":300,"language":223,"meta":72,"style":72},"# 修改 nginx 对外端口，避开 80\nEXPOSE_NGINX_PORT=8088\n",[70,302,303,308],{"__ignoreMap":72},[227,304,305],{"class":229,"line":230},[227,306,307],{"class":233},"# 修改 nginx 对外端口，避开 80\n",[227,309,310,314,318],{"class":229,"line":237},[227,311,313],{"class":312},"sVt8B","EXPOSE_NGINX_PORT",[227,315,317],{"class":316},"szBVR","=",[227,319,320],{"class":244},"8088\n",[16,322,323],{},"启动：",[63,325,327],{"className":221,"code":326,"language":223,"meta":72,"style":72},"# 首次启动会拉取多个镜像，耐心等待\ndocker compose up -d\n\n# 确认所有容器都是 Up 状态\ndocker compose ps\n",[70,328,329,334,348,352,357],{"__ignoreMap":72},[227,330,331],{"class":229,"line":230},[227,332,333],{"class":233},"# 首次启动会拉取多个镜像，耐心等待\n",[227,335,336,339,342,345],{"class":229,"line":237},[227,337,338],{"class":240},"docker",[227,340,341],{"class":244}," compose",[227,343,344],{"class":244}," up",[227,346,347],{"class":254}," -d\n",[227,349,350],{"class":229,"line":251},[227,351,265],{"emptyLinePlaceholder":264},[227,353,354],{"class":229,"line":261},[227,355,356],{"class":233},"# 确认所有容器都是 Up 状态\n",[227,358,359,361,363],{"class":229,"line":268},[227,360,338],{"class":240},[227,362,341],{"class":244},[227,364,365],{"class":244}," ps\n",[16,367,368,369,372,373,372,376,372,379,372,382,372,385,372,388,372,391,394,395,398],{},"应该能看到 ",[70,370,371],{},"api","、",[70,374,375],{},"worker",[70,377,378],{},"web",[70,380,381],{},"db",[70,383,384],{},"redis",[70,386,387],{},"weaviate",[70,389,390],{},"sandbox",[70,392,393],{},"plugin_daemon"," 等容器。",[20,396,397],{},"任何一个反复重启都要先解决","，否则后面用不了。",[52,400,402],{"id":401},"_33-初始化","3.3 初始化",[16,404,405,406,409],{},"浏览器打开 ",[70,407,408],{},"http:\u002F\u002F你的内网IP:8088","，第一次访问会要求设置管理员邮箱和密码，设置完登录即可。",[11,411,413],{"id":412},"_4-接入本地-ollama","4 接入本地 Ollama",[16,415,416,417,420,421,424],{},"Dify 需要两类模型：",[20,418,419],{},"推理模型","（生成回答）和",[20,422,423],{},"向量模型","（把文字变成向量）。两者都在「设置 → 模型供应商」里配置。",[52,426,428],{"id":427},"_41-base-url-怎么填","4.1 Base URL 怎么填",[16,430,431,432],{},"这是最容易踩的坑：",[20,433,434,435,438],{},"Dify 跑在容器里，容器里的 ",[70,436,437],{},"localhost"," 是它自己，不是你的宿主机。",[88,440,441,451],{},[91,442,443],{},[94,444,445,448],{},[97,446,447],{},"情况",[97,449,450],{},"Base URL 填什么",[107,452,453,464,474],{},[94,454,455,458],{},[112,456,457],{},"Linux 宿主机",[112,459,460,463],{},[70,461,462],{},"http:\u002F\u002F192.168.x.x:11434","（宿主内网 IP，最稳）",[94,465,466,469],{},[112,467,468],{},"已配 host-gateway",[112,470,471],{},[70,472,473],{},"http:\u002F\u002Fhost.docker.internal:11434",[94,475,476,479],{},[112,477,478],{},"Ollama 在另一台机器",[112,480,481],{},"那台机器的内网 IP",[52,483,485],{"id":484},"_42-配置步骤","4.2 配置步骤",[16,487,488],{},"「设置 → 模型供应商 → Ollama」：",[194,490,491,500,509],{},[197,492,493,496,497,23],{},[20,494,495],{},"模型类型","：选 LLM，添加你已拉取的对话模型，如 ",[70,498,499],{},"qwen2.5:7b",[197,501,502,505,506,23],{},[20,503,504],{},"再添加一个"," Embedding 类型，填向量模型，如 ",[70,507,508],{},"bge-m3",[197,510,511],{},"保存后点「测试」，出现绿色对勾即成功。",[173,513,514],{},[16,515,516,517,520],{},"⚠️ ",[20,518,519],{},"向量模型必须单独配","。只配了对话模型的话，创建知识库时会提示找不到 embedding 模型——这是新手最常见的卡点。",[11,522,524],{"id":523},"_5-准备知识库数据","5 准备知识库数据",[52,526,528],{"id":527},"_51-从博客导出文章","5.1 从博客导出文章",[16,530,531,532,535,536,539],{},"知识库的原料就是 ",[70,533,534],{},"content\u002Fblog\u002F"," 下的 Markdown 文件。Dify 支持批量上传，但",[20,537,538],{},"一篇一文件更好用","，因为检索结果能直接告诉你出自哪篇。",[63,541,543],{"className":221,"code":542,"language":223,"meta":72,"style":72},"# 把散落在各级目录的文章复制到一个临时目录，便于批量上传\ncd 你的博客仓库根目录\nmkdir -p \u002Ftmp\u002Fblog-kb\n\nfind content\u002Fblog -name \"*.md\" -not -path \"*\u002F.obsidian\u002F*\" -exec cp {} \u002Ftmp\u002Fblog-kb\u002F \\;\n\n# 确认数量对得上\nls \u002Ftmp\u002Fblog-kb | wc -l\n",[70,544,545,550,557,568,572,610,614,620],{"__ignoreMap":72},[227,546,547],{"class":229,"line":230},[227,548,549],{"class":233},"# 把散落在各级目录的文章复制到一个临时目录，便于批量上传\n",[227,551,552,554],{"class":229,"line":237},[227,553,255],{"class":254},[227,555,556],{"class":244}," 你的博客仓库根目录\n",[227,558,559,562,565],{"class":229,"line":251},[227,560,561],{"class":240},"mkdir",[227,563,564],{"class":254}," -p",[227,566,567],{"class":244}," \u002Ftmp\u002Fblog-kb\n",[227,569,570],{"class":229,"line":261},[227,571,265],{"emptyLinePlaceholder":264},[227,573,574,577,580,583,586,589,592,595,598,601,604,607],{"class":229,"line":268},[227,575,576],{"class":240},"find",[227,578,579],{"class":244}," content\u002Fblog",[227,581,582],{"class":254}," -name",[227,584,585],{"class":244}," \"*.md\"",[227,587,588],{"class":254}," -not",[227,590,591],{"class":254}," -path",[227,593,594],{"class":244}," \"*\u002F.obsidian\u002F*\"",[227,596,597],{"class":254}," -exec",[227,599,600],{"class":244}," cp",[227,602,603],{"class":244}," {}",[227,605,606],{"class":244}," \u002Ftmp\u002Fblog-kb\u002F",[227,608,609],{"class":254}," \\;\n",[227,611,612],{"class":229,"line":274},[227,613,265],{"emptyLinePlaceholder":264},[227,615,617],{"class":229,"line":616},7,[227,618,619],{"class":233},"# 确认数量对得上\n",[227,621,623,626,629,632,635],{"class":229,"line":622},8,[227,624,625],{"class":240},"ls",[227,627,628],{"class":244}," \u002Ftmp\u002Fblog-kb",[227,630,631],{"class":316}," |",[227,633,634],{"class":240}," wc",[227,636,637],{"class":254}," -l\n",[173,639,640],{},[16,641,642,645,646,372,649,372,652,655],{},[20,643,644],{},"建议保留 frontmatter","。里面的 ",[70,647,648],{},"title",[70,650,651],{},"date",[70,653,654],{},"tags"," 是有价值的信息，检索时能帮模型判断文章主题。如果担心干扰，可以在上传后再用处理规则过滤。",[52,657,659],{"id":658},"_52-分块策略","5.2 分块策略",[16,661,662,663,297],{},"新建知识库时，「分段设置」决定文章怎么切。这是",[20,664,665],{},"影响效果最大的一个参数",[88,667,668,681],{},[91,669,670],{},[94,671,672,675,678],{},[97,673,674],{},"参数",[97,676,677],{},"建议值",[97,679,680],{},"理由",[107,682,683,697,708],{},[94,684,685,688,694],{},[112,686,687],{},"分段标识符",[112,689,690,693],{},[70,691,692],{},"\\n\\n","（按段落）",[112,695,696],{},"技术文章天然按段落组织",[94,698,699,702,705],{},[112,700,701],{},"最大分段长度",[112,703,704],{},"500 tokens",[112,706,707],{},"太小会丢上下文，太大会稀释相关性",[94,709,710,713,716],{},[112,711,712],{},"分段重叠长度",[112,714,715],{},"50 tokens",[112,717,718],{},"避免正好切在关键句中间",[173,720,721],{},[16,722,723,724,727],{},"技术教程类文章",[20,725,726],{},"不要用固定长度硬切","，因为一个命令块被切成两半，检索出来的片段就没法用了。按段落切、给足重叠，效果明显更好。",[11,729,731],{"id":730},"_6-创建知识库与检索测试","6 创建知识库与检索测试",[16,733,734],{},"「知识库 → 创建知识库」：",[736,737,738,744,751,754],"ol",{},[197,739,740,741,743],{},"选择刚配好的 Ollama embedding 模型（如 ",[70,742,508],{},"）；",[197,745,746,747,750],{},"上传 ",[70,748,749],{},"\u002Ftmp\u002Fblog-kb"," 下的 Markdown 文件；",[197,752,753],{},"分段设置按 5.2 填；",[197,755,756,757,759],{},"等待索引完成（",[70,758,508],{}," 速度中等，56 篇文章大约几分钟）。",[16,761,762],{},"完成后在知识库的「召回测试」标签页里试几个问题：",[194,764,765,768,771],{},[197,766,767],{},"「AdGuard 部署在哪个端口？」",[197,769,770],{},"「DD 脚本重装后默认密码是什么？」",[197,772,773],{},"「飞牛 OS 外网访问是怎么做安全加固的？」",[16,775,776,779],{},[20,777,778],{},"看召回的是什么片段，而不是看回答。"," 检索对了，回答自然对；检索错了，再换模型也没用。",[52,781,783],{"id":782},"_61-检索模式怎么选","6.1 检索模式怎么选",[88,785,786,799],{},[91,787,788],{},[94,789,790,793,796],{},[97,791,792],{},"模式",[97,794,795],{},"特点",[97,797,798],{},"适合",[107,800,801,812,823],{},[94,802,803,806,809],{},[112,804,805],{},"向量检索",[112,807,808],{},"语义匹配，换个说法也能找到",[112,810,811],{},"中文提问（推荐）",[94,813,814,817,820],{},[112,815,816],{},"全文检索",[112,818,819],{},"精确关键词匹配",[112,821,822],{},"查具体的命令、报错信息",[94,824,825,828,831],{},[112,826,827],{},"混合检索",[112,829,830],{},"两者加权，通常效果最好",[112,832,833],{},"不确定时的默认选择",[173,835,836],{},[16,837,838,839,842,843,372,846,849],{},"我的建议：",[20,840,841],{},"中文技术博客用「混合检索」","。纯向量检索对专有名词（如 ",[70,844,845],{},"strm",[70,847,848],{},"LXC","）反而容易跑偏，全文检索能兜住。",[11,851,853],{"id":852},"_7-组装成对话应用","7 组装成对话应用",[16,855,856],{},"知识库建好后，「工作室 → 创建应用 → 聊天助手」，在编排页里：",[194,858,859,865,873],{},[197,860,861,864],{},[20,862,863],{},"添加上下文","：选中刚建的知识库；",[197,866,867,869,870,872],{},[20,868,419],{},"：选 Ollama 里的 ",[70,871,499],{},"；",[197,874,875,878],{},[20,876,877],{},"提示词","：明确告诉它基于资料回答。例如：",[63,880,883],{"className":881,"code":882,"language":68},[66],"你是一个博客知识库助手。请严格根据提供的上下文回答用户问题。\n\n规则：\n1. 如果上下文里没有相关内容，直接回答「我的博客里没有写过这个」，不要编造。\n2. 回答时引用出处文章的标题。\n3. 涉及命令、端口、路径时，原样保留，不要改写。\n",[70,884,882],{"__ignoreMap":72},[16,886,887,888,891],{},"第 1 条规则很重要——",[20,889,890],{},"它把「不知道」变成了一种合法回答","，能挡掉大部分幻觉。",[11,893,895],{"id":894},"_8-实测与调优","8 实测与调优",[16,897,898,899,901,902,904],{},"在我的环境（RTX 3060 12G + ",[70,900,499],{}," + ",[70,903,508],{},"）实测：",[88,906,907,917],{},[91,908,909],{},[94,910,911,914],{},[97,912,913],{},"项目",[97,915,916],{},"表现",[107,918,919,927,935,943],{},[94,920,921,924],{},[112,922,923],{},"索引速度",[112,925,926],{},"56 篇约 3–5 分钟",[94,928,929,932],{},[112,930,931],{},"单次问答耗时",[112,933,934],{},"首字 2–4 秒，完整回答 8–15 秒",[94,936,937,940],{},[112,938,939],{},"检索命中率",[112,941,942],{},"明确的「端口\u002F命令\u002F步骤」类问题基本都能召回正确文章",[94,944,945,948],{},[112,946,947],{},"概念类提问",[112,949,950],{},"表述差异大时偶尔召回不准，需补充领域词或把文章标题写进提问",[173,952,953],{},[16,954,955,958],{},[20,956,957],{},"一个实用技巧","：提问时带上领域词效果明显更好。问「飞牛 反代 雷池 怎么配」比问「怎么让 NAS 安全外网访问」召回率高得多。",[11,960,962],{"id":961},"_9-常见问题","9 常见问题",[52,964,966],{"id":965},"_91-提示找不到-embedding-模型","9.1 提示找不到 embedding 模型",[16,968,969],{},"模型供应商里只配了 LLM，没配 Embedding。回到 4.2 补配。",[52,971,973],{"id":972},"_92-上传文件后一直卡在索引中","9.2 上传文件后一直卡在索引中",[16,975,976,977,979],{},"先看 ",[70,978,508],{}," 是否真的在跑：",[63,981,983],{"className":221,"code":982,"language":223,"meta":72,"style":72},"# 在 Ollama 宿主机上查看模型占用\ndocker exec -it ollama ollama ps\n",[70,984,985,990],{"__ignoreMap":72},[227,986,987],{"class":229,"line":230},[227,988,989],{"class":233},"# 在 Ollama 宿主机上查看模型占用\n",[227,991,992,994,997,1000,1003,1005],{"class":229,"line":237},[227,993,338],{"class":240},[227,995,996],{"class":244}," exec",[227,998,999],{"class":254}," -it",[227,1001,1002],{"class":244}," ollama",[227,1004,1002],{"class":244},[227,1006,365],{"class":244},[16,1008,1009,1010,1013,1014,23],{},"如果不是 ",[70,1011,1012],{},"100% GPU","，说明显存不足降级到了 CPU，向量化会慢很多。可以换成更小的 embedding 模型，或改用 CPU 专用的 ",[70,1015,1016],{},"nomic-embed-text",[52,1018,1020],{"id":1019},"_93-回答答非所问-一直说没有写过","9.3 回答答非所问 \u002F 一直说「没有写过」",[194,1022,1023,1029,1035],{},[197,1024,1025,1028],{},[20,1026,1027],{},"分块太大","：500 tokens 以上会让检索相关性被稀释，调小试试；",[197,1030,1031,1034],{},[20,1032,1033],{},"检索模式不对","：换成混合检索；",[197,1036,1037,1040],{},[20,1038,1039],{},"文章本身没写","：确认那篇内容真的在知识库里（用召回测试直接查关键词）。",[52,1042,1044],{"id":1043},"_94-内存被吃满","9.4 内存被吃满",[16,1046,1047,1048,1050],{},"Dify 全家桶本身占 2–3 GB，加上模型推理，4 GB 内存机器会很紧张。可以停掉用不到的服务（如 ",[70,1049,390],{},"）精简，或者把向量库换成更轻的选项。",[11,1052,1054],{"id":1053},"_10-总结","10 总结",[194,1056,1057,1063,1070,1077],{},[197,1058,1059,1062],{},[20,1060,1061],{},"RAG 解决的是「事实」，微调解决的是「风格」","，让 AI 读懂自己的文章用 RAG 就够了。",[197,1064,1065,1066,1069],{},"影响效果最大的不是模型大小，而是",[20,1067,1068],{},"分块策略和检索模式","，这两个值得反复调。",[197,1071,1072,1073,1076],{},"提示词里一定要写「",[20,1074,1075],{},"查不到就说没有","」，否则本地模型会一本正经地编造。",[197,1078,1079],{},"这套方案的数据全程在内网，写过的文章不必交给任何第三方。",[173,1081,1082],{},[16,1083,1084],{},"阅读本文前建议先完成《用 Docker 部署 Ollama 与 Open WebUI 搭建本地大模型》，因为本文的推理与向量模型都依赖它。",[16,1086,1087],{},"Created with ❤️ by 张萌萌",[1089,1090,1091],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":72,"searchDepth":237,"depth":237,"links":1093},[1094,1095,1099,1104,1108,1112,1115,1116,1117,1123],{"id":13,"depth":237,"text":14},{"id":49,"depth":237,"text":50,"children":1096},[1097,1098],{"id":54,"depth":251,"text":55},{"id":82,"depth":251,"text":83},{"id":184,"depth":237,"text":185,"children":1100},[1101,1102,1103],{"id":191,"depth":251,"text":192},{"id":217,"depth":251,"text":218},{"id":401,"depth":251,"text":402},{"id":412,"depth":237,"text":413,"children":1105},[1106,1107],{"id":427,"depth":251,"text":428},{"id":484,"depth":251,"text":485},{"id":523,"depth":237,"text":524,"children":1109},[1110,1111],{"id":527,"depth":251,"text":528},{"id":658,"depth":251,"text":659},{"id":730,"depth":237,"text":731,"children":1113},[1114],{"id":782,"depth":251,"text":783},{"id":852,"depth":237,"text":853},{"id":894,"depth":237,"text":895},{"id":961,"depth":237,"text":962,"children":1118},[1119,1120,1121,1122],{"id":965,"depth":251,"text":966},{"id":972,"depth":251,"text":973},{"id":1019,"depth":251,"text":1020},{"id":1043,"depth":251,"text":1044},{"id":1053,"depth":237,"text":1054},"AI",null,"2026-09-23","用 Dify 把博客的 Markdown 文章建成可问答的本地知识库，含分块策略、向量模型选择与检索实测",false,"md","https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F09\u002F25\u002F1790268754681.avif",{"published":1126},"\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F03.用-Dify-搭建本地知识库让-AI-读懂你写的博客",{"title":5,"description":1127},"blog\u002F10-技术专栏\u002F50-AI\u002F03.用 Dify 搭建本地知识库让 AI 读懂你写的博客",[42,35,1136,1137],"知识库","Ollama","IB3AMWbfqZczi-ocN941qrSYGQQc-HuLXrihbt8O1ic",[1140,1144,1148,1151,1154,1155,1159,1162,1166,1170,1174,1178,1182,1186,1190,1194,1198,1202,1206,1209,1213,1217,1221,1225,1228,1232,1236,1240,1244,1248,1252,1256,1260,1264,1268,1272,1276,1279,1283,1287,1291,1295,1299,1302,1305,1308,1311,1314,1317,1320,1323,1326,1329,1332,1335,1338,1341,1344,1347,1350,1353],{"path":1141,"title":1142,"date":1143},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F16.IPv6与DNS的分手协议","IPv6 与 DNS 的分手协议","2026-10-02",{"path":1145,"title":1146,"date":1147},"\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F04.我的-AI-入坑记","我的 AI 入坑记","2026-09-24",{"path":1149,"title":1150,"date":1126},"\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F01.用-Docker-部署-Ollama-与-Open-WebUI-搭建本地大模型","用 Docker 部署 Ollama 与 Open WebUI 搭建本地大模型",{"path":1152,"title":1153,"date":1126},"\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F02.用-New-API-搭建统一-LLM-网关与-Lucky-反代外网访问","用 New API 搭建统一 LLM 网关与 Lucky 反代外网访问",{"path":1132,"title":5,"date":1126},{"path":1156,"title":1157,"date":1158},"\u002Fblog\u002F20-生活碎片\u002F03-2026年秋季计划","2026 年秋季计划","2026-09-19",{"path":1160,"title":1161,"date":1158},"\u002Fblog\u002F30-学习笔记\u002F02.Python入门书单","Python 入门书单：从第一行代码到写出真正的程序",{"path":1163,"title":1164,"date":1165},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F09-Cloudflare-低延迟接入方案","Cloudflare 低延迟接入方案","2026-07-22 03:17:28",{"path":1167,"title":1168,"date":1169},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F08-Cloudflare-ImgBed-免费私有图床完整部署手册","Cloudflare ImgBed 免费私有图床完整部署手册","2026-07-19 02:09:08",{"path":1171,"title":1172,"date":1173},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F07-腾讯云-EdgeOne-边缘函数实现七牛-S3-随机图床-API","腾讯云 EdgeOne 边缘函数实现七牛云 & S3 存储随机图床 API","2026-07-13 21:25:48",{"path":1175,"title":1176,"date":1177},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F06-腾讯-EdgeOne-部署-Twikoo-评论系统指南","腾讯EdgeOne部署Twikoo评论系统指南","2026-06-14 17:41:11",{"path":1179,"title":1180,"date":1181},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F05-OpenList-接入-S3-对象存储完整使用教程","OpenList 接入 S3 对象存储完整使用教程","2026-06-11 13:08:07",{"path":1183,"title":1184,"date":1185},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F04-Cloudflare-R2-图床与全球加速方案","Cloudflare R2 图床与全球加速方案","2026-06-09 13:07:35",{"path":1187,"title":1188,"date":1189},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F03-免费图床与CDN加速方案","免费图床与 CDN 加速方案","2026-06-09",{"path":1191,"title":1192,"date":1193},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F02-零基础优雅搭建静态博客全教程","零基础优雅搭建静态博客全教程","2026-06-04",{"path":1195,"title":1196,"date":1197},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F01-远古产物—博客","赛博空间的私人岛屿：博客架构与风格美学","2026-06-03",{"path":1199,"title":1200,"date":1201},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F15.关于NAT回流与内网域名直连的终极指南","关于 NAT 回流与内网域名直连的终极指南","2026-05-13",{"path":1203,"title":1204,"date":1205},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F14.飞牛安全访问与Lucky反代雷池防护","飞牛安全访问与 Lucky 反代雷池防护","2026-02-03",{"path":1207,"title":1208,"date":1205},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F18.一键DD纯净系统脚本","一键 DD 纯净系统脚本",{"path":1210,"title":1211,"date":1212},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F17.Ventoy多系统启动盘制作与使用全指南","Ventoy 多系统启动盘制作与使用全指南","2026-02-02",{"path":1214,"title":1215,"date":1216},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F16.Emby元数据匹配与中文命名规范","Emby 元数据匹配与中文命名规范","2026-02-01",{"path":1218,"title":1219,"date":1220},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F15.基于PVE系统安装LXC-debian","基于 PVE 系统安装 LXC-debian","2026-01-19",{"path":1222,"title":1223,"date":1224},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F13.Lucky反向代理终极指南","Lucky 反向代理终极指南","2026-01-16",{"path":1226,"title":1227,"date":1224},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F14.OEC盒子Armbian刷机指南","OEC 盒子 Armbian 刷机指南",{"path":1229,"title":1230,"date":1231},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F13.oec-fnOS安装","OEC-Turbo (RK3566) 安装飞牛 OS","2026-01-15",{"path":1233,"title":1234,"date":1235},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F12.新的篇章，debian12的配置","新的篇章，debian12 的配置","2026-01-14",{"path":1237,"title":1238,"date":1239},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F11.飞牛OS安装后必要配置","飞牛 OS 安装后必要配置","2026-01-06",{"path":1241,"title":1242,"date":1243},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F11.NAS-导航页的终极形态","告别繁琐配置：NAS 导航页的终极形态 —— 从 Sun-Panel 到 FlatNAS","2026-01-05",{"path":1245,"title":1246,"date":1247},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F10.LogVar-弹幕-API-部署指南","LogVar 弹幕 API  (纯本地缓存版) 部署指南","2025-12-30",{"path":1249,"title":1250,"date":1251},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F10.基于Lucky与QMediaSync的飞牛远程媒体访问","基于 Lucky 与 QMediaSync 的飞牛远程媒体访问","2025-12-26",{"path":1253,"title":1254,"date":1255},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F09.新的篇章，PVE虚拟机","新的篇章，PVE虚拟机","2025-12-21",{"path":1257,"title":1258,"date":1259},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F08.Linux系统，音响有底噪","Linux 系统，音响有底噪怎么办？","2025-12-17",{"path":1261,"title":1262,"date":1263},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F07.飞牛OS的安装","飞牛 OS 的安装","2025-12-14",{"path":1265,"title":1266,"date":1267},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F06.Debian13换源","Debian13 换源","2025-11-29",{"path":1269,"title":1270,"date":1271},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F05.Kodi-CoreELEC安装指南","Kodi & CoreELEC 安装指南","2025-11-21",{"path":1273,"title":1274,"date":1275},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F09.兰空图床和高清图标库","兰空图床和高清图标库","2025-11-15",{"path":1277,"title":1278,"date":1275},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F04.N1盒子Armbian刷机与配置","N1 盒子 Armbian 刷机与配置",{"path":1280,"title":1281,"date":1282},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F08.你是否需要一个图床？","你是否需要一个图床？","2025-11-14",{"path":1284,"title":1285,"date":1286},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F03.飞牛NAS第三方应用商店安装","飞牛 NAS 第三方应用商店 (FnDepot) 安装指南","2025-10-13",{"path":1288,"title":1289,"date":1290},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F02.Hills播放器-Windows-安卓","Hills 播放器（Windows + 安卓）","2025-09-24",{"path":1292,"title":1293,"date":1294},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F01.一行代码降低服务器功耗","一行代码降低服务器功耗","2025-08-19",{"path":1296,"title":1297,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F01.容器-docker-docker-compose","容器 & docker & docker-compose","2025-08-05",{"path":1300,"title":1301,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F02.容器项目-传输类","容器项目&传输类",{"path":1303,"title":1304,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F03.容器项目-相册类","容器项目&相册类",{"path":1306,"title":1307,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F04.容器项目-媒体类","容器项目&媒体类",{"path":1309,"title":1310,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F05.Emby自有授权媒体库（一）","Emby 自有授权媒体库（一）",{"path":1312,"title":1313,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F06.Emby自有授权媒体库（二）","Emby 自有授权媒体库（二）",{"path":1315,"title":1316,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F07.Adguard-Home去广告","Adguard Home 去广告",{"path":1318,"title":1319,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F01.新的篇章，软路由","新的篇章，软路由",{"path":1321,"title":1322,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F02.如何玩公网，怎么远程访问（一）","如何玩公网，怎么远程访问（一）",{"path":1324,"title":1325,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F03.如何玩公网，怎么远程访问（二）","如何玩公网，怎么远程访问（二）",{"path":1327,"title":1328,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F04.如何玩公网，怎么远程访问（三）","如何玩公网，怎么远程访问（三）",{"path":1330,"title":1331,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F05.免费域名与远程访问","免费域名与远程访问",{"path":1333,"title":1334,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F06.没有公网如何远程访问","没有公网如何远程访问",{"path":1336,"title":1337,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F07.爱快与OpenWRT双软路由MAC地址重复问题修正","爱快与 OpenWRT 双软路由MAC地址重复问题修正",{"path":1339,"title":1340,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F08.OpenWRT扩容","OpenWRT 扩容",{"path":1342,"title":1343,"date":1298},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F09.OpenWRT旁路由一条龙教程","OpenWRT 旁路由一条龙教程",{"path":1345,"title":1346,"date":1298},"\u002Fblog\u002F20-生活碎片\u002F02.在裂缝中种满阳光","让灵魂带着光行走：在裂缝中种满太阳",{"path":1348,"title":1349,"date":1298},"\u002Fblog\u002F30-学习笔记\u002F01.Typora学习笔记","Typora学习笔记",{"path":1351,"title":1352,"date":1298},"\u002Fblog\u002F30-学习笔记\u002F02.Markdown-拓展","Markdown 拓展",{"path":1354,"title":1355,"date":1356},"\u002Fblog\u002F20-生活碎片\u002F01.拥抱生活中的光与热","拥抱生活中的光与热","2025-07-05",1791304406308]