小小探险家 發表於 2025-11-16 15:48:00

【AI智能体开发】什么是LLM?如何在本地搭建属于自己的Ai智能体? - 详解

<style>pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !important; line-height: 1.6 !important; padding: 16px !important; margin: 16px 0 !important; background-color: rgba(248, 248, 248, 1) !important; border: 1px solid rgba(225, 228, 232, 1) !important; border-radius: 6px !important; tab-size: 4 !important; -moz-tab-size: 4 !important; max-width: 100% !important; box-sizing: border-box !important }
code { font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !important; white-space: pre !important; word-wrap: normal !important; word-break: normal !important; overflow-wrap: normal !important; display: inline !important; background: rgba(0, 0, 0, 0) !important; border: none !important; padding: 0 !important; margin: 0 !important; line-height: inherit !important }
pre code { background: rgba(0, 0, 0, 0) !important; border: 0 !important; border-radius: 0 !important; display: block !important; line-height: 1.6 !important; margin: 0 !important; max-width: none !important; overflow: visible !important; padding: 0 !important; white-space: pre !important; word-wrap: normal !important; word-break: normal !important; color: inherit !important }
.token.comment, .token.prolog, .token.doctype, .token.cdata { color: rgba(112, 128, 144, 1) !important; font-style: italic !important }
.token.punctuation { color: rgba(153, 153, 153, 1) !important }
.token.atrule, .token.attr-value, .token.keyword { color: rgba(0, 119, 170, 1) !important; font-weight: bold !important }
.token.function, .token.class-name { color: rgba(221, 74, 104, 1) !important; font-weight: bold !important }
.token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: rgba(102, 153, 0, 1) !important }
.token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: rgba(153, 0, 85, 1) !important }
.cnblogs-markdown pre, .cnblogs-post-body pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; background-color: rgba(248, 248, 248, 1) !important; border: 1px solid rgba(225, 228, 232, 1) !important; border-radius: 6px !important; padding: 16px !important; margin: 16px 0 !important }
pre, pre, pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important }</style>
      <div class="markdown_views prism-atom-one-light" id="content_views"><svg style="display: none" xmlns="http://www.w3.org/2000/svg"><path d="M5,0 0,2.5 5,5z" id="raphael-marker-block" stroke-linecap="round" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path></svg><p><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/548c3ff00c4e4433af3ecad19b82fa0e.jpeg#pic_center"></p><p><strong>✨✨ 欢迎大家来到景天科技苑✨✨</strong></p><p><strong> 养成好习惯,先赞后看哦~</strong></p><blockquote><p> 作者简介:景天科技苑<br> 《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。<br> 《博客》:Rust开发,Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。</p><p><strong>所属的专栏:</strong>Rust高性能并发编程<br><strong>景天的主页:</strong>景天科技苑</p></blockquote><p><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/74c8480e94cf486f82a8f892271aa91e.gif#pic_center"><br></p><div class="toc"><h4>文章目录</h4><ul><li>AI智能体</li><li><ul><li>LLM</li><li><ul><li> 一、基本概念</li><li>⚙️ 二、核心技术</li><li> 三、应用场景</li><li> 四、代表性模型</li><li> 五、大模型技术选型</li><li><ul><li>1. Llama系列</li><li>2. Qwen系列</li><li>3. prompt</li></ul></li></ul></li><li>ollama</li><li><ul><li>1. 基本介绍</li><li>2. 安装使用</li><li>3. 模型仓库</li><li>4. 自定义大模型</li><li><ul><li>4.1 模型下载</li><li>4.2 Modefile文件配置</li><li><ul><li>4.2.1 常用指令</li></ul></li></ul></li></ul></li></ul></li></ul></div><p></p><h2>AI智能体</h2><h3>LLM</h3><p>LLM 是 “Large Language Model”(大型语言模型)的缩写。<br> 大型语言模型,基于海量的数据进行学习得到的模型。<br> 它是一种基于深度学习(尤其是 Transformer 架构)的人工智能模型,用来理解、生成和处理自然语言。像(GPT-5)这样的模型就是 LLM 的一个例子。</p><h4> 一、基本概念</h4><p>LLM 通过在海量文本上进行训练,学习语言的结构、语义、逻辑和世界知识。<br> 它的目标是:预测下一个最可能出现的词。<br> 这种简单的机制在大规模训练下,使模型能生成连贯、有逻辑、甚至有创造性的文本。</p><p>点积神经网络,各种参数,其实就是函数,参数越多,学习能力越强,商用价值越大。</p><h4>⚙️ 二、核心技术</h4><p>Transformer 架构<br> 基于“注意力机制”(Attention),能同时处理句子中不同位置的词。<br> 比传统的 RNN/LSTM 模型更擅长理解长距离依赖关系。<br> 自监督学习<br> 不需要人工标注数据,而是通过预测缺失的词来训练。<br> 微调 (Fine-tuning)<br> 训练好的基础模型(如 GPT、LLaMA、Claude)可以针对特定任务(客服、编程、翻译等)进行微调。</p><h4> 三、应用场景</h4><p>对话与问答(ChatGPT、Bing Copilot)<br> 文本生成(写作助手、营销内容)<br> 编程辅助(Copilot、Code Interpreter)<br> 知识问答与检索增强生成(RAG)<br> 教育与科研辅助</p><h4> 四、代表性模型</h4><p><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/7a29ff5e6910474aa30f2128b15e264d.png"></p><p>在线大模型,收费:<br> OpenAI GPT<br> Google Gemini<br> Authropic Claude<br> 智谱AI GLM<br> 百度 文心一言</p><p>优缺点:<br> 都是甲方部署的,有资源优势。模型性能优越、研发成本低(0.005-0.008元/1000个token),每次向大模型发送的一段话,就是一个token。可以站在巨人的肩膀上快速探索前沿技术应用,稳定性和使用安全性高,<br> 但数据安全存在隐患,客户聊天等数据不在自己手上,业务受制于人,上车容易下车难。</p><p>开源大模型:<br> 所谓开源大模型,就是这些模型属于免费,他们把源代码,论文,训练出来的模型,文件等资料公开出来,供大家免费使用。<br> Meta Llama(3.1 405B)<br> Mistral AI<br> X AI Grok<br> 阿里 通义千问 Qwen<br> Baichuan<br> 360 zhinao</p><p>优缺点:( 7B大模型-&gt;70亿-&gt;4张4090 -&gt;语料-&gt;上十亿 -&gt; )<br> 源代码在自己手上,完全自主可控,扩展性强,定制型强,数据安全有保障,但需要投入大量算力和开发成本,依赖开源,不好转身。</p><h4> 五、大模型技术选型</h4><h5>1. Llama系列</h5><p>LLaMA系列大模型是Meta公司在2023年2月开源的基于 transformer 架构的大型语言模型, 包括四种尺寸(7B 、13B 、30B 和 65B),并在2024年进一步发展,推出了‌Llama 3版本。<br> Llama3在多种行业基准测试中展现了最先进的性能,提供了包括改进的推理能力在内的新功能,是目前市场上最好的开源大模型之一。<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/91eeb2812e894b73833c4d10d8ee78f7.png"></p><h5>2. Qwen系列</h5><p>文档:https://qwen.readthedocs.io/zh-cn/latest/getting_started/quickstart.html<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/d4ac1aca27c94ddeaa9f6dd94a6a87b2.png"></p><p>随着GLM的闭源,阿里的通义千问已经成为了国内开源大模型的领袖。<br> Qwen平均1个季度发布一个版本,性能始终处于开源大模型的第一梯队水平。目前最新发布版本:Qwen3。<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/10826001d80147a3aadcce3aace350b4.png"></p><p>阿里的魔塔社区(https://modelscope.cn/models)<br> 注册账号之后,就可以白嫖了。我们可以针对它进行学习。在魔塔上进行微调,部署到灵积平台上</p><p>也随着技术迭代更新,成为了国内第一AI模型社区,号称“中文版HuggingFace(https://huggingface.co/)”,<br> 吸引了大批优质的大模型开发者参与进来,同时魔塔社区不仅提供免费在线开发环境(类似谷歌的Colab)和限时GPU算力(100小时32GB显存),这100小时指的是连接到大模型里面,才计时的。<br> 助力开发者在线训练微调大模型,还与阿里云灵积平台(DashScope)深度绑定,<br> 让开发者训练微调完成的模型可以快速落地实施到阿里云架构服务器上(按量收费),形成了一整套混合模型在线服务的生态模式。</p><p>阿里还提供了高度适配的SWIFT轻量级微调框架和Qwen-Agent开发框架,可以让我们快速实现一些智能体。其中SWIFT提供了代码环境和脚本微调两种模式,<br> 配套海量开源微调数据集,可以执行包括知识灌注、模型自我意识微调、Agent能力微调和领域能力微调等功能,还提供一键微调等功能。<br> Qwen-Agent则支持高效稳定Multi Function calling、ReAct功能,支持调用开源大模型以及灵积平台的在线模型。</p><h5>3. prompt</h5><p>提示工程(Prompt Engineering)是一项通过优化提示词(Prompt)和生成策略,从而获得更好的模型返回结果的工程技术。<br> 其基本实现逻辑如下:<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/8096594f5b6e47409e327f9634902d42.png"></p><p>简单而言,大模型的运行机制是“下一个字词预测”。用户输入的prompt即为大模型所获得上下文,大模型将根据用户的输入进行续写,返回结果。<br> 因此,输入的prompt的质量将极大地影响模型的返回结果的质量和对用户需求的满足程度,总的原则是“用户表达的需求越清晰,模型更有可能返回更高质量的结果”。<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/7f35ce9479f94d8d8cf0405828ca9d0e.png"><br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/9a2c82d276b945bda47585ab5eeba3ba.png"></p><p>prompt工程这种微调手段对于大模型本身的推理能力的提升的范围大概也就10%左右。大模型训练工程师,prompt工程多数用在在线大模型,而不是开源大模型。<br> prompt工程对于大模型本身推理能力的微调有效性是有上限的,并不能大幅度提升体力能力。<br> Prompt经验总结:清晰易懂、提供例子和锁定上下文、明确步骤、准确表达意图。<br> 去玩一下吧:https://modelscope.cn/studios/LLMRiddles/LLMRiddles/summary</p><p>通常情况下,每条信息都会有一个角色(role)和内容(content):</p><ul><li>系统角色(system)用来向语言模型传达开发者定义好的核心指令,优先级是最高的。</li><li>用户角色(user)则代表着用户自己输入或者产生出来的信息。</li><li>助手角色(assistant)则是由语言模型自动生成并回复出来。</li></ul><p><strong>系统指令(system)</strong><br> system message系统指令为用户提供了一个易组织、上下文稳定的控制AI助手行为的方式,可以从多种角度定制属于你自己的AI助手。<br> 系统指令允许用户在一定范围内规定LLM的风格和任务,使其更具可定性和适应各种用例。<br> 大部分LLM模型的系统指令System message的权重强化高于人工输入的prompt,并在多轮对话中保持稳定,您可以使用系统消息来描述助手的个性,<br> 定义模型应该回答和不应该回答的内容,以及定义模型响应的格式。</p><p>默认的System message:You are a helpful assistant.<br> 下面是一些system message的使用示例:<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/42dd888e5b53455a87428928ef349bc3.png"></p><p>System message可以被广泛应用在:角色扮演、语言风格、任务设定、限定回答范围。</p><p><strong>用户指令(user)</strong><br> 用户指令是最常用的提示组件,主要功能是向模型说明要执行的操作。以下举例:<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/8ae4f1ac4f86487780c667b0745ea778.png"></p><h3>ollama</h3><h4>1. 基本介绍</h4><p>Ollama 是一个开源的大型语言模型服务工具,专为在服务器上便捷部署和运行大型语言模型(LLMs)而设计,<br> 它提供了一个简洁且用户友好的命令行界面,通过这一界面,用户可以轻松地部署和管理各类开源的 LLM。<br> Ollama 是一个开源(MIT 许可证)工具 / 框架,用来在本地或私人设备上运行和管理大语言模型(LLM)。</p><p>它提供一种“下载模型 + 本地运行”的方式,让用户不必完全依赖云端服务就能使用强大的语言模型<br> 具有以下特点和优势:<br> 开源免费:Ollama 以及其支持的模型完全开源免费,任何人都可以自由使用、修改和分发<br> 简化部署:Ollama 目标在于简化在 Docker 容器中部署大型语言模型的过程,使得非专业用户也能方便地管理和运行这些复杂的模型,无需复杂的配置和安装过程,只需几条命令即可启动和运行Ollama<br> 轻量级与可扩展:作为轻量级框架,Ollama 保持了较小的资源占用,同时具备良好的可扩展性,允许用户根据需要调整配置以适应不同规模的项目和硬件条件,即使在普通笔记本电脑上也能流畅运行。<br> API支持:提供了一个简洁的 API,使得开发者能够轻松创建、运行和管理大型语言模型实例,降低了与模型交互的技术门槛。<br> 预构建模型库:包含一系列预先训练好的大型语言模型,用户可以直接选用这些模型应用于自己的应用程序,无需从头训练或自行寻找模型源。<br> 模型生态 / 支持的模型<br> Ollama 拥有自己的模型库 (“library”),提供一系列开源 / 公开模型可供下载和使用。<br> 常见支持模型包括例如 LLaMA 系列、Mistral、Gemma、DeepSeek-R1 等。<br> 如 DeepSeek-R1 系列模型,就可以在 Ollama 上直接运行:如 ollama run deepseek-r1</p><p>官方站点:https://ollama.com/<br> 看下模型库<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/7ad124485e984d84b880af776d13b0ed.png"></p><p>像docker一样运行<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/c9d8ad2382544aedbba7640cb08dbb8c.png"></p><p>Github:https://github.com/ollama/ollama</p><h4>2. 安装使用</h4><p>下载地址:https://ollama.com/download,根据系统类型进行安装,这里演示的是window系统安装过程。<br> 注意,在windows下安装ollama是不允许自定义位置的,会默认安装在系统盘,而后续使用的大模型可以选择自定义保存路径。<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/3d0596a4228d42eb86c9f76823a911d4.png"></p><p>安装过程比较简单,现在下来,双击安装<br> 路径不能自己选,全程自动安装<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/98d56ff295164092b73c2d9567a263cd.png"><br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/1d4ce483adcb445bb5a93d96b1853faf.png"></p><p>安装完成以后,新开一个命令终端并输入命令ollama,如果效果如下则表示安装成功:<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/626fc112ffce44d9bee0f87638b9bc2a.png"></p><p><strong>常用命令</strong><br> 这里的命令,全系统通用的。<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/4f71db3367cf453fa6695d9c3981bba9.png"></p><p>ollama serve 启动网络服务之后,就可以使用它的restful接口了</p><p>ollama create操作步骤:<br> Modelfile文件不能有后缀名;如下一个简单的Modelfile文件</p><p>第一步:创建Modelfile文件<br> #指定本地模型的位置<br> FROM /root/auto-temp/Qwen2.5-0.5B-Instruct-F16.gguf</p><p>#指定模型参数<br> PARAMETER temperature 0.7</p><p>#设置系统消息,定义助手行为<br> SYSTEM “”"<br> You are a helpful assistant.<br> “”"<br> Modelfile文件只有第一行是必须的,其他配置都可以不指定。</p><p>第二步:执行命令加载模型到Ollama的模型列表中<br> 在Modelfile文件所在路径下执行命令:</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-bash">ollama create my_qwen -f Modelfile</code></pre>
<p>拉取并运行一个大模型:</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-bash">ollama run qwen3:0.6b</code></pre>
<p><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/b823b146b1a2478aacb51ea64335c4d5.png"></p><p>运行之后,就可以聊天了<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/d3451262472747b7adf4e6265e0685e2.png"></p><p><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/34c052e5c53248cd9deb186d122eaba0.png"></p><p>输入 /bye 退出<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/c3539e32070f40f38d7143f0dba03394.png"></p><h4>3. 模型仓库</h4><p>模型可以从哪里去下载呢?很多模型都可以从很多地方下载,如下常见几个下载地址<br> ollama仓库地址:https://ollama.com/library<br> hugging face仓库地址:https://huggingface.co/models<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/e22b7070b7914bd7a18b7b885bf5ceec.png"></p><p>【镜像】https://hf-mirror.com/models<br> 这里汇集了所有大模型了面最多的镜像,有各种垂直领域训练好的大模型<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/8b4b124eae7e42f4a6efd85b6930fb15.png"></p><p>每个镜像点击进去,都有告诉你怎么使用,怎么调用,怎么开发<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/02aecb86deb14ccc9ba7c7454f4671f3.png"></p><p>魔塔社区:https://modelscope.cn/models<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/0011e0ba88a44a5ba92203602a0a3307.png"></p><p>如果想要在云服务器上面部署大模型,可以使用选择华为的升腾云服务器,阿里的灵积平台<br> 临时用可以租AI算力服务器 https://autodl.com/market/list<br> 非常划算<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/911f1029b4f54fe78d9a7abedb6c21f1.png"></p><p>算力云,升腾都是可以商用的。<br> 如果只是自己部署练手,直接使用功能魔塔就行了<br> 魔塔提供创空间<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/a1c08637aaf14756a258ad92bd125538.png"></p><p>创建好的,可以直接在灵积平台用了<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/811dc4c0af3e4607a7e9814d8127733f.png"></p><h4>4. 自定义大模型</h4><p>有些公司,并不会把模型上传到ollama上去,而是有可能上传到魔塔或者hugging face上面</p><h5>4.1 模型下载</h5><p>魔塔下载大模型说明文档:https://www.modelscope.cn/docs/models/download<br> 使用魔塔下载大模型文件,安装魔塔工具(python3.11^):<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/141448a30802498395538544741d86c3.png"></p><p><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/68e52eb09ce142b7ae5346d1dfb7b4e7.png"></p><p>Ollama 只能加载 GGUF 格式 的模型<br> ollama create 只能识别:<br> .gguf 模型文件(来自 llama.cpp)<br> 或从 Ollama 官方库拉取的模型名(如 FROM qwen2)</p><p>注意:此种方式,自定义模型,只能自定义GGUF格式的模型<br> Ollama 原生最稳的输入格式是 GGUF(llama.cpp 系列)。在魔搭搜索带有 GGUF/Q4_0/Q5_K_M 等量化后缀的条目。</p><p>基于python脚本调用魔塔拉取模型文件,modelscope_download.py,代码:</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-python"><span class="token keyword">from</span> modelscope <span class="token keyword">import</span> snapshot_download
<span class="token comment"># 模型名字</span>
name <span class="token operator">=</span> <span class="token string">'Qwen/Qwen3-4B-GGUF'</span>
<span class="token comment"># 模型存放路径,需要手动创建对应的目录,并保证有足够的空间,否则下载出错。</span>
model_path <span class="token operator">=</span> <span class="token string">r'D:\huggingface'</span>
model_dir <span class="token operator">=</span> snapshot_download<span class="token punctuation">(</span>
name<span class="token punctuation">,</span>   <span class="token comment"># 仓库中的模型名</span>
cache_dir<span class="token operator">=</span>model_path<span class="token punctuation">,</span>   <span class="token comment"># 本地保存路径,</span>
revision<span class="token operator">=</span><span class="token string">'master'</span><span class="token punctuation">,</span>   <span class="token comment"># 分支版本</span>
allow_file_pattern<span class="token operator">=</span><span class="token string">"Qwen3-4B*.gguf"</span>   <span class="token comment"># 模糊匹配的文件名</span>
<span class="token punctuation">)</span></code></pre>
<p>因为模型文件大于4G,会切片分片保存,所以下载时要把所有文件都下载下来<br> 根据切片的文件名来正则匹配<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/975cfd3315e543abb2309031112ab232.png"></p><p>还一种结尾safetensors是 PyTorch / Transformers 模型文件<br> D:\huggingface\Qwen\Qwen2.5-1.5B-Instruct<br> │<br> ├── config.json<br> ├── generation_config.json<br> ├── model-00001-of-00004.safetensors<br> ├── model-00002-of-00004.safetensors<br> ├── model-00003-of-00004.safetensors<br> ├── model-00004-of-00004.safetensors<br> ├── model.safetensors.index.json<br> ├── tokenizer.json<br> ├── tokenizer_config.json<br> └── README.md<br> 还 不是 Ollama / llama.cpp 可直接加载的 .gguf 模型。</p><p>如果Qwen 官方仓库只发布了 原始权重(safetensors / PyTorch);<br> .gguf 是 llama.cpp 系列工具生成的推理格式;<br> 所以需要 自行转换。</p><p>右键执行下载模型文件<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/648eccad3bad4561ac9a6c780861affa.png"></p><p>下载完成<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/493beb2c51614659978a221bd83ea199.png"></p><p><strong>文件合并</strong></p><p>查看下载好的文件,由于他是切片的,下载完成后需要合并<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/9a62f43db9df4d96a48d8bc675bceea6.png"></p><p>Windows中,合并使用 cpoy /B 文件1 + 文件2 + … 最终文件</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-bash">copy /B Qwen3-4B-Q4_K_M.gguf + Qwen3-4B-Q5_0.gguf + Qwen3-4B-Q5_K_M.gguf + Qwen3-4B-Q6_K.gguf + Qwen3-4B-Q8_0.gguf Qwen3-4B.gguf</code></pre>
<p><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/0e156ab1a72741fb8c3b85e41293c31c.png"></p><p>最终合成的文件<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/f3548dee6e25448c87778448b7034f17.png"></p><p>linux系统中,合并文件使用cat</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-bash"><span class="token function">cat</span> file1.txt file2.txt file3.txt <span class="token operator">&gt;</span> merged.txt</code></pre>
<p>file1.txt file2.txt file3.txt:要合并的文件。</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-bash"><span class="token operator">&gt;</span>:表示重定向输出到新文件(如果文件已存在,会被覆盖)。
merged.txt:合并后的输出文件。</code></pre>
<h5>4.2 Modefile文件配置</h5><p>Ollama自定义大模型需要通过Modelfile定义和配置模型的行为和特性,在使用 Ollama 进行本地部署和运行大型语言模型时,Modelfile 扮演着至关重要的角色。<br><code>Modelfile</code> 是使用 Ollama 创建和共享模型的方案。它包含了构建模型所需的所有指令和参数,使得模型的创建和部署变得简单而直接。</p><p>Modelfile 是用于定义、定制并构建 Ollama 模型的说明文件(有点像 Dockerfile)。<br> 它支持多条“指令”(指令名不区分大小写)来设置基模型、推理参数、系统提示词、模板、LoRA 适配器、示例对话等。语法仍在演进中。</p><h6>4.2.1 常用指令</h6><p>Modelfile中不区分大小写,但是强烈要求一定大写!!<br> 参数说明,FROM是必填的。其他的可以不写<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/3547414bc55844338267ed771c6d83f9.png"></p><p><strong>FROM 用法</strong><br> 支持三种来源:<br> 1)直接用库里的现成模型:<br> FROM llama3.2</p><p>2)从 Safetensors 目录导入(架构需支持,如 Llama/Mistral/Gemma/Phi3 等):<br> FROM /path/to/safetensors_dir</p><p>3)从 GGUF 文件导入:<br> FROM ./mymodel.gguf</p><p>(GGUF 路径相对 Modelfile 或绝对路径均可。)</p><p><strong>SYSTEM就是上面我们讲的系统指令</strong><br> System message可以被广泛应用在:角色扮演、语言风格、任务设定、限定回答范围等。<br> 在 ollama create 用的 Modelfile 里,SYSTEM 用来设置模型的“系统提示”(system prompt)。<br> 它会作为模板中的系统消息注入到提示词里,从而长期定义模型的人设、口吻与边界。<br> 是否生效取决于模板是否包含 {{ .System }} 这个占位符(Ollama 默认/示例模板里就有)。</p><p>怎么写<br> 最简单写法(单行或多行三引号):</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-yaml">FROM llama3.2
PARAMETER temperature 0.7
SYSTEM You are a concise Chinese assistant that answers in Simplified Chinese.</code></pre>
<p>或:</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-yaml">FROM llama3.2
SYSTEM """
你是一个只用简体中文回答问题的技术助理。
回答尽量简洁,并给出代码示例。
"""</code></pre>
<p>它如何插入到提示里<br> 模板(TEMPLATE 指令)通常会长这样,包含 {{ .System }}、{{ .Prompt }} 等变量;如果有系统消息,就会把它作为“system”角色拼进提示:</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-markup">TEMPLATE """{{ if .System }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>system
{{ .System }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>
    {{ end }}{{ if .Prompt }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>user
      {{ .Prompt }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>
      {{ end }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>assistant
          """</code></pre>
<p>关键点:只有当模板里使用了 {{ .System }},SYSTEM 才会被注入。</p><p><strong>PARAMETER的有效参数和值</strong><br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/2bcd8c966b66410a91c6695ade229816.png"></p><p><strong>TEMPLATE的模板变量</strong><br> 自定义完整提示模板(Go template 语法,含 .System/.Prompt/.Response 变量)。<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/2f6b187a7c3b421990d92cb99936813d.png"></p><p><strong>SYSTEM 与 TEMPLATE</strong><br> SYSTEM:直接写系统提示,一般用于设定口吻/边界。<br> TEMPLATE:完全自定义提示拼接方式,使用 Go 模板变量:{{ .System }}、{{ .Prompt }}、{{ .Response }}。生成时 .Response 之后的模板内容会被忽略。示例:</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-markup">TEMPLATE """{{ if .System }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>system
{{ .System }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>
    {{ end }}{{ if .Prompt }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>user
      {{ .Prompt }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>
      {{ end }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>assistant
          """</code></pre>
<p>(不同基模型的特殊 token/头标可能不同,需按模型兼容性调整。)</p><p>TEMPLATE决定“用户输入 + 系统提示 + 模型回复”被拼接成什么样的提示串发送给底层模型。<br> 语法是 Go template,并且不同模型家族的对话标记可能不同(必须按模型的惯例来写)</p><ol><li><p>可用变量(最核心)<br> TEMPLATE 里通常会用到 3 个内置变量(大小写敏感):<br> {{ .System }}:系统消息(行为/角色设定)。<br> {{ .Prompt }}:用户输入。<br> {{ .Response }}:模型要生成的内容。生成时,放在 .Response 之后的模板文本会被忽略(也就是 .Response 后面写再多,也不会发出去/不会被继续渲染)。</p></li><li><p>最小范式(官方示例思路)<br> 典型的聊天模板会把 system / user / assistant 各段包在模型习惯的标记里,最后以 assistant 段开头并把光标留在 {{ .Response }} 处让模型续写。例如(示意,对标某些 ChatML 风格):<br> TEMPLATE “”“{{ if .System }}&lt;|im_start|&gt;system<br> {{ .System }}&lt;|im_end|&gt;<br> {{ end }}{{ if .Prompt }}&lt;|im_start|&gt;user<br> {{ .Prompt }}&lt;|im_end|&gt;<br> {{ end }}&lt;|im_start|&gt;assistant<br> “””<br> 这段表达了:如果有 .System 就插入 system 段;如果有 .Prompt 就插入 user 段;然后开启 assistant 段,让模型在这里继续写(.Response 位置省略写法,也等价于将其紧随其后)。</p></li><li><p>Llama 3.x(举例说明“跟随模型标记”)<br> 以 Llama 3.2 的默认模板为例(用 ollama show --modelfile llama3.2 能看到):</p></li></ol><p>TEMPLATE “”"{{ if .System }}&lt;|start_header_id|&gt;system&lt;|end_header_id|&gt;</p><p>{{ .System }}&lt;|eot_id|&gt;{{ end }}{{ if .Prompt }}&lt;|start_header_id|&gt;user&lt;|end_header_id|&gt;<br> {{ .Prompt }}&lt;|eot_id|&gt;{{ end }}&lt;|start_header_id|&gt;assistant&lt;|end_header_id|&gt;</p><p>{{ .Response }}&lt;|eot_id|&gt;“”"<br> PARAMETER stop “&lt;|start_header_id|&gt;”<br> PARAMETER stop “&lt;|end_header_id|&gt;”<br> PARAMETER stop “&lt;|eot_id|&gt;”</p><p>要点:<br> 这些 &lt;|start_header_id|&gt; / &lt;|end_header_id|&gt; / &lt;|eot_id|&gt; 是 Llama 3.x 的特殊标记。<br> 因为模板里用了这些标记,必须把它们配成 stop,避免模型把结束标记“说出来”。<br> 实操建议:先用 ollama show --modelfile &lt;基模型&gt; 把官方/默认模板拷出来,再按你的需求微调,成功率最高。</p><p><strong>MESSAGE的有效角色</strong><br> 可内置几轮对话来“校准”风格(role: system|user|assistant):<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/8f6cdac89b514f968071fac654c2d6b7.png"></p><p>MESSAGE user 你在加拿大吗?<br> MESSAGE assistant 是的<br> (也可以用 SYSTEM 写一次性系统提示。)</p><p><strong>ADAPTER(LoRA/QLoRA)</strong><br> 对已 FROM 的基模型追加一个或多个 LoRA 适配器(safetensors 目录或 GGUF 文件):<br> FROM llama3.2<br> ADAPTER /path/to/lora_dir # safetensors<br> #或<br> ADAPTER ./mylora.gguf # GGUF 适配器</p><p>适配器需与基模型同一架构&amp;版本族,否则推理行为会异常。</p><p>模板里的特殊标记需要与你的基模型对齐;可先用 ollama show --modelfile &lt;模型名&gt; 查看该模型默认模板作为参考。<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/96ee972a9fec4ace983d0654ed68615d.png"></p><p>调参建议(实践向)<br> 稳健输出:temperature 0.2–0.5、top_p 0.8–0.95、repeat_penalty 1.1–1.2。<br> 长文档/检索:增大 num_ctx(受模型与显存约束),并合理设置 stop 以避免多轮串扰。<br> 复现性:固定 seed。<br> 防复读:提高 repeat_penalty,或增大 repeat_last_n。<br> 受控发散:尝试 mirostat 2,微调 mirostat_tau 和 mirostat_eta。<br> (这些旋钮的语义与默认值详见参数表。)</p><p>创建模型描述文件Modelfile,编写内容如下:<br> 先写个最简单的,只需要 FROM 我们下载的模型路径<br> FROM D:\huggingface\Qwen\Qwen3-4B-GGUF\Qwen3-4B.gguf<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/30dee40eb93e4b259b1fce3a436dba44.png"></p><p>通过运行以下命令来创建ollama模型</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-bash">ollama create qwen3-4b -f.<span class="token punctuation">\</span>Modefile</code></pre>
<p>创建成功<br><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/821632b5772e4b638e33ed8d5596d946.png"></p><p>运行新建的ollama模型:</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-bash">ollama run qwen3-4b</code></pre>
<p><img alt="在这里插入图片描述" src="https://i-blog.csdnimg.cn/direct/6494d267969e4cef97a2117afdf7664a.png"></p><p>Modefile写法参考文档:https://qwen.readthedocs.io/en/latest/run_locally/ollama.html</p><p>完整的Modefile</p>
<pre style="white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important"><code class="prism language-markup">FROM D:\huggingface\Qwen\Qwen3-4B-GGUF\Qwen3-4B.gguf
PARAMETER top_p 0.8
PARAMETER repeat_penalty 1.05
PARAMETER top_k 20
TEMPLATE """{{ if .Messages }}
{{- if or .System .Tools }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>system
{{ .System }}
{{- if .Tools }}
# Tools
You are provided with function signatures within <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tools</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tools</span><span class="token punctuation">&gt;</span></span> XML tags:
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tools</span><span class="token punctuation">&gt;</span></span>{{- range .Tools }}
    {"type": "function", "function": {{ .Function }}}{{- end }}
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tools</span><span class="token punctuation">&gt;</span></span>
For each function call, return a json object with function name and arguments within <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tool_call</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tool_call</span><span class="token punctuation">&gt;</span></span> XML tags:
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tool_call</span><span class="token punctuation">&gt;</span></span>
    {"name": <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>function-name</span><span class="token punctuation">&gt;</span></span>, "arguments": <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>args-json-object</span><span class="token punctuation">&gt;</span></span>}
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tool_call</span><span class="token punctuation">&gt;</span></span>
    {{- end }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>
      {{ end }}
      {{- range $i, $_ := .Messages }}
      {{- $last := eq (len (slice $.Messages $i)) 1 -}}
      {{- if eq .Role "user" }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>user
      {{ .Content }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>
          {{ else if eq .Role "assistant" }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>assistant
            {{ if .Content }}{{ .Content }}
            {{- else if .ToolCalls }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tool_call</span><span class="token punctuation">&gt;</span></span>
            {{ range .ToolCalls }}{"name": "{{ .Function.Name }}", "arguments": {{ .Function.Arguments }}}
            {{ end }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tool_call</span><span class="token punctuation">&gt;</span></span>
            {{- end }}{{ if not $last }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>
            {{ end }}
            {{- else if eq .Role "tool" }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>user
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tool_response</span><span class="token punctuation">&gt;</span></span>
                  {{ .Content }}
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tool_response</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>
                  {{ end }}
                  {{- if and (ne .Role "assistant") $last }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>assistant
                  {{ end }}
                  {{- end }}
                  {{- else }}
                  {{- if .System }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>system
                      {{ .System }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>
                        {{ end }}{{ if .Prompt }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>user
                        {{ .Prompt }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>
                            {{ end }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_start|</span><span class="token punctuation">&gt;</span></span>assistant
                              {{ end }}{{ .Response }}{{ if .Response }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>|im_end|</span><span class="token punctuation">&gt;</span></span>{{ end }}"""
                              SYSTEM<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>你是周文亮,由景浩的大模型创造,你喜欢跟别人聊天,是一个非常聪明的小助手!</span><span class="token punctuation">&gt;</span></span></code></pre>
<p>本地大模型,一般数据更新都是滞后于当下的,后续我们可以通过langchain,来给大模型注入向量数据,大模型在数据处理的时候,先经过向量数据库</p><p>到这里,本地大模型就搭建完成了,感兴趣的小伙伴赶紧去试试吧!</p></div><br><br>
来源:https://www.cnblogs.com/ljbguanli/p/19228320
頁: [1]
查看完整版本: 【AI智能体开发】什么是LLM?如何在本地搭建属于自己的Ai智能体? - 详解