<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Harry0703</title><link>https://harry0703.com/</link><description>Recent content 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>Fri, 04 Sep 2026 12:30:00 +0800</lastBuildDate><atom:link href="https://harry0703.com/index.xml" rel="self" type="application/rss+xml"/><item><title>🎉 关于</title><link>https://harry0703.com/about/</link><pubDate>Sat, 20 Apr 2024 00:00:00 +0000</pubDate><author>harry0703@hotmail.com (Harry)</author><guid>https://harry0703.com/about/</guid><description>&lt;p&gt;&lt;strong&gt;19年资深码农，15年持续创业🛵，全栈工程师🧑‍💻&lt;/strong&gt;&lt;/p&gt;
&lt;p class="github-profile-link"&gt;
&lt;a href="https://github.com/harry0703" target="_blank" rel="noopener noreferrer"&gt;
&lt;img src="https://harry0703.com/icons/github.svg" alt="" aria-hidden="true"&gt;
&lt;span&gt;github.com/harry0703&lt;/span&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;a class="github-overview" href="https://github.com/harry0703" target="_blank" rel="noopener noreferrer"&gt;
&lt;img src="github.svg" alt="Harry 的 GitHub 统计数据"&gt;
&lt;/a&gt;
&lt;h2 id="开源项目"&gt;开源项目&lt;/h2&gt;
&lt;div class="project-showcase"&gt;
&lt;article class="project-card project-card--featured" style="--project-accent: #c45d0a;"&gt;
&lt;div class="project-card__meta"&gt;
&lt;span&gt;Python · MIT&lt;/span&gt;
&lt;/div&gt;
&lt;h3&gt;&lt;a href="https://github.com/harry0703/MoneyPrinterTurbo" target="_blank" rel="noopener noreferrer"&gt;MoneyPrinterTurbo&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;利用 AI 大模型和自动化工作流，根据主题或关键词生成短视频，覆盖文案、素材、配音、字幕与合成。&lt;/p&gt;
&lt;div class="project-card__footer"&gt;
&lt;span&gt;120.3k Stars · 18.4k Forks&lt;/span&gt;
&lt;a class="project-card__github" href="https://github.com/harry0703/MoneyPrinterTurbo" target="_blank" rel="noopener noreferrer"&gt;
&lt;img src="https://harry0703.com/icons/github.svg" alt="" aria-hidden="true"&gt;
&lt;span&gt;GitHub&lt;/span&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/article&gt;
&lt;article class="project-card" style="--project-accent: #2676a6;"&gt;
&lt;div class="project-card__meta"&gt;
&lt;span&gt;Python · MIT&lt;/span&gt;
&lt;/div&gt;
&lt;h3&gt;&lt;a href="https://github.com/harry0703/AudioNotes" target="_blank" rel="noopener noreferrer"&gt;AudioNotes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;快速提取音视频内容，结合本地模型整理为结构化 Markdown 笔记，并支持围绕内容继续问答。&lt;/p&gt;
&lt;div class="project-card__footer"&gt;
&lt;span&gt;2.5k Stars · 366 Forks&lt;/span&gt;
&lt;a class="project-card__github" href="https://github.com/harry0703/AudioNotes" target="_blank" rel="noopener noreferrer"&gt;
&lt;img src="https://harry0703.com/icons/github.svg" alt="" aria-hidden="true"&gt;
&lt;span&gt;GitHub&lt;/span&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/article&gt;
&lt;article class="project-card" style="--project-accent: #33825a;"&gt;
&lt;div class="project-card__meta"&gt;
&lt;span&gt;Rust · Tauri · GPLv3&lt;/span&gt;
&lt;/div&gt;
&lt;h3&gt;&lt;a href="https://github.com/harry0703/MangoDisk" target="_blank" rel="noopener noreferrer"&gt;MangoDisk&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;面向 macOS 和 Windows 的开源磁盘清理与空间分析工具，帮助用户在确认后安全释放空间。&lt;/p&gt;
&lt;div class="project-card__footer"&gt;
&lt;span&gt;2.1k Stars · 138 Forks&lt;/span&gt;
&lt;span class="project-card__links"&gt;
&lt;a class="project-card__github" href="https://github.com/harry0703/MangoDisk" target="_blank" rel="noopener noreferrer"&gt;
&lt;img src="https://harry0703.com/icons/github.svg" alt="" aria-hidden="true"&gt;
&lt;span&gt;GitHub&lt;/span&gt;
&lt;/a&gt;
&lt;a href="https://mangodisk.app/zh" target="_blank" rel="noopener noreferrer"&gt;官网&lt;/a&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;p class="project-showcase__updated"&gt;GitHub 数据更新于 2026-09-04&lt;/p&gt;</description></item><item><title>从 0 到 12 万 Star：MoneyPrinterTurbo 做对了什么，又没解决什么</title><link>https://harry0703.com/post/moneyprinterturbo-120k-stars/</link><pubDate>Fri, 04 Sep 2026 12:30:00 +0800</pubDate><author>harry0703@hotmail.com (Harry)</author><guid>https://harry0703.com/post/moneyprinterturbo-120k-stars/</guid><description>&lt;img src="https://harry0703.com/post/moneyprinterturbo-120k-stars/webui.jpg" alt="MoneyPrinterTurbo WebUI"&gt;&lt;p&gt;截至 2026 年 9 月，&lt;a href="https://github.com/harry0703/MoneyPrinterTurbo"&gt;MoneyPrinterTurbo&lt;/a&gt; 在 GitHub 上获得了超过 12 万 Star 和 1.84 万 Fork。&lt;/p&gt;
&lt;p&gt;这两个数字只能说明项目被大量关注和复制，不能证明生成的视频足够好，更不能证明它已经解决了 AI 视频生产的问题。&lt;/p&gt;
&lt;p&gt;真正值得分析的是：&lt;strong&gt;为什么这么多人愿意点进来，并且认为这套代码值得保留和修改？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;项目地址：&lt;a href="https://github.com/harry0703/MoneyPrinterTurbo"&gt;https://github.com/harry0703/MoneyPrinterTurbo&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="它没有创造新模型但跑通了一条工作流"&gt;它没有创造新模型，但跑通了一条工作流&lt;/h2&gt;
&lt;p&gt;MoneyPrinterTurbo 没有训练视频模型，也没有提出新的生成算法。&lt;/p&gt;
&lt;p&gt;它做的事情并不神秘：生成文案、搜索素材、合成语音、制作字幕，最后把这些内容组合成视频。&lt;/p&gt;
&lt;p&gt;这些能力在项目出现之前就已经存在。问题在于，它们分散在不同的工具和服务中。用户要自己选择模型、转换数据、处理字幕时间，再调用视频工具完成合成。每一步都不算难，连起来却足以挡住大多数人。&lt;/p&gt;
&lt;p&gt;MoneyPrinterTurbo 把这堆零件收进了一条可以运行的流程：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;输入一个主题，得到一条视频。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它降低的不是某项技术的计算成本，而是用户组织整套流程的成本。&lt;/p&gt;
&lt;p&gt;开发者很容易沉迷于模型、框架和参数，用户只关心最后有没有东西交付。技术是零件，跑通任务才是产品。&lt;/p&gt;
&lt;h2 id="184-万-fork-比-12-万-star-更值得看"&gt;1.84 万 Fork 比 12 万 Star 更值得看&lt;/h2&gt;
&lt;p&gt;Star 很轻，看到感兴趣的项目，顺手就可以点一下。Fork 通常多了一层意图：准备部署、修改，或者把它接进自己的系统。&lt;/p&gt;
&lt;p&gt;MoneyPrinterTurbo 的用户会更换大模型和语音服务，接入自己的素材源，修改提示词、视频尺寸和合成规则。还有人把它改造成批量生产服务，放进自己的内容业务里。&lt;/p&gt;
&lt;p&gt;封闭产品只给用户一个输入框和最终结果。开源之后，文案、素材、配音、字幕和合成中的任何一环都可以替换。&lt;/p&gt;
&lt;p&gt;所以，1.84 万 Fork 所反映的需求，不只是“一键生成视频”，还有一套&lt;strong&gt;能够自己控制的内容生产流程&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="它解决了生产没有解决内容"&gt;它解决了生产，没有解决内容&lt;/h2&gt;
&lt;p&gt;MoneyPrinterTurbo 可以生成视频，却回答不了一个更难的问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;为什么有人愿意把这条视频看完？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;关键词搜索可以找到相关素材，却不理解叙事。语音模型可以读出文案，却未必懂得情绪。程序可以对齐画面、配音和字幕，却不会自然产生节奏、审美和观点。&lt;/p&gt;
&lt;p&gt;最后得到的视频可能结构完整，也可能毫无记忆点。&lt;/p&gt;
&lt;p&gt;说得直接一点，自动化可以更快地生产内容，也可以更快地制造平庸。如果选题没有价值，文案没有观点，生成速度越快，只会得到更多没人愿意看的视频。&lt;/p&gt;
&lt;p&gt;MoneyPrinterTurbo 把视频制作从“不会做”降低到了“能做”，但从“能做”到“做好”，仍然需要人的判断。&lt;/p&gt;
&lt;h2 id="素材拼接的上限很明确"&gt;素材拼接的上限很明确&lt;/h2&gt;
&lt;p&gt;MoneyPrinterTurbo 本质上仍然是一套素材组织和视频合成流程。这一点没有必要回避。&lt;/p&gt;
&lt;p&gt;它适合快速验证选题、制作基础内容，也确实能省掉大量重复操作。但仅靠关键词搜索素材，很难解决人物一致性、镜头连续性和视觉表达。&lt;/p&gt;
&lt;p&gt;把它说成可以替代编导、剪辑和内容创作者，是夸大工具的能力；只把它看成简单的素材拼接，又忽略了完整工作流节省的时间。&lt;/p&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;如果后续只是不断增加模型供应商、语音服务和配置项，功能清单会越来越长，生成结果却未必更好。这类接入也很容易被其他项目复制。&lt;/p&gt;
&lt;p&gt;更难、也更值得继续做的部分，是内容生产过程本身：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从理解文案到生成可编辑的分镜，而不只是提取几个关键词；&lt;/li&gt;
&lt;li&gt;让人物、场景和视觉风格在多个镜头中保持一致；&lt;/li&gt;
&lt;li&gt;保留中间结果，让人可以介入，而不是只能接受最终成片；&lt;/li&gt;
&lt;li&gt;根据发布后的真实反馈，调整下一次选题和内容结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;12 万 Star 说明这类需求足够大，但没有替 MoneyPrinterTurbo 回答这些问题。&lt;/p&gt;
&lt;p&gt;它现在是一套有效的视频自动化工具。能不能继续往前走，取决于它能否跨过素材拼接的边界，开始理解内容，而不只是组装内容。&lt;/p&gt;</description></item><item><title>电脑空间去哪了？我开源了 MangoDisk</title><link>https://harry0703.com/post/mangodisk/</link><pubDate>Wed, 05 Aug 2026 16:05:20 +0800</pubDate><author>harry0703@hotmail.com (Harry)</author><guid>https://harry0703.com/post/mangodisk/</guid><description>&lt;img src="https://assets.mangodisk.app/images/readme/zh-light.jpg" alt="MangoDisk 芒果磁盘清理工具"&gt;&lt;p&gt;最近几年，我经常遇到一个很熟悉的提醒：&lt;strong&gt;磁盘空间不足。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;刚换电脑时，总觉得几百 GB 已经足够。可随开发工具越来越多，项目越做越多，再加上本地运行的 AI 模型，剩余空间还是会一点点变少。&lt;/p&gt;
&lt;p&gt;真正开始清理时，却很难说清这些空间到底去了哪里。&lt;/p&gt;
&lt;h2 id="空间不是突然消失的"&gt;空间不是突然消失的&lt;/h2&gt;
&lt;p&gt;有时是一个很久没有打开的视频，有时是重复下载的安装包，有时是已经结束的项目留下了几 GB 构建文件。浏览器、开发工具和各种应用也在持续产生缓存，但它们分散在系统的不同位置，平时几乎感觉不到。&lt;/p&gt;
&lt;p&gt;这些东西单独看都不算大，积累起来却很可观。&lt;/p&gt;
&lt;p&gt;我试过手动查找，也写过一些清理脚本。它们偶尔很有效，但用久了就会遇到另一个问题：&lt;strong&gt;我不确定删掉的到底是什么。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;脚本中的路径可能已经过时，网上找到的命令也未必适合自己的电脑。面对一个几十 GB 的目录，最难做的不是按下删除键，而是判断里面有没有仍然重要的内容。&lt;/p&gt;
&lt;h2 id="我想要的工具并不复杂"&gt;我想要的工具并不复杂&lt;/h2&gt;
&lt;p&gt;我找过不少磁盘清理软件。有些功能很多，但每次打开都会推荐各种不需要的服务；有些直接告诉我可以释放几十 GB，却没有把这些文件解释清楚；还有一些需要登录账号，或者把简单的清理功能放进订阅中。&lt;/p&gt;
&lt;p&gt;我真正需要的其实很简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;告诉我空间主要用在了哪里；&lt;/li&gt;
&lt;li&gt;把可能不再需要的内容整理出来；&lt;/li&gt;
&lt;li&gt;在删除之前，让我能看清位置、大小和风险；&lt;/li&gt;
&lt;li&gt;不上传文件，也不要求注册账号。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;既然一直没有找到完全符合自己习惯的工具，我就开始做 &lt;a href="https://github.com/harry0703/MangoDisk"&gt;MangoDisk&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="把杂乱的磁盘重新看清楚"&gt;把杂乱的磁盘重新看清楚&lt;/h2&gt;
&lt;p&gt;MangoDisk 最早只是用来处理我自己的开发缓存，后来逐渐加入了大文件查找、重复文件清理、应用卸载和磁盘空间分析。&lt;/p&gt;
&lt;img src="https://assets.mangodisk.app/images/screenshots/zh/light-01-deep-cleanup.jpg" alt="MangoDisk 深度清理界面"&gt;&lt;p&gt;现在，我会先用空间分析看看哪些目录占用最多，再检查大文件和已经不用的项目。如果某个应用准备卸载，也可以顺便确认它留下了哪些缓存和数据，不需要再去网上查每一个目录的位置。&lt;/p&gt;
&lt;p&gt;对开发者来说，MangoDisk 也能找到常见的项目构建产物和工具缓存。&lt;code&gt;node_modules&lt;/code&gt;、Rust 的 &lt;code&gt;target&lt;/code&gt;、IDE 索引以及包管理器缓存，往往就是磁盘空间缓慢减少的原因。&lt;/p&gt;
&lt;p&gt;但 MangoDisk 不会扫描结束后直接替你删除。它会先把内容分类，显示大小、位置和风险，再由你决定哪些应该保留。智能推荐可以减少逐项判断的时间，但最终的选择仍然属于用户。&lt;/p&gt;
&lt;h2 id="有些大文件本来就不应该被随便清理"&gt;有些大文件，本来就不应该被随便清理&lt;/h2&gt;
&lt;p&gt;做这个工具以后，我越来越觉得，磁盘清理并不是“删得越多越好”。&lt;/p&gt;
&lt;p&gt;比如本地 AI 模型经常占用几十 GB，但重新下载同样需要大量时间和流量。照片、代码、文档和云同步文件更不用说，它们不能仅仅因为体积大，就被当作垃圾。&lt;/p&gt;
&lt;p&gt;所以 MangoDisk 对这些内容会更保守。普通清理不会把个人文件或用户管理的模型当成缓存；遇到可能影响使用的数据，也会把风险和位置展示出来，而不是默认选中。&lt;/p&gt;
&lt;p&gt;我希望它给人的感觉不是“帮我做决定”，而是“帮我把决定需要的信息整理好”。这也是我自己愿意长期使用它的前提。&lt;/p&gt;
&lt;h2 id="为什么把它开源"&gt;为什么把它开源&lt;/h2&gt;
&lt;p&gt;清理工具需要读取很多文件信息，也拥有删除文件的能力。与其只告诉用户“可以放心使用”，我更希望大家能够直接看到它扫描了什么、如何判断，以及一次清理最终会做什么。&lt;/p&gt;
&lt;p&gt;因此，我决定将 MangoDisk 以 GPLv3 许可证开源。它支持 macOS 和 Windows，扫描与清理都在本地完成，不需要登录，也不会上传文件或扫描结果。&lt;/p&gt;
&lt;p&gt;开源也意味着，一个人不熟悉的软件和系统，可以由真正使用它的人补充。不同开发工具、不同版本的缓存位置，都可以通过社区一起完善。&lt;/p&gt;
&lt;h2 id="写在最后"&gt;写在最后&lt;/h2&gt;
&lt;p&gt;MangoDisk 不是一个追求“每次都清出几十 GB”的工具。有时候扫描以后，会发现真正适合清理的内容并没有想象中那么多，我觉得这反而是正常的。&lt;/p&gt;
&lt;p&gt;它更像是我为自己做的一次磁盘整理：先看清空间去了哪里，再决定什么可以离开。&lt;/p&gt;
&lt;p&gt;目前 MangoDisk 已经可以在 macOS 和 Windows 上使用。如果你也经常被磁盘空间不足困扰，可以前往 &lt;a href="https://mangodisk.app/zh"&gt;MangoDisk 官网&lt;/a&gt; 下载体验，也可以在 &lt;a href="https://github.com/harry0703/MangoDisk"&gt;GitHub&lt;/a&gt; 查看源码和参与改进。&lt;/p&gt;</description></item><item><title>阿里开源 CosyVoice 语音克隆 部署和使用</title><link>https://harry0703.com/post/cosyvoice/</link><pubDate>Sat, 03 Aug 2024 12:30:01 +0800</pubDate><author>harry0703@hotmail.com (Harry)</author><guid>https://harry0703.com/post/cosyvoice/</guid><description>&lt;p&gt;应该是 &lt;strong&gt;开源界 音色 最稳定&lt;/strong&gt; 的语音合成和克隆模型了，支持预训练音色合成、自然语言控制、3秒极速复刻和跨语种复刻。&lt;/p&gt;
&lt;p&gt;官方部署方式比较复杂，错误较多，我这里进行了整理和优化，&lt;strong&gt;支持GPU和CPU&lt;/strong&gt;，方便大家使用。&lt;/p&gt;
&lt;p&gt;CosyVoice 开源仓库: &lt;a href="https://github.com/FunAudioLLM/CosyVoice"&gt;CosyVoice&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="效果展示"&gt;效果展示&lt;/h2&gt;
&lt;h3 id="自然语言控制"&gt;自然语言控制&lt;/h3&gt;
&lt;img src="https://harry0703.com/post/cosyvoice/1.jpg" alt="image" class="center" width="600"&gt;&lt;h3 id="3秒极速复刻"&gt;3秒极速复刻&lt;/h3&gt;
&lt;img src="https://harry0703.com/post/cosyvoice/2.jpg" alt="image" class="center" width="600"&gt;&lt;h2 id="使用方法"&gt;使用方法&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;均支持 GPU 和 CPU&lt;/p&gt;
&lt;p&gt;第一次启动过程可能会有点长，需要从魔搭下载3个模型&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="windows-一键启动包"&gt;Windows 一键启动包&lt;/h3&gt;
&lt;p&gt;百度网盘: &lt;a href="https://pan.baidu.com/s/1UTuRKPQ9nuQk69qxQzdL4A?pwd=j2ei"&gt;https://pan.baidu.com/s/1UTuRKPQ9nuQk69qxQzdL4A?pwd=j2ei&lt;/a&gt; 提取码: j2ei&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下载后使用 7z 解压。没有 7z 的话，可以在这里下载：&lt;a href="https://7-zip.org/download.html"&gt;https://7-zip.org/download.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;双击 &lt;code&gt;双击启动.bat&lt;/code&gt; 启动服务&lt;/li&gt;
&lt;li&gt;启动后，访问 &lt;a href="http://127.0.0.1:50000/"&gt;http://127.0.0.1:50000/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：文件夹中不能有 &lt;strong&gt;中文&lt;/strong&gt;、&lt;strong&gt;特殊字符&lt;/strong&gt;和&lt;strong&gt;空格&lt;/strong&gt;，否则可能会启动失败&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="docker部署"&gt;Docker部署🐳&lt;/h3&gt;
&lt;blockquote&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;/blockquote&gt;
&lt;p&gt;复制以下代码到终端运行即可&lt;/p&gt;
&lt;h4 id="cpu-版本"&gt;CPU 版本&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;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-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-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 -fsSL https://harry0703.com/cosyvoice/docker-compose.yml -o docker-compose.yml
&lt;/span&gt;&lt;/span&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;h4 id="gpu-版本"&gt;GPU 版本&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-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;/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 -fsSL https://harry0703.com/cosyvoice/docker-compose-gpu.yml -o docker-compose.yml
&lt;/span&gt;&lt;/span&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;strong&gt;docker 启动后，访问 &lt;a href="http://127.0.0.1:50000/"&gt;http://127.0.0.1:50000/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>FunASR实时语音识别部署和使用</title><link>https://harry0703.com/post/realtime-funasr/</link><pubDate>Thu, 25 Jul 2024 20:30:01 +0800</pubDate><author>harry0703@hotmail.com (Harry)</author><guid>https://harry0703.com/post/realtime-funasr/</guid><description>&lt;p&gt;FunASR 模型的整理和集成，Docker一键启动，能够&lt;strong&gt;实时识别语音&lt;/strong&gt;输入，准确度非常高&lt;/p&gt;
&lt;p&gt;项目地址：&lt;a href="https://github.com/harry0703/AudioNotes"&gt;https://github.com/harry0703/AudioNotes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;FunASR开源仓库: &lt;a href="https://github.com/modelscope/FunASR"&gt;https://github.com/modelscope/FunASR&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="效果展示"&gt;效果展示&lt;/h2&gt;
&lt;img src="https://harry0703.com/post/realtime-funasr/1.jpg" alt="image"&gt;&lt;h2 id="使用方法"&gt;使用方法&lt;/h2&gt;
&lt;h3 id="docker部署"&gt;Docker部署🐳&lt;/h3&gt;
&lt;blockquote&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;/blockquote&gt;
&lt;p&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-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;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-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-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 -fsSL https://harry0703.com/realtime-funasr/docker-compose.yml -o docker-compose.yml
&lt;/span&gt;&lt;/span&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;blockquote&gt;
&lt;p&gt;注意：第一次启动过程可能会有点长，需要从魔搭下载4个模型&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.modelscope.cn/models/damo/speech_fsmn_vad_zh-cn-16k-common-onnx/summary"&gt;FSMN-VAD模型&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.modelscope.cn/models/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online-onnx/summary"&gt;Paraformer-lagre实时模型&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.modelscope.cn/models/damo/punc_ct-transformer_zh-cn-common-vad_realtime-vocab272727-onnx/summary"&gt;CT-Transformer标点预测模型&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.modelscope.cn/models/thuduj12/fst_itn_zh/summary"&gt;基于FST的中文ITN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;docker 启动后，访问 &lt;a href="http://localhost:10096/"&gt;http://localhost:10096/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="-如果你想了解更多可以往下看"&gt;👉👉 如果你想了解更多，可以往下看&lt;/h2&gt;
&lt;h3 id="参数说明"&gt;参数说明&lt;/h3&gt;
&lt;h4 id="-模型模式"&gt;① 模型模式&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2pass&lt;/strong&gt;: （默认）实时语音识别，并且句尾采用离线模型进行纠错（&lt;strong&gt;准确度更高&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;online: 实时语音识别&lt;/li&gt;
&lt;li&gt;offline: 一句话识别&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-逆文本标准化itn"&gt;② 逆文本标准化（ITN）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;是&lt;/strong&gt;: （默认） 表示进行逆文本标准化&lt;/li&gt;
&lt;li&gt;否: 表示不进行逆文本标准化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;逆文本标准化（Inverse Text Normalization, ITN）&lt;/strong&gt; 是语音识别和自然语言处理领域的一种技术，用于将自动语音识别（ASR）系统生成的文本转化为更自然和可读的格式。这是对文本标准化（Text
Normalization, TN）的逆过程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;逆文本标准化的目的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当语音被转换为文本时，ASR 系统通常会输出一种更标准化的文本形式。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数字 &amp;ldquo;123&amp;rdquo; 可能会被识别为 &amp;ldquo;一二三&amp;rdquo; 或 &amp;ldquo;123&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;日期 &amp;ldquo;2024年7月25日&amp;rdquo; 可能会被识别为 &amp;ldquo;二零二四年七月二十五日&amp;rdquo; 或 &amp;ldquo;2024年7月25日&amp;rdquo;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这些输出虽然标准化，但不一定是人们习惯书写或阅读的格式。&lt;/strong&gt;
ITN 的作用是将这些标准化的文本转换回更自然、更符合书面习惯的形式。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;一二三&amp;rdquo; 转换为 &amp;ldquo;123&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;二零二四年七月二十五日&amp;rdquo; 转换为 &amp;ldquo;2024年7月25日&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;五千七百六十三&amp;rdquo; 转换为 &amp;ldquo;5763&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="如果你想使用api请参考以下文档"&gt;👉👉如果你想使用API，请参考以下文档&lt;/h2&gt;
&lt;h3 id="系统架构图"&gt;系统架构图&lt;/h3&gt;
&lt;img src="https://harry0703.com/post/realtime-funasr/2.jpg" alt="image"&gt;&lt;blockquote&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;10096端口为网页界面&lt;/li&gt;
&lt;li&gt;10095端口为websocket通信端口
&amp;gt; &lt;img src="https://harry0703.com/post/realtime-funasr/3.jpg" alt="image"&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3 id="-从客户端往服务端发送数据"&gt;🅰️ 从客户端往服务端发送数据&lt;/h3&gt;
&lt;h4 id="消息格式"&gt;消息格式&lt;/h4&gt;
&lt;p&gt;配置参数用&lt;code&gt;json&lt;/code&gt;，音频数据采用&lt;code&gt;bytes&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="-首次通信"&gt;① 首次通信&lt;/h4&gt;
&lt;p&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-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;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-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-13"&gt;13&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-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-14"&gt;14&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-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;chunk_size&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;wav_name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;h5&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;is_speaking&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;wav_format&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pcm&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;chunk_interval&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;itn&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2pass&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;hotwords&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{\&amp;#34;阿里巴巴\&amp;#34;:20,\&amp;#34;hello world\&amp;#34;:40}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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;p&gt;&lt;strong&gt;参数说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wav_name&lt;/code&gt;：表示需要推理音频文件名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wav_format&lt;/code&gt;：表示音视频文件后缀名，只支持pcm音频流&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_speaking&lt;/code&gt;：表示断句尾点，例如，vad切割点，或者一条wav结束&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chunk_size&lt;/code&gt;：表示流式模型latency配置，&lt;code&gt;[5,10,5]&lt;/code&gt;，表示当前音频为600ms，并且回看300ms，又看300ms。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hotwords&lt;/code&gt;：如果使用热词，需要向服务端发送热词数据（字符串），格式为 &amp;ldquo;{&amp;ldquo;阿里巴巴&amp;rdquo;:20,&amp;ldquo;通义实验室&amp;rdquo;:30}&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;itn&lt;/code&gt;: 设置是否使用itn，默认 &lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-发送音频数据"&gt;② 发送音频数据&lt;/h4&gt;
&lt;p&gt;直接将音频数据移除头部信息后，使用 bytes 数据发送，支持音频采样率为8000&lt;/p&gt;
&lt;h4 id="-发送结束标志"&gt;③ 发送结束标志&lt;/h4&gt;
&lt;p&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-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;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-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-3"&gt;3&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-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;is_speaking&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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="-从服务端往客户端发数据"&gt;🅱️ 从服务端往客户端发数据&lt;/h3&gt;
&lt;h4 id="发送识别结果"&gt;发送识别结果&lt;/h4&gt;
&lt;p&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-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;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-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-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-3-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-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-3-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-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-3-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-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-3-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-6"&gt;6&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-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;is_final&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2pass-online&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&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:#f92672"&gt;&amp;#34;wav_name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;h5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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;p&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-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;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-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-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-4-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-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-4-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-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-4-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-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-4-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-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-4-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-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-4-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-12"&gt;12&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-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-13"&gt;13&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-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-14"&gt;14&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-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-15"&gt;15&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-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;is_final&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2pass-offline&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;stamp_sents&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4385&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;punc&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&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:#f92672"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;820&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;text_seg&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;阿 里 开 源 的 语 音 识 别 真 是 太 牛 了&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&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:#f92672"&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;[[820,1060],[1060,1319],[1319,1480],[1480,1760],[1760,2220],[2220,2420],[2420,2659],[2659,2820],[2820,3300],[3300,3480],[3480,3659],[3659,3820],[3820,4060],[4060,4385]]&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;wav_name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;h5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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;p&gt;&lt;strong&gt;参数说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mode&lt;/code&gt;：推理模式
&lt;ul&gt;
&lt;li&gt;2pass-online：表示实时识别结果&lt;/li&gt;
&lt;li&gt;2pass-offline：表示2遍修正识别结果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wav_name&lt;/code&gt;：需要推理音频文件名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;text&lt;/code&gt;：语音识别输出文本&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="踩坑"&gt;👉👉踩坑&lt;/h2&gt;
&lt;h3 id="报错录音open失败浏览器禁止不安全页面录音"&gt;报错：录音open失败：浏览器禁止不安全页面录音&lt;/h3&gt;
&lt;p&gt;如果你是在&lt;strong&gt;其他电脑或服务器上部署的服务，而不是在本地&lt;/strong&gt;，当你打开页面后，可能会遇到这个问题。&lt;/p&gt;
&lt;p&gt;假设服务器IP是 &lt;code&gt;192.168.1.170&lt;/code&gt;，打开的页面是 http://192.168.1.170:10096/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方法：&lt;/strong&gt;
&lt;img src="https://harry0703.com/post/realtime-funasr/4.jpg" alt="image"&gt;&lt;/p&gt;
&lt;h4 id="chrome浏览器"&gt;Chrome浏览器&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;在浏览器地址栏输入 &lt;code&gt;chrome://flags/#unsafely-treat-insecure-origin-as-secure&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;把 &lt;code&gt;http://192.168.1.170:10096/&lt;/code&gt; 添加到输入框内&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;Insecure origins treated as secure&lt;/code&gt; 设置为 &lt;code&gt;Enabled&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重启浏览器&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="edge浏览器"&gt;Edge浏览器&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;在浏览器地址栏输入 &lt;code&gt;edge://flags/#unsafely-treat-insecure-origin-as-secure&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;把 &lt;code&gt;http://192.168.1.170:10096/&lt;/code&gt; 添加到输入框内&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;Insecure origins treated as secure&lt;/code&gt; 设置为 &lt;code&gt;Enabled&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重启浏览器&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>如何利用本地模型，将音视频整理成一份结构化的Markdown笔记</title><link>https://harry0703.com/post/audio-notes/</link><pubDate>Fri, 19 Jul 2024 15:16:01 +0800</pubDate><author>harry0703@hotmail.com (Harry)</author><guid>https://harry0703.com/post/audio-notes/</guid><description>&lt;p&gt;项目地址：&lt;a href="https://github.com/harry0703/AudioNotes"&gt;https://github.com/harry0703/AudioNotes&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="基于-funasr-和-qwen2-构建的音视频转结构化笔记系统"&gt;基于 FunASR 和 Qwen2 构建的音视频转结构化笔记系统&lt;/h2&gt;
&lt;p&gt;能够快速提取音视频的内容，并且调用大模型进行整理，成为一份结构化的markdown笔记，方便快速阅读&lt;/p&gt;
&lt;p&gt;FunASR: &lt;a href="https://github.com/modelscope/FunASR"&gt;https://github.com/modelscope/FunASR&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Qwen2: &lt;a href="https://ollama.com/library/qwen2"&gt;https://ollama.com/library/qwen2&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="效果展示"&gt;效果展示&lt;/h2&gt;
&lt;h3 id="音视频识别和整理"&gt;音视频识别和整理&lt;/h3&gt;
&lt;img src="https://harry0703.com/post/audio-notes/1.jpg" alt="image"&gt;&lt;h3 id="与音视频内容对话"&gt;与音视频内容对话&lt;/h3&gt;
&lt;img src="https://harry0703.com/post/audio-notes/2.jpg" alt="image"&gt;&lt;h2 id="使用方法"&gt;使用方法&lt;/h2&gt;
&lt;h3 id="-安装-ollama"&gt;① 安装 Ollama&lt;/h3&gt;
&lt;p&gt;下载对应系统的 Ollama 安装包进行安装&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ollama.com/download"&gt;https://ollama.com/download&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="-拉取模型"&gt;② 拉取模型&lt;/h3&gt;
&lt;p&gt;我以 &lt;code&gt;阿里的千问2 7b&lt;/code&gt; 为例 &lt;a href="https://ollama.com/library/qwen2"&gt;https://ollama.com/library/qwen2&lt;/a&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-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 qwen2: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;h3 id="docker部署推荐"&gt;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-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;/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 -fsSL https://harry0703.com/audio-notes/docker-compose.yml -o docker-compose.yml
&lt;/span&gt;&lt;/span&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;docker 启动后，访问 &lt;a href="http://localhost:15433/"&gt;http://localhost:15433/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;登录账号为 admin，密码为 admin （可以在 docker-compose.yml 文件里面修改）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="本地部署-"&gt;本地部署 📦&lt;/h3&gt;
&lt;p&gt;需要有可访问的 postgresql 数据库&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-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;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-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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;conda create -n AudioNotes python&lt;span style="color:#f92672"&gt;=&lt;/span&gt;3.10 -y
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda activate AudioNotes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/harry0703/AudioNotes.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd AudioNotes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install -r requirements.txt
&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;code&gt;.env.example&lt;/code&gt; 重命名为 &lt;code&gt;.env&lt;/code&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-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;chainlit run main.py
&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;服务启动后，访问 http://localhost:8000/&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;登录账号为 admin，密码为 admin （可以在 docker-compose.yml 文件里面修改）&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>ChatTTS 开源语音合成服务的部署和使用</title><link>https://harry0703.com/post/chat-tts/</link><pubDate>Wed, 29 May 2024 20:16:01 +0800</pubDate><author>harry0703@hotmail.com (Harry)</author><guid>https://harry0703.com/post/chat-tts/</guid><description>&lt;p&gt;项目地址：&lt;a href="https://github.com/2noise/ChatTTS"&gt;https://github.com/2noise/ChatTTS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows 用户建议直接下载一键启动包，运行环境和模型都已经配置好，使用更简单。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="windows-一键启动包"&gt;Windows 一键启动包&lt;/h2&gt;
&lt;p&gt;百度网盘下载：&lt;a href="https://pan.baidu.com/s/1wfdqQDTzDnMf01bV1wzKgQ?pwd=v2kb"&gt;https://pan.baidu.com/s/1wfdqQDTzDnMf01bV1wzKgQ?pwd=v2kb&lt;/a&gt;
提取码：v2kb&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解压密码：harryai&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载后解压&lt;/strong&gt;，然后双击 &lt;code&gt;启动服务.bat&lt;/code&gt; 即可。&lt;/p&gt;
&lt;img src="https://harry0703.com/post/chat-tts/windows.jpg" alt="启动服务" class="center" width="600"&gt;&lt;p&gt;启动成功后，会自动打开 &lt;a href="http://localhost:8845/"&gt;http://localhost:8845/&lt;/a&gt; 页面。&lt;/p&gt;
&lt;p&gt;输入文本内容，即可合成语音。&lt;/p&gt;
&lt;img src="https://harry0703.com/post/chat-tts/webui.jpg" alt="Web效果演示" class="center" width="600"&gt;&lt;h2 id="手动部署"&gt;手动部署&lt;/h2&gt;
&lt;h3 id="1-下载代码"&gt;1. 下载代码&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://harry0703.com/chat-tts/code.zip"&gt;点击下载代码压缩包&lt;/a&gt;，然后解压到本地。&lt;/p&gt;
&lt;h3 id="2-下载模型"&gt;2. 下载模型&lt;/h3&gt;
&lt;p&gt;从魔搭下载 &lt;a href="https://www.modelscope.cn/models/pzc163/chatTTS/summary"&gt;https://www.modelscope.cn/models/pzc163/chatTTS/summary&lt;/a&gt;
建议使用 git 克隆&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-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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://www.modelscope.cn/pzc163/chatTTS.git
&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;code&gt;spk_stat.pt&lt;/code&gt;，&lt;a href="https://harry0703.com/chat-tts/spk_stat.pt"&gt;点击这里&lt;/a&gt; 下载，然后放到 chatTTS/asset 目录下。&lt;/p&gt;
&lt;p&gt;再将下载的整个文件夹，放到 &lt;code&gt;models&lt;/code&gt; 文件夹下，结构如下：&lt;/p&gt;
&lt;img src="https://harry0703.com/post/chat-tts/folder.jpg" alt="文件夹结构" class="center" width="600"&gt;&lt;h3 id="3-安装依赖"&gt;3. 安装依赖&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-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;/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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install -r requirements.txt
&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="4-启动服务"&gt;4. 启动服务&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-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;/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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python webui.py
&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;a href="http://localhost:8845/"&gt;http://localhost:8845/&lt;/a&gt; 页面，输入文本内容，即可合成语音。&lt;/p&gt;
&lt;img src="https://harry0703.com/post/chat-tts/webui.jpg" alt="Web效果演示" class="center" width="600"&gt;</description></item><item><title>只需3分钟，基于 LLaMA3-8B 微调一个属于你自己的嬛嬛</title><link>https://harry0703.com/post/llama3-fine-tuning/</link><pubDate>Fri, 03 May 2024 17:56:01 +0800</pubDate><author>harry0703@hotmail.com (Harry)</author><guid>https://harry0703.com/post/llama3-fine-tuning/</guid><description>&lt;blockquote&gt;
&lt;p&gt;注意：没有GPU，也可以微调一个属于你自己的大模型，只是微调的时间长一点而已，建议晚上睡觉前运行，第二天早上就可以使用了 😄&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="效果演示"&gt;效果演示&lt;/h2&gt;
&lt;img src="https://harry0703.com/post/llama3-fine-tuning/chatbot2.jpg" alt="ChatBot对话页"&gt;&lt;h2 id="部署环境"&gt;部署环境&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;点击下载 &lt;a href="https://harry0703.com/llama3-fine-tuning/llama3-ft.zip"&gt;LLaMA3-8B 微调代码压缩包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;将下载的压缩包解压&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;终端 (macOS)&lt;/strong&gt; 或 &lt;strong&gt;cmd命令提示符 (Windows)&lt;/strong&gt; 里面，进入解压后的文件夹，创建一个新的 Conda 虚拟环境
&lt;blockquote&gt;
&lt;p&gt;未安装 Conda 的用户，可以到 &lt;a href="https://conda.io/projects/conda/en/latest/index.html"&gt;Conda官网下载安装&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&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;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-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-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-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd llama3-ft
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda create -n llama3-ft python&lt;span style="color:#f92672"&gt;=&lt;/span&gt;3.10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda activate llama3-ft
&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;/li&gt;
&lt;li&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;/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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install -r requirements.txt
&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;/li&gt;
&lt;/ol&gt;
&lt;h2 id="数据准备"&gt;数据准备&lt;/h2&gt;
&lt;p&gt;你可以直接使用 &lt;code&gt;dataset/huanhuan.json&lt;/code&gt; 数据集（该数据集来源于 &lt;a href="https://github.com/KMnO4-zx"&gt;https://github.com/KMnO4-zx&lt;/a&gt; ），&lt;strong&gt;也可以自己准备数据集
，比如你的客服对话（FAQ）数据集，这样就可以微调一个更适合你的智能客服的模型，客服回答更准确&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;数据集的格式也比较简单，示例如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;instruction&lt;/code&gt; 是问题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;output&lt;/code&gt; 是回答&lt;/li&gt;
&lt;/ul&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;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-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-2-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-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-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;instruction&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&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:#f92672"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&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:#f92672"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;皇上好，我是甄嬛，家父是大理寺少卿甄远道。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;instruction&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&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:#f92672"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&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:#f92672"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;不该相见自然不愿见，还望王爷尊重我的意愿。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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="模型微调"&gt;模型微调&lt;/h2&gt;
&lt;h3 id="模型选择"&gt;模型选择&lt;/h3&gt;
&lt;p&gt;我使用的是 &lt;a href="https://www.modelscope.cn/studios/LLM-Research/Chat_Llama-3-8B/summary"&gt;LLM-Research/Meta-Llama-3-8B-Instruct&lt;/a&gt;
，你也可以选择一个其他模型，只需要修改 &lt;code&gt;train.py&lt;/code&gt; 文件里面的 &lt;code&gt;model_id&lt;/code&gt; 变量即可。&lt;/p&gt;
&lt;p&gt;由于国内访问 HuggingFace 比较困难，因此使用 &lt;a href="https://www.modelscope.cn"&gt;ModelScope&lt;/a&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-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;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-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-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-3-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-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-3-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-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-3-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-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-3-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-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-3-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-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-3-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-8"&gt;8&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 需要微调的基座模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# https://www.modelscope.cn/studios/LLM-Research/Chat_Llama-3-8B/summary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;model_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;LLM-Research/Meta-Llama-3-8B-Instruct&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 比如你也可以使用 Qwen1.5-4B-Chat 模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# https://www.modelscope.cn/models/qwen/Qwen1.5-4B-Chat/summary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# model_id = &amp;#39;qwen/Qwen1.5-4B-Chat&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;h3 id="开始微调"&gt;开始微调&lt;/h3&gt;
&lt;p&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-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;/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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python train.py
&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;code&gt;LLaMA3-8B-Instruct Lora.ipynb&lt;/code&gt; 文件，使用 Jupyter Notebook 进行微调。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;微调的时间会根据你的数据集大小和模型大小而定。我由于没有 GPU，因此耗时2个小时，如果你有 GPU，大概需要 30 分钟。&lt;/li&gt;
&lt;li&gt;代码会自动下载模型，然后开始微调&lt;/li&gt;
&lt;li&gt;微调完成后，所有的文件会保存在 &lt;code&gt;models&lt;/code&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;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-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-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-5-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-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-5-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-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-5-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-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-5-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-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-5-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-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-5-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-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-5-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-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-5-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-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-5-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-12"&gt;12&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-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-13"&gt;13&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-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-14"&gt;14&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-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-15"&gt;15&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-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-16"&gt;16&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-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-17"&gt;17&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-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-18"&gt;18&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-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-19"&gt;19&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-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-20"&gt;20&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-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-21"&gt;21&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-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-22"&gt;22&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;├── models
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── checkpoint &lt;span style="color:#75715e"&gt;#【模型微调的 checkpoint】&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── LLM-Research
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ └── Meta-Llama-3-8B-Instruct
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├── checkpoint-100
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├── checkpoint-200
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├── checkpoint-xxx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └── qwen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └── Qwen1.5-4B-Chat
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── checkpoint-100
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── checkpoint-200
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── checkpoint-xxx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── lora &lt;span style="color:#75715e"&gt;#【模型微调的 lora 文件】&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── LLM-Research
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ └── Meta-Llama-3-8B-Instruct
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └── qwen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └── Qwen1.5-4B-Chat
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── model &lt;span style="color:#75715e"&gt;#【自动下载的基座模型】&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── LLM-Research
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └── Meta-Llama-3-8B-Instruct
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── qwen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── Qwen1___5-4B-Chat
&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;/li&gt;
&lt;/ol&gt;
&lt;h2 id="模型测试"&gt;模型测试&lt;/h2&gt;
&lt;p&gt;微调完成后，你可以执行以下命令启动一个 ChatBot 进行对话测试。&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;/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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;streamlit run chat.py
&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;</description></item><item><title>手把手教你把AI大模型本地知识库问答接入个人微信，实现微信内的AI智能客服</title><link>https://harry0703.com/post/chatgpt-on-wechat/</link><pubDate>Mon, 29 Apr 2024 07:56:01 +0800</pubDate><author>harry0703@hotmail.com (Harry)</author><guid>https://harry0703.com/post/chatgpt-on-wechat/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;前提&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先搭建好 &lt;strong&gt;本地化的企业级知识库问答系统&lt;/strong&gt;
，参考 &lt;a href="https://harry0703.com/post/enterprise-knowledge-llm-qa/"&gt;《手把手教你构建一个 本地化的，免费的，企业级的，AI大模型知识库问答系统》&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="下载docker启动文件"&gt;下载Docker启动文件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;因为 &lt;a href="https://github.com/zhayujie/chatgpt-on-wechat"&gt;ChatGPT-On-WeChat&lt;/a&gt;
代码有 &lt;a href="https://github.com/zhayujie/chatgpt-on-wechat/issues/1880"&gt;Bug&lt;/a&gt;，作者一直未修复，因此我修改后，重新打了一个Docker镜像，避免大家踩坑。&lt;/p&gt;
&lt;/blockquote&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;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-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-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-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir chatgpt-on-wechat
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd chatgpt-on-wechat
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -O https://harry0703.com/chatgpt-on-wechat/docker-compose.yml
&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="修改配置文件"&gt;修改配置文件&lt;/h2&gt;
&lt;p&gt;打开 &lt;code&gt;docker-compose.yml&lt;/code&gt; 文件，修改 &lt;code&gt;OPEN_AI_API_KEY&lt;/code&gt; 和 &lt;code&gt;OPEN_AI_API_BASE&lt;/code&gt; 为你的 FastGPT 的 API Key 和 API 地址。&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-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;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-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-13"&gt;13&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-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-14"&gt;14&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-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-15"&gt;15&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-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-16"&gt;16&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-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-17"&gt;17&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-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-18"&gt;18&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-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-19"&gt;19&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-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-20"&gt;20&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-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-21"&gt;21&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-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-22"&gt;22&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-23"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-23"&gt;23&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-24"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-24"&gt;24&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-25"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-25"&gt;25&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-26"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-26"&gt;26&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-27"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-27"&gt;27&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-28"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-28"&gt;28&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-29"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-29"&gt;29&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-30"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-30"&gt;30&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-31"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-31"&gt;31&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;2.0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;chatgpt-on-wechat&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;harryliu888/chatgpt-on-wechat:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;chatgpt-on-wechat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;security_opt&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;seccomp:unconfined&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# OPEN_AI_API_KEY 在 FastGPT 的 应用发布页面生成（API访问）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;OPEN_AI_API_KEY&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;fastgpt-iAt0KIDwpZqFvxfpmWstAkars36s0ASBENYKYLGSwJcf7NuCn2NzT&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# OPEN_AI_API_BASE 填写 FastGPT 的 API 地址&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 特别注意，如果 chatgpt-on-wechat 是docker部署的，因此要访问外部的 FastGPT，这里需要使用 host.docker.internal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;OPEN_AI_API_BASE&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;http://host.docker.internal:3000/api/v1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MODEL&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;gpt-3.5-turbo&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PROXY&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;SINGLE_CHAT_PREFIX&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;[&amp;#34;bot&amp;#34;, &amp;#34;@bot&amp;#34;]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;SINGLE_CHAT_REPLY_PREFIX&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;[bot] &amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;GROUP_CHAT_PREFIX&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;[&amp;#34;@bot&amp;#34;]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;GROUP_NAME_WHITE_LIST&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;[&amp;#34;ChatGPT测试群&amp;#34;, &amp;#34;ChatGPT测试群2&amp;#34;]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;IMAGE_CREATE_PREFIX&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;[&amp;#34;画&amp;#34;, &amp;#34;看&amp;#34;, &amp;#34;找&amp;#34;]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CONVERSATION_MAX_TOKENS&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;SPEECH_RECOGNITION&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;False&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CHARACTER_DESC&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题，并且可以使用多种语言与人交流。&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;EXPIRES_IN_SECONDS&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;USE_GLOBAL_PLUGIN_CONFIG&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;True&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;USE_LINKAI&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;False&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;LINKAI_API_KEY&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;LINKAI_APP_CODE&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;extra_hosts&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;host.docker.internal:host-gateway&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;h2 id="启动docker"&gt;启动Docker&lt;/h2&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd chatgpt-on-wechat
&lt;/span&gt;&lt;/span&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;</description></item><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>