<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>本地大模型 on Harry0703</title><link>https://harry0703.com/tags/%E6%9C%AC%E5%9C%B0%E5%A4%A7%E6%A8%A1%E5%9E%8B/</link><description>Recent content in 本地大模型 on Harry0703</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><managingEditor>harry0703@hotmail.com (Harry)</managingEditor><webMaster>harry0703@hotmail.com (Harry)</webMaster><copyright>&lt;a href="https://github.com/harry0703" target="_blank" rel="noopener noreferrer"&gt;github.com/harry0703&lt;/a&gt;</copyright><lastBuildDate>Sat, 20 Apr 2024 13:56:01 +0800</lastBuildDate><atom:link href="https://harry0703.com/tags/%E6%9C%AC%E5%9C%B0%E5%A4%A7%E6%A8%A1%E5%9E%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>手把手教你构建一个 本地化的，免费的，企业级的，AI大模型知识库问答系统</title><link>https://harry0703.com/post/enterprise-knowledge-llm-qa/</link><pubDate>Sat, 20 Apr 2024 13:56:01 +0800</pubDate><author>harry0703@hotmail.com (Harry)</author><guid>https://harry0703.com/post/enterprise-knowledge-llm-qa/</guid><description>&lt;p&gt;我将通过一个系列分享，手把手的教大家打造一个完全本地化的，免费的，企业级知识库问答系统&lt;/p&gt;
&lt;h2 id="本地大模型回答演示图"&gt;本地大模型回答演示图&lt;/h2&gt;
&lt;img src="https://harry0703.com/post/enterprise-knowledge-llm-qa/gitmin1.jpg" alt="gitmin1.jpg"&gt;&lt;h2 id="知识库导入演示图"&gt;知识库导入演示图&lt;/h2&gt;
&lt;img src="https://harry0703.com/post/enterprise-knowledge-llm-qa/gitmind2.jpg" alt="gitmind2.jpg"&gt;&lt;h2 id="我认为本地化主要有2方面的意义"&gt;我认为本地化主要有2方面的意义：&lt;/h2&gt;
&lt;h3 id="1-安全性"&gt;1. 安全性&lt;/h3&gt;
&lt;p&gt;当使用外部模型或服务时，我们的私有数据，用户问题，都会被发送给第三方
那我们就要面临私有数据暴露给别人的风险，甚至会导致数据泄露
本地化会让我们的数据就更安全&lt;/p&gt;
&lt;h3 id="2-灵活性"&gt;2. 灵活性&lt;/h3&gt;
&lt;p&gt;另外随着我们的业务发展，如果模型不能很好的满足我们需求的时候
我们可以很方便的对本地模型其进行微调
以达到更好的适配&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这样就既兼顾了安全，又兼顾了灵活性&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="应用场景"&gt;应用场景&lt;/h2&gt;
&lt;p&gt;知识库问答的使用场景其实非常多，我随便举2个商业系统的例子&lt;/p&gt;
&lt;p&gt;比如对个人，可以用来&lt;code&gt;整理笔记&lt;/code&gt;、&lt;code&gt;论文解读&lt;/code&gt;、&lt;code&gt;文献检索&lt;/code&gt;、&lt;code&gt;文档问答&lt;/code&gt;等等。
这里我用 &lt;a href="https://lightpdf.cn/chatdoc"&gt;轻闪PDF的文档对话 https://lightpdf.cn/chatdoc&lt;/a&gt; 来演示一下效果。&lt;/p&gt;
&lt;p&gt;我们随便上传一个PDF文档，等文档解析完成后，我们就可以通过提问的方式，对文档里面的内容进行解读，可以很快的从文档中找到我们想要的内容，
&lt;strong&gt;大大提高我们查看文档的效率&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对企业，可以用来做&lt;code&gt;智能客服&lt;/code&gt;，&lt;code&gt;数据沉淀&lt;/code&gt;或者&lt;code&gt;数字员工&lt;/code&gt;等等，同样我用&lt;a href="https://gitmind.cn"&gt;思乎的在线客服 https://gitmind.cn&lt;/a&gt;
来演示一下。&lt;/p&gt;
&lt;p&gt;我们可以向客服提问，AI就会准确的回复我们的问题，而这些问题的答案，大模型本身是没有的。
因为大模型既不了解我们的业务，也不知道我们的数据，这些AI回复的答案，都是从企业的知识库里面获取的。这样我们就实现了一个7x24小时的智能客服，
&lt;strong&gt;不仅为企业降本增效，还提高了客户的满意度&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="服务器配置要求"&gt;服务器配置要求&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;环境&lt;/th&gt;
&lt;th&gt;最低配置&lt;/th&gt;
&lt;th&gt;推荐配置&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;测试&lt;/td&gt;
&lt;td&gt;2核 2GB&lt;/td&gt;
&lt;td&gt;2核 4GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100w 组向量&lt;/td&gt;
&lt;td&gt;4核 8GB 50GB&lt;/td&gt;
&lt;td&gt;4核 16GB 50GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500w 组向量&lt;/td&gt;
&lt;td&gt;8核 32GB 200GB&lt;/td&gt;
&lt;td&gt;16核 48GB 200GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000w 组向量&lt;/td&gt;
&lt;td&gt;16核 48GB 200GB&lt;/td&gt;
&lt;td&gt;32核 64GB 500GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="架构图"&gt;架构图&lt;/h2&gt;
&lt;p&gt;整个的系统搭建，都是基于这个架构图来进行的&lt;/p&gt;
&lt;img src="https://harry0703.com/post/enterprise-knowledge-llm-qa/architecture.jpg" alt="架构图"&gt;&lt;h2 id="rag原理"&gt;RAG原理&lt;/h2&gt;
&lt;h3 id="是什么"&gt;是什么&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检索：Retrieval，通过向量模型，或者多种混合检索方式，从知识库中检索出相关的文档&lt;/li&gt;
&lt;li&gt;增强：Augmentation，通过将检索到的文档，附加到提示词中，进行增强。也即 ICL（In Context Learning）&lt;/li&gt;
&lt;li&gt;生成：Generation，通过大语言模型，生成答案&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="有什么优势"&gt;有什么优势&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;有助于减轻大模型的幻觉，提高大模型回复的准确性&lt;/li&gt;
&lt;li&gt;与微调不同，RAG提供了一定的可观察性和可检查性&lt;/li&gt;
&lt;li&gt;成本低，好实施&lt;/li&gt;
&lt;/ol&gt;
&lt;img src="https://harry0703.com/post/enterprise-knowledge-llm-qa/rag.png" alt="rag.png"&gt;&lt;h2 id="安装-docker"&gt;安装 Docker&lt;/h2&gt;
&lt;p&gt;下载 Docker 并安装 &lt;a href="https://www.docker.com/products/docker-desktop/"&gt;https://www.docker.com/products/docker-desktop/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="安装-ollama"&gt;安装 Ollama&lt;/h2&gt;
&lt;p&gt;下载 Ollama 并安装 &lt;a href="https://ollama.com/"&gt;https://ollama.com/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="下载-chat-模型"&gt;下载 Chat 模型&lt;/h3&gt;
&lt;p&gt;我使用阿里的通义千问作为演示，根据自己的电脑配置情况，选择合适的模型。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;总体来说，模型是越大，效果越好&lt;/strong&gt;，但是对电脑的配置要求也越高&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;4b 模型要 3GB内存&lt;/li&gt;
&lt;li&gt;7b 模型要 8GB 内存&lt;/li&gt;
&lt;li&gt;13b 模型要 16GB 内存&lt;/li&gt;
&lt;li&gt;70b 模型要 64GB 内存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特别注意：你如果要&lt;strong&gt;用于商业用途，需要申请授权&lt;/strong&gt;，否则只能用于个人学习&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;千问许可说明: &lt;a href="https://ollama.com/library/qwen:latest/blobs/41c2cf8c272f"&gt;https://ollama.com/library/qwen:latest/blobs/41c2cf8c272f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;申请商用授权: &lt;a href="https://dashscope.console.aliyun.com/openModelApply/qianwen"&gt;https://dashscope.console.aliyun.com/openModelApply/qianwen&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="下载模型"&gt;下载模型&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ollama pull qwen:7b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="测试api请求"&gt;测试API请求&lt;/h4&gt;
&lt;p&gt;等模型下载和安装好后，执行下面的命令，测试API请求是否成功&lt;/p&gt;
&lt;h5 id="maclinux下执行"&gt;Mac/Linux下执行：&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl &lt;span style="color:#e6db74"&gt;&amp;#39;http://localhost:11434/api/chat&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--data &lt;span style="color:#e6db74"&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;model&amp;#34;: &amp;#34;qwen:7b&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;messages&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;content&amp;#34;: &amp;#34;你是谁&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;temperature&amp;#34;: 0.1,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;stream&amp;#34;: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id="windows下执行"&gt;Windows下执行：&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl &lt;span style="color:#e6db74"&gt;&amp;#34;http://localhost:11434/api/chat&amp;#34;&lt;/span&gt; ^
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--data &lt;span style="color:#e6db74"&gt;&amp;#34;{&amp;#34;&amp;#34;model&amp;#34;&amp;#34;: &amp;#34;&amp;#34;qwen:7b&amp;#34;&amp;#34;, &amp;#34;&amp;#34;messages&amp;#34;&amp;#34;: [{&amp;#34;&amp;#34;role&amp;#34;&amp;#34;: &amp;#34;&amp;#34;user&amp;#34;&amp;#34;, &amp;#34;&amp;#34;content&amp;#34;&amp;#34;: &amp;#34;&amp;#34;你是谁&amp;#34;&amp;#34;}], &amp;#34;&amp;#34;temperature&amp;#34;&amp;#34;: 0.1, &amp;#34;&amp;#34;stream&amp;#34;&amp;#34;: false}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="下载-embedding-模型"&gt;下载 Embedding 模型&lt;/h3&gt;
&lt;p&gt;我使用了 DmetaSoul 的中文Embedding模型，该模型&lt;code&gt;号称&lt;/code&gt;在 MTEB
中文榜单取得开源第一的成绩: &lt;a href="https://huggingface.co/DMetaSoul/Dmeta-embedding-zh/blob/main/README_zh.md"&gt;https://huggingface.co/DMetaSoul/Dmeta-embedding-zh/blob/main/README_zh.md&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="下载模型-1"&gt;下载模型&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ollama pull shaw/dmeta-embedding-zh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="测试api请求-1"&gt;测试API请求&lt;/h4&gt;
&lt;p&gt;等模型下载和安装好后，执行下面的命令，测试API请求是否成功&lt;/p&gt;
&lt;h5 id="maclinux下执行-1"&gt;Mac/Linux下执行：&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl &lt;span style="color:#e6db74"&gt;&amp;#39;http://localhost:11434/api/embeddings&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--data &lt;span style="color:#e6db74"&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;model&amp;#34;: &amp;#34;shaw/dmeta-embedding-zh&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;prompt&amp;#34;: &amp;#34;天空是灰色的&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id="windows下执行-1"&gt;Windows下执行：&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl &lt;span style="color:#e6db74"&gt;&amp;#34;http://localhost:11434/api/embeddings&amp;#34;&lt;/span&gt; ^
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--data &lt;span style="color:#e6db74"&gt;&amp;#34;{&amp;#34;&amp;#34;model&amp;#34;&amp;#34;: &amp;#34;&amp;#34;shaw/dmeta-embedding-zh&amp;#34;&amp;#34;, &amp;#34;&amp;#34;prompt&amp;#34;&amp;#34;: &amp;#34;&amp;#34;天空是灰色的&amp;#34;&amp;#34;}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="安装fastgpt及其依赖"&gt;安装FastGPT及其依赖&lt;/h2&gt;
&lt;h3 id="1-下载-docker-文件-和-config-文件"&gt;1. 下载 docker 文件 和 config 文件&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;你可以手动下载，放到一个文件夹里面&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;docker-compose.yml: &lt;a href="https://harry0703.com/kbqa/docker-compose.yml"&gt;https://harry0703.com/kbqa/docker-compose.yml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;config.json: &lt;a href="https://harry0703.com/kbqa/config.json"&gt;https://harry0703.com/kbqa/config.json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;也可以直接执行下面的命令，自动下载&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir kbqa
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd kbqa
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -O https://harry0703.com/kbqa/docker-compose.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -O https://harry0703.com/kbqa/config.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-启动-docker"&gt;2. 启动 docker&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次启动会有点慢，因为要拉取镜像，后面启动就会很快了&lt;/li&gt;
&lt;li&gt;如果第一次启动失败，可以多次执行 &lt;code&gt;docker-compose up&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-访问-fastgpt-和-oneapi"&gt;3. 访问 FastGPT 和 OneAPI&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;你第一次访问，系统里面是没有数据的，截图里面的数据，是我测试的时候已经创建好了的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="fastgpt"&gt;FastGPT&lt;/h4&gt;
&lt;p&gt;点击访问：&lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;用户名 &lt;code&gt;root&lt;/code&gt;，密码 &lt;code&gt;1234&lt;/code&gt;（密码可以在 &lt;code&gt;docker-compose.yml&lt;/code&gt;
环境变量里设置 &lt;code&gt;DEFAULT_ROOT_PSW&lt;/code&gt; 进行修改）
&lt;img src="https://harry0703.com/post/enterprise-knowledge-llm-qa/fastgpt.jpg" alt="fastgpt.jpg"&gt;&lt;/p&gt;
&lt;h4 id="oneapi"&gt;OneAPI&lt;/h4&gt;
&lt;p&gt;点击访问：&lt;a href="http://localhost:3001"&gt;http://localhost:3001&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;用户名 &lt;code&gt;root&lt;/code&gt;，密码 &lt;code&gt;123456&lt;/code&gt;
&lt;img src="https://harry0703.com/post/enterprise-knowledge-llm-qa/oneapi.jpg" alt="oneapi.jpg"&gt;&lt;/p&gt;
&lt;h2 id="配置oneapi"&gt;配置OneAPI&lt;/h2&gt;
&lt;p&gt;添加模型：&lt;a href="http://localhost:3001/channel"&gt;http://localhost:3001/channel&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="1-配置大语言模型"&gt;1. 配置大语言模型&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;类型&lt;/strong&gt;：Ollama&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;名称&lt;/strong&gt;：ollama-qwen:7b&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型&lt;/strong&gt;：输入自定义模型名称，&lt;code&gt;qwen:7b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密钥&lt;/strong&gt;：随便填，比如 123&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代理&lt;/strong&gt;：http://host.docker.internal:11434&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="2-配置embedding向量模型"&gt;2. 配置Embedding向量模型&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;类型&lt;/strong&gt;：Ollama&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;名称&lt;/strong&gt;：ollama-dmeta-embedding-zh&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型&lt;/strong&gt;：输入自定义模型名称，&lt;code&gt;shaw/dmeta-embedding-zh&lt;/code&gt;**，比如&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密钥&lt;/strong&gt;：随便填，比如 123&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代理&lt;/strong&gt;：http://host.docker.internal:11434&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;特别注意：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模型 &lt;strong&gt;必须和 ollama 安装的模型名称保持一致&lt;/strong&gt;，可以使用 &lt;code&gt;ollama list&lt;/code&gt; 命令查看&lt;/li&gt;
&lt;li&gt;代理地址 &lt;strong&gt;必须是 &lt;a href="http://host.docker.internal:11434"&gt;http://host.docker.internal:11434&lt;/a&gt;&lt;/strong&gt;，这样 OneAPI 才能访问到 ollama&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;默认情况下，&lt;strong&gt;Docker 使用的是 桥接模式 启动服务&lt;/strong&gt;，即容器使用 Docker 自己创建的虚拟网络，容器之间可以相互通信，但是它们无法直接访问宿主机（即你的电脑）上的网络服务。&lt;/p&gt;
&lt;p&gt;但是 Ollama 是运行在你的电脑上的， 而 OneAPI 是运行在 Docker 容器里面的，所以 OneAPI 无法直接访问 Ollama。&lt;/p&gt;
&lt;p&gt;docker 官方提供了一种支持方案，可通过指向 host.docker.internal 来指向宿主机的 IP。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;参见官方文档：&lt;a href="https://docs.docker.com/desktop/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host"&gt;从容器连接到主机上的服务&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="配置fastgpt"&gt;配置FastGPT&lt;/h2&gt;
&lt;p&gt;我们先创建一个简单的应用，实现一个基本的AI对话，目的是测试OneAPI的接口以及Ollama的接口是否正常。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;未完待续&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>