鱼儿在飞 發表於 2026-3-19 10:17:00

AIAgent开发-LangChain

<h1>前言</h1>
<p data-start="41" data-end="65">回顾人类与机器的协同模式已经经历了如下几大阶段:</p>
<p data-start="41" data-end="65">搜索引擎阶段: 机器负责信息检索,人进行逻辑推理、任务执行。</p>
<p data-start="41" data-end="65">LLM阶段:机器负责内容推理和任务执行,人输入指令。</p>
<p data-start="41" data-end="65">Agent阶段:机器负责推理决策 + 自主执行,人输入目标定义、需求明确、结果校验。</p>
<p data-start="272" data-end="360">如运维领域已经出现了SQL/代码审计、AIOPS故障定位根因分析、OAM/YAML/配置自动生成等各类AIAgent。</p>
<p data-start="272" data-end="360"><span style="color: rgba(255, 0, 0, 1)">我觉得AI时代人机协同的范式应该就是人重思考,AI执行。</span></p>
<h1>AI Agent</h1>
<p>AI Agent也称人工智能体/智能代理内置</p>
<ul>
<li>大语言模型(LLM)</li>
<li>记忆(Memory)</li>
<li>解析器/控制逻辑(Agent Core)</li>
<li>工具集(Tools)</li>
</ul>
<p>AI Agent本质是把原本需要人类与LLM进行的多轮推理、决策、实践的过程,通过程序自动化。赋予LLM在完成决策后,调用工具和执行任务的能力。</p>
<h2>架构概览</h2>
<p><img alt="image" width="703" height="328" loading="lazy" src="https://img2024.cnblogs.com/blog/1122865/202603/1122865-20260320150812791-779422698.png" class="lazyload"></p>
<h2>AIAgent工作流程</h2>
<p>1个企业级AIAgent应用应该具备以下流程</p>
<div class="cnblogs_code">
<pre>用户提问
   ↓
1. 意图识别 &amp; 分类
   ↓
2. 历史对话压缩/摘要
   ↓
3. 少样本示例检索(Few-shot)
   ↓
4. RAG 知识库粗检索(向量库)
   ↓
5. Rerank 重排序(精排)
   ↓
----------------------------------
【第一次 LLM 调用:工具决策】
----------------------------------
   ↓
6. 工具参数校验 + 权限校验
   ↓
7. 执行工具调用(K8s/API/DB/CLI)
   ↓
8. 工具结果清洗、格式化
   ↓
----------------------------------
【第二次 LLM 调用:最终回答生成】
----------------------------------
   ↓
返回答案</pre>
</div>
<h3>1. 用户提问 → 意图识别 &amp; 分类</h3>
<ul data-start="93" data-end="210">
<li data-section-id="1h31npg" data-start="93" data-end="134">
<p data-start="95" data-end="134"><strong data-start="95" data-end="101">目的</strong>:理解用户需求,判断属于哪类操作(查询/修改/告警/数据分析等)。</p>
</li>
<li data-section-id="1hh1itx" data-start="135" data-end="210">
<p data-start="137" data-end="146"><strong data-start="137" data-end="145">实现方式</strong>:</p>
<ul data-start="149" data-end="210">
<li data-section-id="fka7x6" data-start="149" data-end="192">
<p data-start="151" data-end="192">训练意图分类模型(BERT/LLM zero-shot 或 fine-tune)。</p>
</li>
<li data-section-id="11jy1qd" data-start="195" data-end="210">
<p data-start="197" data-end="210">输出分类标签 + 置信度。</p>
</li>
</ul>
</li>
</ul>
<h3 data-section-id="27czvi" data-start="212" data-end="230">2. 历史对话压缩 / 摘要</h3>
<ul data-start="231" data-end="314">
<li data-section-id="3epsbw" data-start="231" data-end="265">
<p data-start="233" data-end="265"><strong data-start="233" data-end="239">目的</strong>:减少上下文长度,保留关键信息,让 LLM 更高效。</p>
</li>
<li data-section-id="l9g8db" data-start="266" data-end="314">
<p data-start="268" data-end="277"><strong data-start="268" data-end="276">实现方式</strong>:</p>
<ul data-start="280" data-end="314">
<li data-section-id="jn1bxk" data-start="280" data-end="293">
<p data-start="282" data-end="293">摘要模型压缩历史消息。</p>
</li>
<li data-section-id="dvpxj1" data-start="296" data-end="314">
<p data-start="298" data-end="314">可选:按时间窗口/关键实体抽取。</p>
</li>
</ul>
</li>
</ul>
<h3 data-section-id="12plqe2" data-start="316" data-end="340">3. 少样本示例检索(Few-shot)</h3>
<ul data-start="341" data-end="430">
<li data-section-id="mqqlwp" data-start="341" data-end="373">
<p data-start="343" data-end="373"><strong data-start="343" data-end="349">目的</strong>:给 LLM 提供类似场景或模板,让生成更准确。</p>
</li>
<li data-section-id="17rswjs" data-start="374" data-end="430">
<p data-start="376" data-end="385"><strong data-start="376" data-end="384">实现方式</strong>:</p>
<ul data-start="388" data-end="430">
<li data-section-id="y3v92g" data-start="388" data-end="398">
<p data-start="390" data-end="398">构建少量示例库。</p>
</li>
<li data-section-id="1smzuh6" data-start="401" data-end="430">
<p data-start="403" data-end="430">使用相似度匹配或 embedding 检索最相关示例。</p>
</li>
</ul>
</li>
</ul>
<h3 data-section-id="1mcrmm9" data-start="432" data-end="454">4. RAG 知识库粗检索(向量库)</h3>
<ul data-start="455" data-end="580">
<li data-section-id="gl6jop" data-start="455" data-end="482">
<p data-start="457" data-end="482"><strong data-start="457" data-end="463">目的</strong>:从知识库中找到可能有用的文档/片段。</p>
</li>
<li data-section-id="1re6d06" data-start="483" data-end="580">
<p data-start="485" data-end="494"><strong data-start="485" data-end="493">实现方式</strong>:</p>
<ul data-start="497" data-end="580">
<li data-section-id="1hxb120" data-start="497" data-end="543">
<p data-start="499" data-end="543">文档向量化(OpenAI Embeddings / FAISS / Milvus 等)。</p>
</li>
<li data-section-id="x6z8k" data-start="546" data-end="580">
<p data-start="548" data-end="580">通过用户 query 向量与库向量匹配,返回 Top-K 文档。</p>
</li>
</ul>
</li>
</ul>
<h3 data-section-id="17y2mo1" data-start="582" data-end="603">5. Rerank 重排序(精排)</h3>
<ul data-start="604" data-end="718">
<li data-section-id="jtqfwj" data-start="604" data-end="639">
<p data-start="606" data-end="639"><strong data-start="606" data-end="612">目的</strong>:提高知识片段的相关性,减少 LLM “胡编”的概率。</p>
</li>
<li data-section-id="kkf7zl" data-start="640" data-end="718">
<p data-start="642" data-end="651"><strong data-start="642" data-end="650">实现方式</strong>:</p>
<ul data-start="654" data-end="718">
<li data-section-id="17a40re" data-start="654" data-end="691">
<p data-start="656" data-end="691">使用专门的reranker 模型(如<span style="color: rgba(255, 0, 0, 1)">cross-encoder交叉编码器模型</span>)。</p>
</li>
<li data-section-id="1hpwlcx" data-start="694" data-end="718">
<p data-start="696" data-end="718">结合 query、上下文、实体信息重新评分。</p>
</li>
</ul>
</li>
</ul>
<h3 data-section-id="1if6n0h" data-start="725" data-end="746">【第一次 LLM 调用:工具决策】</h3>
<ul data-start="747" data-end="828">
<li data-section-id="184udmp" data-start="747" data-end="778">
<p data-start="749" data-end="778"><strong data-start="749" data-end="755">功能</strong>:决定下一步需要调用哪个工具,并生成调用参数。</p>
</li>
<li data-section-id="1mz3ut9" data-start="779" data-end="808">
<p data-start="781" data-end="808"><strong data-start="781" data-end="787">输入</strong>:意图标签 + 历史上下文 + 检索知识。</p>
</li>
<li data-section-id="1t4viog" data-start="809" data-end="828">
<p data-start="811" data-end="828"><strong data-start="811" data-end="817">输出</strong>:工具调用指令或决策。</p>
</li>
</ul>
<h3 data-section-id="1c84gpy" data-start="835" data-end="855">6. 工具参数校验 + 权限校验</h3>
<ul data-start="856" data-end="937">
<li data-section-id="1d0kblz" data-start="856" data-end="877">
<p data-start="858" data-end="877"><strong data-start="858" data-end="864">目的</strong>:保证操作安全性和合法性。</p>
</li>
<li data-section-id="nkho84" data-start="878" data-end="937">
<p data-start="880" data-end="889"><strong data-start="880" data-end="888">实现方式</strong>:</p>
<ul data-start="892" data-end="937">
<li data-section-id="1wdih8h" data-start="892" data-end="907">
<p data-start="894" data-end="907">参数类型、范围、格式校验。</p>
</li>
<li data-section-id="pmggbz" data-start="910" data-end="937">
<p data-start="912" data-end="937">用户权限/角色校验(RBAC 或自定义权限系统)。</p>
</li>
</ul>
</li>
</ul>
<h3 data-section-id="buhlob" data-start="939" data-end="968">7. 执行工具调用(K8s/API/DB/CLI)</h3>
<ul data-start="969" data-end="1017">
<li data-section-id="7jjccm" data-start="969" data-end="1017">
<p data-start="971" data-end="980"><strong data-start="971" data-end="979">实现方式</strong>:</p>
<ul data-start="983" data-end="1017">
<li data-section-id="1imcohr" data-start="983" data-end="998">
<p data-start="985" data-end="998">根据工具类型调用对应接口。</p>
</li>
<li data-section-id="1jma80j" data-start="1001" data-end="1017">
<p data-start="1003" data-end="1017">可能涉及异步执行或任务队列。</p>
</li>
</ul>
</li>
</ul>
<h3 data-section-id="2x85bv" data-start="1019" data-end="1036">8. 工具结果清洗、格式化</h3>
<ul data-start="1037" data-end="1117">
<li data-section-id="1xkmvck" data-start="1037" data-end="1067">
<p data-start="1039" data-end="1067"><strong data-start="1039" data-end="1045">目的</strong>:统一输出格式,便于 LLM 生成最终答案。</p>
</li>
<li data-section-id="8rocyh" data-start="1068" data-end="1117">
<p data-start="1070" data-end="1079"><strong data-start="1070" data-end="1078">实现方式</strong>:</p>
<ul data-start="1082" data-end="1117">
<li data-section-id="tnbk79" data-start="1082" data-end="1093">
<p data-start="1084" data-end="1093">JSON 标准化。</p>
</li>
<li data-section-id="188pk5y" data-start="1096" data-end="1117">
<p data-start="1098" data-end="1117">提取关键字段、统计数据、表格化信息等。</p>
</li>
</ul>
</li>
</ul>
<h3 data-section-id="fxcd1z" data-start="1124" data-end="1147">【第二次 LLM 调用:最终回答生成】</h3>
<ul data-start="1148" data-end="1241">
<li data-section-id="1oz8x36" data-start="1148" data-end="1181">
<p data-start="1150" data-end="1181"><strong data-start="1150" data-end="1156">目的</strong>:将工具结果、知识片段、上下文整合成自然语言输出。</p>
</li>
<li data-section-id="1ta57yt" data-start="1182" data-end="1241">
<p data-start="1184" data-end="1193"><strong data-start="1184" data-end="1192">实现方式</strong>:</p>
<ul data-start="1196" data-end="1241">
<li data-section-id="vs586u" data-start="1196" data-end="1214">
<p data-start="1198" data-end="1214">LLM 生成面向用户的自然回答。</p>
</li>
<li data-section-id="1pi0j49" data-start="1217" data-end="1241">
<p data-start="1219" data-end="1241">可选择多轮对话生成、带解释的回答或建议操作。</p>
</li>
</ul>
</li>
</ul>
<h2>Agentic Workflow设计范式</h2>
<p>RAG:通过内部知识库 + 检索 + LLM推理,解决模型知识不足的问题,保证回答的准确性与稳定性;、</p>
<p>Agent:通过LLM推理 + 工具调用,实现对外部系统和能力的动态操作与执行;</p>
<p>Workflow:通过预定义流程编排,提供稳定、可控的任务骨架。</p>
<p>Agentic Workflow:因此在实际系统中,例如扣子常采用Workflow + Agent + RAG的组合模式:</p>
<p>由Workflow负责整体流程控制,在关键节点嵌入 Agent 提供智能决策能力,并结合 RAG 引入企业知识,实现兼具稳定性与灵活性的Agentic Workflow架构。</p>
<h3 data-section-id="vo3462" data-start="66" data-end="92"><span><strong data-start="73" data-end="92">1.Agent(完全/多轮推理型)</strong></span></h3>
<p data-start="94" data-end="97">特点:</p>
<ul data-start="99" data-end="217">
<li data-section-id="1jhut7k" data-start="99" data-end="130">
<p data-start="101" data-end="130">核心是 <strong data-start="105" data-end="130">LLM + 工具 + while loop</strong></p>
</li>
<li data-section-id="jejef2" data-start="131" data-end="157">
<p data-start="133" data-end="157">能<strong data-start="134" data-end="142">多轮推理</strong>、<strong data-start="143" data-end="157">自主决定调用哪些工具</strong></p>
</li>
<li data-section-id="1f3ugrr" data-start="158" data-end="178">
<p data-start="160" data-end="178">每次调用 LLM 都可能产生新的行动</p>
</li>
<li data-section-id="1sf7gmq" data-start="179" data-end="194">
<p data-start="181" data-end="194">优势:灵活,能处理未知场景</p>
</li>
<li data-section-id="1d6nvfr" data-start="195" data-end="217">
<p data-start="197" data-end="217">风险:<span style="color: rgba(255, 0, 0, 1)">死循环</span>、成本高、<span style="color: rgba(255, 0, 0, 1)">不可控</span>、<span style="color: rgba(255, 0, 0, 1)">可能误操作</span></p>
</li>
</ul>
<p data-start="219" data-end="224">典型场景:</p>
<ul data-start="226" data-end="271">
<li data-section-id="v37g2s" data-start="226" data-end="252">
<p data-start="228" data-end="252">自动排障 Agent(理论上LLM决定每步)</p>
</li>
<li data-section-id="2jf7mt" data-start="253" data-end="262">
<p data-start="255" data-end="262">自动化脚本生成</p>
</li>
<li data-section-id="lgbjt1" data-start="263" data-end="271">
<p data-start="265" data-end="271"><span style="color: rgba(255, 0, 0, 1)">高度动态任务、高度自动化</span></p>
</li>
</ul>
<h3 data-section-id="1k5qp2z" data-start="278" data-end="334"><span><strong data-start="285" data-end="334">2.RAG(Retrieval-Augmented Generation)+ Workflow</strong></span></h3>
<p><img alt="image" width="1660" height="187" loading="lazy" src="https://img2024.cnblogs.com/blog/1122865/202603/1122865-20260323215930019-537091563.png" class="lazyload"></p>
<p>特点:</p>
<ul>
<li><span style="color: rgba(255, 0, 0, 1)">支持加载企业内部文档、私有知识库,信息更贴合业务</span></li>
<li>流程固定,行为可控、稳定、可预测</li>
<li><span style="color: rgba(255, 0, 0, 1)">减少无效LLM调用,Token成本更低</span></li>
<li>易调试、易监控、易上线运维</li>
</ul>
<p data-start="463" data-end="468">典型场景:</p>
<ul data-start="470" data-end="494">
<li data-section-id="1rkv9g2" data-start="470" data-end="476">
<p data-start="472" data-end="476">告警分析</p>
</li>
<li data-section-id="1gzrdsq" data-start="477" data-end="485">
<p data-start="479" data-end="485">事件根因分析</p>
</li>
<li data-section-id="12ncnjp" data-start="486" data-end="494">
<p data-start="488" data-end="494">运维知识问</p>
</li>
</ul>
<h1>LangChain</h1>
<p data-start="37" data-end="200">在AI Agent中</p>
<ul>
<li data-start="37" data-end="200"><strong data-start="50" data-end="61">LLM是大脑</strong>,负责生成决策和答案;</li>
<li data-start="37" data-end="200"><strong data-start="72" data-end="81">工具是手脚</strong>,执行具体操作;</li>
<li data-start="37" data-end="200"><strong data-start="89" data-end="98">记忆是经验</strong>,积累上下文和历史信息;</li>
<li data-start="37" data-end="200"><span style="color: rgba(255, 0, 0, 1)">而<strong data-start="111" data-end="149">解析器/控制逻辑(LangChain或Dify)才是中枢神经</strong>,</span>将大脑、手脚和经验高效协同起来。<span style="color: rgba(255, 0, 0, 1)">没有中枢神经,Agent无法根据LLM输出的答案自动调用对应工具执行任务</span>。</li>
</ul>
<p data-start="202" data-end="317"><strong data-start="202" data-end="215">LangChain</strong>是开发AI Agent 的一站式框架,它的核心价值在于将大模型(LLM)、记忆、工具、规划等 Agent 核心模块串联起来,使开发者无需从零实现整个系统,就能快速搭建能够自主完成复杂任务的智能体。</p>
<p data-start="202" data-end="317">LangChain 的核心模块可以总结为六大类(加上 RAG 增强):</p>
<h2>1.LLM</h2>
<p>LLM负责处理Prompt并生成结果,是AI Agen核心能力组件。</p>
<p>根据部署方式不同,模型通常分为<strong data-start="141" data-end="156">外部 LLM(云模型)</strong> 和 <strong data-start="159" data-end="177">企业内部 LLM(私有模型)</strong> 两种。</p>
<h3 data-section-id="nfxqhq" data-start="47" data-end="68">1. 外部LLM(云LLM)</h3>
<p data-start="69" data-end="107">外部LLM指由第三方厂商提供的大语言模型服务,通过互联网API调用。</p>
<p data-start="109" data-end="119">常见的外部模型包括:</p>
<ul data-start="121" data-end="288">
<li data-section-id="16plzgz" data-start="121" data-end="204"><span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline">ChatGPT(由 <span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline">OpenAI 提供) </span></span></li>
<li data-section-id="1fmabmb" data-start="205" data-end="288"><span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline">Claude(由 <span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline">Anthropic 提供) </span></span></li>
</ul>
<p data-start="290" data-end="403">客户端通过HTTP API调用模型服务,通常按照 <strong data-start="317" data-end="334">Token使用量进行计费</strong>。</p>
<h3 data-start="290" data-end="403">2. 企业内部 LLM(私有LLM)</h3>
<p data-start="435" data-end="482">企业内部 LLM 指企业将<strong data-start="449" data-end="458">开源大模型</strong>部署在自身基础设施中,对内部用户提供推理服务。</p>
<p data-start="484" data-end="493">常见部署模型包括:</p>
<ul data-start="495" data-end="614">
<li data-section-id="1fetjdh" data-start="495" data-end="534"><span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline">DeepSeek </span></li>
<li data-section-id="16uh11" data-start="535" data-end="574"><span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline">Llama </span></li>
<li data-section-id="btvcid" data-start="575" data-end="614"><span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline">Qwen </span></li>
</ul>
<p data-start="616" data-end="694">企业通常借助<span style="color: rgba(128, 0, 0, 1)">推理框架(如 </span><span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline"><span style="color: rgba(128, 0, 0, 1)">vLLM</span>)将模型封装为API服务,对内部系统或用户开放访问。</span></p>
<p data-start="696" data-end="705">私有化部署的特点:</p>
<ul data-start="707" data-end="767">
<li data-section-id="x3odzc" data-start="707" data-end="725">数据不出企业内网,安全性更高</li>
<li data-section-id="kuxran" data-start="726" data-end="745">可以根据业务需求进行定制化优化</li>
<li data-section-id="26v9ik" data-start="746" data-end="767">初期需要投入 GPU 服务器等算力资源</li>
</ul>
<p data-start="769" data-end="815">在硬件方面,大多数大模型推理需要<strong data-start="786" data-end="796">GPU加速</strong>才能达到可接受的响应速度和并发能力。</p>
<h2>2.ModelI/O(模型I/O)</h2>
<p>管理提示词模板、格式化输入,解析模型输出。</p>
<p><img alt="0c1f9c2dab1d67ee4088d365b9f0e29a" width="753" height="314" loading="lazy" src="https://img2024.cnblogs.com/blog/1122865/202603/1122865-20260322131010140-1285235158.png" class="lazyload"></p>
<h3>提示词分类</h3>
<h4>System Prompt(系统提示词)</h4>
<p data-start="57" data-end="147">System Prompt(系统提示词)用于定义模型的人设与行为规则。</p>
<h4 data-start="57" data-end="147">Agent Skill</h4>
<p data-start="57" data-end="147">自研Agent客户端会在代码中封装System Prompt,或在客户端(Claude Code)预留Skills文件与System Prompt 输入入口,支持自定义 Agent Skills。</p>
<p data-start="57" data-end="147"><strong>为啥需要Agent skill?</strong></p>
<p><strong>降本:解决上下文臃肿与成本爆炸</strong></p>
<p>不再把海量SOP、API文档<span style="color: rgba(255, 0, 0, 1)">全量塞进System Prompt</span>,而<span style="color: rgba(255, 0, 0, 1)">是通过Skill Router动态路由按需挂载技能。</span></p>
<p>大幅减少Token消耗,避免模型注意力丢失,同时降低推理成本。</p>
<p class="_mce_tagged_br"><strong>解耦:解决多智能体协调复杂</strong></p>
<p>Skill采用无状态设计,配合Blackboard黑板模式共享状态,让各技能之间完全解耦。</p>
<p><span style="color: rgba(255, 0, 0, 1)">不需要Agent之间频繁通信</span>,避免逻辑死循环,提升系统稳定性与可扩展性。</p>
<p class="_mce_tagged_br"><strong>增效:确保Agent调用到工具准确率:</strong></p>
<p class="_mce_tagged_br">解决Agen有工具但不去用,不会用的问题:模块化Skill 把 Instructions(指令)+ Reference(知识)+ Scripts(执行逻辑) <span style="color: rgba(255, 0, 0, 1)">打包成完整技能包。</span></p>
<p>让 AI 清楚知道在什么业务节点、该调用哪个工具、如何组合使用,确保工具真正落地业务。</p>
<p><img alt="image" width="775" height="316" loading="lazy" src="https://img2024.cnblogs.com/blog/1122865/202603/1122865-20260326095449001-469757783.png" class="lazyload"></p>
<p data-start="57" data-end="147">&nbsp;</p>
<p data-start="57" data-end="147"><strong>Agent Skill企业级架构</strong></p>
<p><img alt="image" width="809" height="710" loading="lazy" src="https://img2024.cnblogs.com/blog/1122865/202603/1122865-20260326094320527-808816845.png" class="lazyload"></p>
<p data-start="57" data-end="147"><span style="color: rgba(255, 0, 0, 1)">RAG是动态知识路由,Agent Skill是动态技能路由,它们都是Prompt路由(Prompt Routing) 的不同落地形式。</span></p>
<h4><span style="font-size: 1em">User/Human Prompt(用户提示词)</span></h4>
<p>指用户以自然语言输入的内容,即人类提出的问题或请求。</p>
<h4>Assistant Prompt(助手提示词)</h4>
<p>AI之前的历史回答记录,LLM客户端与LLM的对话记忆。</p>
<h4>Context Prompt(上下文提示词)</h4>
<p>LLM没有记忆,豆包和DeepSeek某些情况能记住我们,是因为它们属于Chart智能体,而不是LLM。</p>
<p>短期记忆 = 对话历史,直接放在上下文。</p>
<p>长期记忆 = 存在外面,通过 RAG 检索后,再放进上下文</p>
<p>上下文 = 模型在这一轮能看到的所有信息</p>
<p>如果智能体需要支持多轮交互,记忆模块是提示用户体验的重要部</p>
<h4>Tool Prompt(工具提示词)</h4>
<p>工具说明书,告诉LLM有哪些工具可以用,需要生成哪些参数。</p>
<p>LLM生成json格式参数之后,Agent Core结合反射机制调用函数/类,传参执行。</p>
<h2>3.Chain(链)</h2>
<p>将多个步骤/调用串联成复杂流程,实现流水线式推理。</p>
<h2>5.Tools(工具)</h2>
<p>当前主流 LLM<span style="color: rgba(255, 0, 0, 1)">(如豆包、GPT-4o、Claude、通义千问、文心一言)均不支持<strong>直接</strong>调用工具</span></p>
<p>而Agent可通过Prompt向模型描述意图与可用工具,<span style="color: rgba(255, 0, 0, 1)">引导LLM根据人类语言输入,输出对应的目标工具名称和执行参数</span>,<span style="color: rgba(255, 0, 0, 1)">再由Agent Core根据LLM输出的工具名称和参数,间接调用执行工具<span style="color: rgba(0, 0, 0, 1)">,经过多轮思考+实践,最终</span></span>完成任务。</p>
<p>正是这关键的一步,使AI完成了从聊天工具到AI Agent(自助思考+使用工具)的<span style="color: rgba(255, 0, 0, 1)">跨越</span>。</p>
<div class="cnblogs_code">
<pre>LLM

Function Calling
{
"name":"query_pod_event",
"arguments":{"pod":"podA"}
}

Agent

MCP 调用

MCP Server

Kubernetes API</pre>
</div>
<h3>MCP</h3>
<p>在AI Agent<span style="color: rgba(255, 0, 0, 1)">规模化落地的</span>过程中,我们常常会遇到一个典型痛点:同<span style="color: rgba(255, 0, 0, 1)">一个业务工具</span>(如订单查询、数据库操作、第三方 API 调用等),在不同AI Agent、不同框架甚至不同大模型接入场景下,都需要<span style="color: rgba(255, 0, 0, 1)">重复编写工具描述、重新适配调用格式</span>。</p>
<p>这不仅带来大量冗余开发,也让工具管理分散混乱,严重阻碍了<span style="color: rgba(255, 0, 0, 1)">AI能力的标准化</span><span>与<span style="color: rgba(255, 0, 0, 1)">规模化复用</span></span>。</p>
<p><img alt="fe4373a2a6f36c165a2fd7ba76cd9348" width="642" height="393" loading="lazy" src="https://img2024.cnblogs.com/blog/1122865/202603/1122865-20260321201921098-866391999.png" class="lazyload"></p>
<div>MCP(Model Context Protocol) 正是为解决这一问题而设计的标准化协议,可以理解为一套AI Agent与外部工具交互的通用接口规范。</div>
<h2>6.Agent(智能体)</h2>
<p>根据任务自主决策调用 Chain 或 Tools。</p>
<h2>7.RAG(检索增强生成)</h2>
<p>LLM本身虽然具备强大的推理与文本/图片/视频生成能力,但其<span style="color: rgba(255, 0, 0, 1)">内置知识是静态的</span>,<span style="color: rgba(255, 0, 0, 1)">无法实时更新</span>,<span style="color: rgba(255, 0, 0, 1)">也无法直接使用企业或个人的私有、隐私数据</span>。</p>
<p><span style="color: rgba(255, 0, 0, 1)">通过持续微调大模型来更新知识,门槛和成本较高,</span>需要大量高性能显卡、充足算力资源,还必须依赖专业的算法工程师进行训练与调优,对大多数企业来说难以负担。</p>
<p>RAG能有效解决大模型的幻觉(胡编乱造)和知识滞后问题,让模型在不需重新训练的情况下,掌握私有或最新的知识。</p>
<div class="cnblogs_code"><img id="code_img_closed_1ab907f3-493d-4ab5-82af-8bfecfd205e6" class="code_img_closed lazyload" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_1ab907f3-493d-4ab5-82af-8bfecfd205e6" class="code_img_opened lazyload" style="display: none" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_1ab907f3-493d-4ab5-82af-8bfecfd205e6" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> os
</span><span style="color: rgba(0, 0, 255, 1)">from</span> langchain_openai <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> ChatOpenAI
</span><span style="color: rgba(0, 0, 255, 1)">from</span> langchain_community.document_loaders <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> TextLoader
</span><span style="color: rgba(0, 0, 255, 1)">from</span> langchain_text_splitters <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> RecursiveCharacterTextSplitter
</span><span style="color: rgba(0, 0, 255, 1)">from</span> langchain_community.vectorstores <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> Chroma
</span><span style="color: rgba(0, 0, 255, 1)">from</span> langchain_community.embeddings <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> HuggingFaceEmbeddings
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 加载</span>
loader = TextLoader(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">./ops_sop.txt</span><span style="color: rgba(128, 0, 0, 1)">"</span>, encoding=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
documents </span>=<span style="color: rgba(0, 0, 0, 1)"> loader.load()
splitter </span>=<span style="color: rgba(0, 0, 0, 1)"> RecursiveCharacterTextSplitter(
    chunk_size</span>=300,<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 每块300字符</span>
    chunk_overlap=50<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 重叠50字符</span>
<span style="color: rgba(0, 0, 0, 1)">)
texts </span>=<span style="color: rgba(0, 0, 0, 1)"> splitter.split_documents(documents)
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(f<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">切分后总共 {len(texts)} 个 chunk</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)


</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">LLM</span>
chat_model=<span style="color: rgba(0, 0, 0, 1)">ChatOpenAI(
    name</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gpt-4.1-mini</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    base_url</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://api.openai-proxy.org/v1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    api_key</span>=<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
    temperature</span>=0.5<span style="color: rgba(0, 0, 0, 1)">,
    max_tokens</span>=20<span style="color: rgba(0, 0, 0, 1)">,
)

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> Embedding模型</span>
embedding = HuggingFaceEmbeddings(model_name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BAAI/bge-small-zh</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
vectordb </span>=<span style="color: rgba(0, 0, 0, 1)"> Chroma.from_documents(
    documents</span>=<span style="color: rgba(0, 0, 0, 1)">texts,
    embedding</span>=<span style="color: rgba(0, 0, 0, 1)">embedding,
    persist_directory</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">./ops_sop</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
)
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">存储到向量数据库</span>
<span style="color: rgba(0, 0, 0, 1)">vectordb.persist()



</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">RAG</span>
<span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> blog_agent(query: str):
    docs </span>= vectordb.similarity_search(query, k=1<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\n\n---\n\n</span><span style="color: rgba(128, 0, 0, 1)">"</span>.join()


</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">RAG工作流</span>
<span style="color: rgba(0, 0, 255, 1)">def</span> ops_agent(key_word, top_k=1) -&gt;<span style="color: rgba(0, 0, 0, 1)"> str:
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">查询向量数据库:prompt----&gt;Embeding模型----&gt;向量----&gt;查询向量数据库---&gt;返回文档---&gt;LLM</span>
    retrieved_docs = vectordb.similarity_search(query=key_word, k=<span style="color: rgba(0, 0, 0, 1)">top_k)
    context </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\n\n</span><span style="color: rgba(128, 0, 0, 1)">"</span>.join()
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">提示词</span>
    prompt = f<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">你是运维专家,基于以下文档回答问题:\n{context}\n\n问题:{key_word}</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 调用 ChatOpenAI</span>
    response =<span style="color: rgba(0, 0, 0, 1)"> chat_model.invoke(prompt)
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> response.content

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 提问</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
    </span><span style="color: rgba(0, 0, 255, 1)">while</span><span style="color: rgba(0, 0, 0, 1)"> True:
      q </span>= input(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">我是运维专家,请输入你的问题:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
      </span><span style="color: rgba(0, 0, 255, 1)">print</span>(f<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">请参考:{ops_agent(q)}</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<span class="cnblogs_code_collapse">rag</span></div>
<p>不需要重新训练LLM,只需将最新的内部文档数据接入检索知识库,LLM即可基于检索到的真实、实时信息生成回答,既实现了知识更新,又保护了数据隐私,同时大幅降低LLM落地门槛和成本。</p>
<p><img alt="image" width="554" height="365" loading="lazy" src="https://img2024.cnblogs.com/blog/1122865/202603/1122865-20260321101203400-585445198.png" class="lazyload"></p>
<h3>RAG流程所需模型分类</h3>
<p>在大模型应用中,RAG(检索增强生成)是解决知识时效性、事实准确性的核心方案。</p>
<p><img alt="c2641636fbeace12ee150fbaa5943c15" width="599" height="350" loading="lazy" src="https://img2024.cnblogs.com/blog/1122865/202603/1122865-20260327201911526-867386595.png" class="lazyload"></p>
<div data-page-id="S3WmfxGwCdqUZuc9r75c8OKpnBd" data-lark-html-role="root" data-docx-has-block-data="false">
<div class=" old-record-id-GiacfR4lSdsbu2cWrYHcM3Y7nMg">
<div class=" old-record-id-GiacfR4lSdsbu2cWrYHcM3Y7nMg">支撑整个RAG流程的,正是5类核心模型。它们各司其职、环环相扣,从原始文本处理到最终答案生成,每一步都离不开特定模型的支撑。</div>
<table style="height: 217px; width: 1452px">
<thead>
<tr><th>阶段</th><th>核心模型</th><th>核心作用</th></tr>
</thead>
<tbody>
<tr>
<td>文本拆分(Chunking)</td>
<td>Chunk 模型</td>
<td>将长文档按语义或长度切分为小块,为后续向量化与检索做准备</td>
</tr>
<tr>
<td>向量化(Embedding)</td>
<td>Embedding 模型</td>
<td>把文本小块编码为向量,实现语义层面的相似性检索</td>
</tr>
<tr>
<td>候选精排(Rerank)</td>
<td>Rerank模型</td>
<td>对粗召回候选集逐对计算相关性分数,按分数重排序并过滤冗余噪声</td>
</tr>
<tr>
<td>内容精炼(可选)</td>
<td>提纯模型</td>
<td>提取关键信息或生成摘要,精简素材以提升后续处理效率</td>
</tr>
<tr>
<td>答案生成</td>
<td>LLM</td>
<td>整合高相关性素材,组织语言生成连贯、准确的最终回答</td>
</tr>
</tbody>
</table>
</div>
</div>
<h2>8.Graph RAG</h2>
<p data-start="97" data-end="262">传统 RAG(Retrieval-Augmented Generation)主要依赖<strong data-start="140" data-end="163">用户提示词与文本块之间的语义相似度匹配</strong>来完成知识检索。</p>
<p data-start="97" data-end="262">其核心流程是将文档切分为多个文本块(Chunk),通过向量化(Embedding)存入向量数据库,在用户提问时根据语义相似度检索相关文本,并将检索结果作为上下文提供给大模型生成回答。</p>
<p data-start="264" data-end="293">这种方式虽然能够有效补充大模型的知识,但仍然存在明显局限:</p>
<ul data-start="295" data-end="371">
<li data-section-id="1pt0isk" data-start="295" data-end="321">检索对象是<strong data-start="303" data-end="310">文本块</strong>,只具备语义相似关系;</li>
<li data-section-id="12c8qi7" data-start="322" data-end="344">无法表达<strong data-start="329" data-end="343">实体之间的结构化关系</strong>;</li>
<li data-section-id="xrd4fe" data-start="345" data-end="371">对复杂问题(尤其是涉及多步推理的问题)支持较弱。</li>
</ul>
<p data-start="373" data-end="436">Graph RAG在传统RAG流程的基础上,增加<strong data-start="217" data-end="225">知识图谱</strong>作为知识组织方式,将原本以文本块为单位的知识,进一步抽象为 <strong data-start="256" data-end="283">实体(Entity)与关系(Relation)</strong> 的结构化表示,从而构建语义网络。</p>
<p data-start="373" data-end="436">通过这种方式,<span style="color: rgba(255, 0, 0, 1)">系统不仅能够检索相关文本信息,还能够理解不同知识实体之间的关联关系</span>。</p>
<p data-start="373" data-end="436"><strong>小结</strong></p>
<p data-start="136" data-end="273">从系统架构角度来看,无论是向量数据库还是知识图谱,本质上都是为大模型提供<span style="color: rgba(255, 0, 0, 1)"><strong data-start="173" data-end="185">外部知识存储能力</strong>。</span></p>
<p data-start="136" data-end="273">由于大模型本身的知识主要固化在训练参数中,这些知识既难以实时更新,也无法存储企业私有数据。因此,在实际应用中,通常需要构建独立的知识存储体系,为模型提供可持续更新的知识来源。</p>
<p data-start="275" data-end="400">在AI Agent或知识问答系统中,这类外部<span style="color: rgba(255, 0, 0, 1)">知识存储通常被称为<strong data-start="308" data-end="334">长期记忆(Long-term Memory)</strong></span>。</p>
<p data-start="275" data-end="400">长期记忆用于保存系统在不同任务和时间周期中积累的知识,并在需要时通过检索机制提供给大模型使用,从而支持更复杂的任务处理和推理能力。</p>
<p data-start="402" data-end="423">目前,常见的长期记忆实现方式主要包括三类:</p>
<p data-section-id="bq5xr" data-start="425" data-end="438"><strong data-start="428" data-end="438">模型参数微调</strong></p>
<p data-start="440" data-end="491">通过微调大模型参数,将知识固化在模型内部。这种方式推理效率高,但更新成本较高,且不适合频繁变化的知识。</p>
<p data-section-id="1ckpkk5" data-start="493" data-end="504"><strong data-start="496" data-end="504">知识图谱</strong></p>
<p data-start="506" data-end="568">将知识以 <strong data-start="511" data-end="523">实体—关系—实体</strong> 的结构化形式进行存储,形成语义网络。知识图谱擅长表达实体之间的复杂关系,并支持多跳推理。</p>
<p data-section-id="f2d2nf" data-start="570" data-end="582"><strong data-start="573" data-end="582">向量数据库</strong></p>
<p data-start="584" data-end="657">将非结构化数据(如文档、代码、日志等)转化为向量表示,通过语义相似度检索实现知识获取。向量数据库适合处理大规模文本知识,但不具备复杂关系表达能力。</p>
<p data-start="659" data-end="692">在实际系统中,这三种方式通常结合使用,共同构建完整的知识记忆体系。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>参考</p><br><br>
来源:https://www.cnblogs.com/sss4/p/19737505
頁: [1]
查看完整版本: AIAgent开发-LangChain