<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>评测 on Khari Z's LogBook</title><link>https://n571e.github.io/tags/%E8%AF%84%E6%B5%8B/</link><description>Recent content in 评测 on Khari Z's LogBook</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 02 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://n571e.github.io/tags/%E8%AF%84%E6%B5%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>大模型应用这一层：从评测、RAG 到 Agent</title><link>https://n571e.github.io/p/happy-llm-llm-applications-rag-agent/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://n571e.github.io/p/happy-llm-llm-applications-rag-agent/</guid><description>&lt;img src="https://n571e.github.io/" alt="Featured image of post 大模型应用这一层：从评测、RAG 到 Agent" /&gt;&lt;p&gt;第七章的主题很集中：大模型进入应用场景后，先要评估能力边界，再接入外部知识，最后才谈工具调用和任务执行。&lt;/p&gt;&#10;&lt;p&gt;这一章可以按三个模块复习：评测、RAG 和 Agent。评测判断模型在哪些任务上可靠；RAG 把外部文档接入生成过程；Agent 让模型通过工具参与行动。&lt;/p&gt;&#10;&lt;p&gt;整章可以整理成下面这条应用链路：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;评测 Evaluation&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 判断模型在哪些任务上可靠，边界在哪里&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAG Retrieval-Augmented Generation&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 把外部文档和实时知识接入生成过程&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Agent&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 让模型通过工具调用参与更复杂的任务流&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这一章可以先按三层记：能力边界、知识接入、工具行动。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一先从评测开始不要只问模型强不强"&gt;&lt;a href="#%e4%b8%80%e5%85%88%e4%bb%8e%e8%af%84%e6%b5%8b%e5%bc%80%e5%a7%8b%e4%b8%8d%e8%a6%81%e5%8f%aa%e9%97%ae%e6%a8%a1%e5%9e%8b%e5%bc%ba%e4%b8%8d%e5%bc%ba" class="header-anchor"&gt;&lt;/a&gt;一、先从评测开始：不要只问模型强不强&#10;&lt;/h2&gt;&lt;p&gt;进入应用层后，最容易犯的错误是把模型能力说得太笼统：一个模型在榜单上分数高，不代表它能胜任所有场景。&lt;/p&gt;&#10;&lt;p&gt;做应用时，要把“强不强”拆成具体能力问题：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;它是否懂通用知识&lt;/li&gt;&#10;&lt;li&gt;它数学推理是否稳定&lt;/li&gt;&#10;&lt;li&gt;它能不能处理长文本&lt;/li&gt;&#10;&lt;li&gt;它多语言能力怎样&lt;/li&gt;&#10;&lt;li&gt;它是否会正确使用工具&lt;/li&gt;&#10;&lt;li&gt;它在金融、法律、医疗等垂直领域是否可靠&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;所以第七章把评测集按能力拆开看，比如 &lt;code&gt;MMLU&lt;/code&gt; 偏通用多任务理解，&lt;code&gt;GSM8K/MATH&lt;/code&gt; 偏数学推理，&lt;code&gt;ARC/GPQA/HellaSwag&lt;/code&gt; 偏推理和常识，&lt;code&gt;InfiniteBench/Multi-needle&lt;/code&gt; 偏长文本，&lt;code&gt;MGSM&lt;/code&gt; 偏多语言数学。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;评测是在给应用选择画边界。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;比如我要做知识问答系统，就不能只看聊天榜单，还要看事实性、长文档理解和检索后回答是否忠实。我要做工具型助手，就不能只看语言流畅度，还要关心工具调用正确率、参数是否填对、失败时能不能恢复。&lt;/p&gt;&#10;&lt;p&gt;复习锚点：评测不是为了得到一个总分，而是为了判断模型适合放进哪个场景，以及哪些能力不能靠感觉判断。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="二rag把模型从只靠参数记忆拉回到外部知识"&gt;&lt;a href="#%e4%ba%8crag%e6%8a%8a%e6%a8%a1%e5%9e%8b%e4%bb%8e%e5%8f%aa%e9%9d%a0%e5%8f%82%e6%95%b0%e8%ae%b0%e5%bf%86%e6%8b%89%e5%9b%9e%e5%88%b0%e5%a4%96%e9%83%a8%e7%9f%a5%e8%af%86" class="header-anchor"&gt;&lt;/a&gt;二、RAG：把模型从“只靠参数记忆”拉回到外部知识&#10;&lt;/h2&gt;&lt;p&gt;第七章第二部分进入 RAG。这里的背景很直接：LLM 虽然会生成，但它有几个天然问题：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;训练数据可能过时&lt;/li&gt;&#10;&lt;li&gt;专业领域知识不一定充分&lt;/li&gt;&#10;&lt;li&gt;输出可能产生幻觉&lt;/li&gt;&#10;&lt;li&gt;很难直接给出可追溯依据&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;RAG 的思路很直接：生成之前先检索。用户提出问题后，系统先从文档库里找相关片段，再把这些片段作为上下文交给模型，让模型基于外部材料回答。&lt;/p&gt;&#10;&lt;p&gt;RAG 的主链路可以写成：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;文档 -&amp;gt; 切分 -&amp;gt; 向量化 -&amp;gt; 向量库&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户问题 -&amp;gt; 向量化 -&amp;gt; 相似度检索 -&amp;gt; 上下文拼接 -&amp;gt; LLM 生成回答&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;RAG 把知识系统拆成两个部分：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;模型负责理解问题、组织语言和生成答案&lt;/li&gt;&#10;&lt;li&gt;检索系统负责把当前问题最需要的外部证据找出来&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;两者配合以后，应用可以把最新资料、私有文档、领域手册接到生成链路里，减轻对模型参数记忆的依赖。&lt;/p&gt;&#10;&lt;div align="center"&gt;&#10; &lt;img src="https://raw.githubusercontent.com/datawhalechina/happy-llm/main/docs/images/7-images/7-2-rag.png" alt="RAG 流程图" width="90%" /&gt;&#10; &lt;p&gt;图：RAG 先检索相关上下文，再让模型基于上下文生成回答&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="三tiny-rag最小实现里要盯住的几个模块"&gt;&lt;a href="#%e4%b8%89tiny-rag%e6%9c%80%e5%b0%8f%e5%ae%9e%e7%8e%b0%e9%87%8c%e8%a6%81%e7%9b%af%e4%bd%8f%e7%9a%84%e5%87%a0%e4%b8%aa%e6%a8%a1%e5%9d%97" class="header-anchor"&gt;&lt;/a&gt;三、Tiny-RAG：最小实现里要盯住的几个模块&#10;&lt;/h2&gt;&lt;p&gt;第七章还写了一个 Tiny-RAG。这个实现很适合学习，因为它把 RAG 系统拆成了几个足够小的部件：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;文档加载与切分：&lt;code&gt;ReadFiles&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;向量化：&lt;code&gt;BaseEmbeddings&lt;/code&gt; / &lt;code&gt;OpenAIEmbedding&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;向量存储与检索：&lt;code&gt;VectorStore&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;生成模型封装：&lt;code&gt;OpenAIChat&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;演示入口：&lt;code&gt;demo.py&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div align="center"&gt;&#10; &lt;img src="https://raw.githubusercontent.com/datawhalechina/happy-llm/main/docs/images/7-images/7-2-tinyrag.png" alt="TinyRAG 项目结构" width="90%" /&gt;&#10; &lt;p&gt;图：Tiny-RAG 把 RAG 拆成文档、向量、检索和模型回答几个最小模块&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="31-文档切分决定证据粒度"&gt;&lt;a href="#31-%e6%96%87%e6%a1%a3%e5%88%87%e5%88%86%e5%86%b3%e5%ae%9a%e8%af%81%e6%8d%ae%e7%b2%92%e5%ba%a6" class="header-anchor"&gt;&lt;/a&gt;3.1 文档切分决定证据粒度&#10;&lt;/h3&gt;&lt;p&gt;文档加载部分支持 &lt;code&gt;pdf/md/txt&lt;/code&gt;，读出来之后会按 token 长度切成 chunk。这里要记两个参数：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;max_token_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cover_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;code&gt;max_token_len&lt;/code&gt; 控制每个片段不要太长，&lt;code&gt;cover_content&lt;/code&gt; 则给相邻片段保留重叠内容。这个重叠很重要，因为很多语义边界不会刚好落在切分点上。如果完全硬切，检索时很容易丢掉上下文。&lt;/p&gt;&#10;&lt;p&gt;所以 chunk 策略本质上是在做取舍：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;chunk 太短，语义不完整&lt;/li&gt;&#10;&lt;li&gt;chunk 太长，检索不精确，而且占上下文&lt;/li&gt;&#10;&lt;li&gt;重叠太少，边界信息容易断&lt;/li&gt;&#10;&lt;li&gt;重叠太多，索引膨胀，成本增加&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;复习锚点：chunk 策略表面上是数据预处理，实际是在决定模型后面能看到什么证据。&lt;/p&gt;&#10;&lt;h3 id="32-向量化层要抽象出来"&gt;&lt;a href="#32-%e5%90%91%e9%87%8f%e5%8c%96%e5%b1%82%e8%a6%81%e6%8a%bd%e8%b1%a1%e5%87%ba%e6%9d%a5" class="header-anchor"&gt;&lt;/a&gt;3.2 向量化层要抽象出来&#10;&lt;/h3&gt;&lt;p&gt;第七章先定义 &lt;code&gt;BaseEmbeddings&lt;/code&gt;，再写 &lt;code&gt;OpenAIEmbedding&lt;/code&gt;。这个设计很朴素，但教学价值很清楚：embedding 模型应该作为可替换模块接入 RAG。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BaseEmbeddings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;NotImplementedError&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@classmethod&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这里的重点在于接口抽象：embedding 模型被包装成了可替换模块。以后如果从 API embedding 换成本地 embedding，RAG 主流程不用大改，只要新的类实现 &lt;code&gt;get_embedding&lt;/code&gt; 就行。&lt;/p&gt;&#10;&lt;p&gt;复习锚点：RAG 里的模型不止最终生成回答的 LLM，还有负责把文本映射到向量空间的 embedding 模型。embedding 质量不好，LLM 再强也可能拿不到正确上下文。&lt;/p&gt;&#10;&lt;h3 id="33-向量库的最小检索逻辑就是相似度排序"&gt;&lt;a href="#33-%e5%90%91%e9%87%8f%e5%ba%93%e7%9a%84%e6%9c%80%e5%b0%8f%e6%a3%80%e7%b4%a2%e9%80%bb%e8%be%91%e5%b0%b1%e6%98%af%e7%9b%b8%e4%bc%bc%e5%ba%a6%e6%8e%92%e5%ba%8f" class="header-anchor"&gt;&lt;/a&gt;3.3 向量库的最小检索逻辑就是相似度排序&#10;&lt;/h3&gt;&lt;p&gt;Tiny-RAG 的 &lt;code&gt;VectorStore&lt;/code&gt; 很轻量：把文档片段和向量保存下来，查询时计算问题向量和每个文档向量的相似度，然后取 Top-k。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EmbeddingModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;query_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmbeddingModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vectors&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argsort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:][::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这个版本属于教学级向量数据库，它把最基本的动作讲明白了：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;问题也要向量化&lt;/li&gt;&#10;&lt;li&gt;问题向量和文档向量进入同一个空间比较&lt;/li&gt;&#10;&lt;li&gt;相似度最高的片段被取出来作为上下文&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;后续做项目时，可以把这里替换成 FAISS、Milvus、Qdrant、Chroma 之类的向量库，也可以补 reranker。但无论外壳怎么换，目标都还是“找到和问题最相关的上下文”。&lt;/p&gt;&#10;&lt;h3 id="34-rag-prompt-要约束模型只基于上下文回答"&gt;&lt;a href="#34-rag-prompt-%e8%a6%81%e7%ba%a6%e6%9d%9f%e6%a8%a1%e5%9e%8b%e5%8f%aa%e5%9f%ba%e4%ba%8e%e4%b8%8a%e4%b8%8b%e6%96%87%e5%9b%9e%e7%ad%94" class="header-anchor"&gt;&lt;/a&gt;3.4 RAG prompt 要约束模型只基于上下文回答&#10;&lt;/h3&gt;&lt;p&gt;最后，&lt;code&gt;OpenAIChat&lt;/code&gt; 会把检索到的内容放进一个 RAG 专用 prompt。这个 prompt 要明确告诉模型：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;使用给定上下文回答&lt;/li&gt;&#10;&lt;li&gt;不知道就说不知道&lt;/li&gt;&#10;&lt;li&gt;上下文不足时不要编&lt;/li&gt;&#10;&lt;li&gt;用中文回答&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这个 prompt 给模型增加“证据约束”：答案应建立在可追溯材料上。RAG 做得好不好，要回到评测中看事实一致性、引用准确性和答案忠实性。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="四rag-的学习收获系统质量不只取决于-llm"&gt;&lt;a href="#%e5%9b%9brag-%e7%9a%84%e5%ad%a6%e4%b9%a0%e6%94%b6%e8%8e%b7%e7%b3%bb%e7%bb%9f%e8%b4%a8%e9%87%8f%e4%b8%8d%e5%8f%aa%e5%8f%96%e5%86%b3%e4%ba%8e-llm" class="header-anchor"&gt;&lt;/a&gt;四、RAG 的学习收获：系统质量不只取决于 LLM&#10;&lt;/h2&gt;&lt;p&gt;RAG 系统的质量，很大一部分取决于生成模型之外的环节。&lt;/p&gt;&#10;&lt;p&gt;如果答案错了，可能原因很多：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;原始文档质量不好&lt;/li&gt;&#10;&lt;li&gt;切分粒度不合适&lt;/li&gt;&#10;&lt;li&gt;embedding 模型不匹配&lt;/li&gt;&#10;&lt;li&gt;Top-k 召回错了&lt;/li&gt;&#10;&lt;li&gt;prompt 没有限制模型&lt;/li&gt;&#10;&lt;li&gt;模型没有正确使用上下文&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这和直接问 LLM 很不一样。直接问模型时，问题通常被归因到“模型会不会”。但到了 RAG，系统多了检索层、索引层、上下文构造层，错误也会分散到更多地方。&lt;/p&gt;&#10;&lt;p&gt;所以看 RAG 系统时，不要只问“接了什么大模型”，还要问：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;文档怎么切&lt;/li&gt;&#10;&lt;li&gt;向量怎么建&lt;/li&gt;&#10;&lt;li&gt;检索怎么排&lt;/li&gt;&#10;&lt;li&gt;上下文怎么塞&lt;/li&gt;&#10;&lt;li&gt;回答怎么评&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;这几个问题答清楚，才算开始理解 RAG 的系统质量。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="五agent从会回答走向会调用工具"&gt;&lt;a href="#%e4%ba%94agent%e4%bb%8e%e4%bc%9a%e5%9b%9e%e7%ad%94%e8%b5%b0%e5%90%91%e4%bc%9a%e8%b0%83%e7%94%a8%e5%b7%a5%e5%85%b7" class="header-anchor"&gt;&lt;/a&gt;五、Agent：从“会回答”走向“会调用工具”&#10;&lt;/h2&gt;&lt;p&gt;第七章最后讲 Agent。它先给了一个比较完整的定义：LLM Agent 以 LLM 为中心，结合目标理解、规划、记忆、工具使用、反思迭代等能力，去完成更复杂的任务。&lt;/p&gt;&#10;&lt;p&gt;Agent 可以整理成一句话：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Agent 是把 LLM 放进一个可行动的任务系统里。&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;普通聊天模型的输出主要是文字。Agent 的变化在于，模型可以在合适的时候选择工具，比如查时间、搜索百科、查询天气、做计算，然后把工具结果继续放回对话，让模型生成最终回答。&lt;/p&gt;&#10;&lt;p&gt;Agent 改变了 LLM 的角色：模型不只是生成文本，还参与调度工具。它需要承担这些职责：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;判断用户到底要什么&lt;/li&gt;&#10;&lt;li&gt;判断是否需要外部工具&lt;/li&gt;&#10;&lt;li&gt;选择正确工具&lt;/li&gt;&#10;&lt;li&gt;填好工具参数&lt;/li&gt;&#10;&lt;li&gt;读取工具返回结果&lt;/li&gt;&#10;&lt;li&gt;继续生成自然语言回复&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;第七章也把 Agent 粗略分成任务导向型、规划推理型、多 Agent 系统、探索学习型几类。当前复习可以先抓任务导向型，因为 Tiny-Agent 主要演示的就是这条最小链路。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="六tiny-agenttool-calling-的最小闭环"&gt;&lt;a href="#%e5%85%adtiny-agenttool-calling-%e7%9a%84%e6%9c%80%e5%b0%8f%e9%97%ad%e7%8e%af" class="header-anchor"&gt;&lt;/a&gt;六、Tiny-Agent：tool calling 的最小闭环&#10;&lt;/h2&gt;&lt;p&gt;Tiny-Agent 的实现围绕 OpenAI 兼容接口里的 &lt;code&gt;tool_calls&lt;/code&gt; 展开。它有三个部件：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;工具函数&lt;/li&gt;&#10;&lt;li&gt;工具 schema 转换&lt;/li&gt;&#10;&lt;li&gt;Agent 对话与工具调用循环&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;工具函数本身很普通，比如获取时间、搜索 Wikipedia、查询天气。但在 Agent 里，普通函数要变成模型可理解的工具，就必须有清晰的函数名、参数类型和 docstring。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_current_datetime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; 获取真实的当前日期和时间。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;接着，&lt;code&gt;function_to_json&lt;/code&gt; 会读取函数签名，把它转换成 tool schema：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;function_to_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;function&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;function&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__doc__&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;模型看到的是结构化 schema。工具描述不清楚、参数设计不合理，模型就更容易选错工具或填错参数。&lt;/p&gt;&#10;&lt;div align="center"&gt;&#10; &lt;img src="https://raw.githubusercontent.com/datawhalechina/happy-llm/main/docs/images/7-images/7-3-Tiny_Agent.jpg" alt="Tiny-Agent 工具调用流程" width="88%" /&gt;&#10; &lt;p&gt;图：Tiny-Agent 的流程是模型提出工具调用，程序执行工具，再把结果交回模型&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="61-agent-类负责维护调用循环"&gt;&lt;a href="#61-agent-%e7%b1%bb%e8%b4%9f%e8%b4%a3%e7%bb%b4%e6%8a%a4%e8%b0%83%e7%94%a8%e5%be%aa%e7%8e%af" class="header-anchor"&gt;&lt;/a&gt;6.1 Agent 类负责维护调用循环&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Agent.get_completion&lt;/code&gt; 的流程可以简化成这样：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;span class="lnt"&gt;9&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户输入&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 追加到 messages&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 调用模型并传入 tools&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 如果模型返回 tool_calls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 执行对应工具&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 把工具结果追加为 tool message&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 再调用模型&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 保存 assistant 回复&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 返回最终答案&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这个循环说明了 tool calling 的边界：模型输出结构化调用请求，外层程序执行工具，工具结果再回到模型上下文中。&lt;/p&gt;&#10;&lt;p&gt;所以 Agent 的可靠性同时取决于模型和外层控制逻辑：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;工具是否有白名单&lt;/li&gt;&#10;&lt;li&gt;参数是否校验&lt;/li&gt;&#10;&lt;li&gt;调用失败怎么恢复&lt;/li&gt;&#10;&lt;li&gt;工具返回是否可信&lt;/li&gt;&#10;&lt;li&gt;历史消息是否会越积越乱&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这些问题在纯聊天模型里不太显眼，但一旦模型开始调用工具，就必须认真处理。&lt;/p&gt;&#10;&lt;h3 id="62-tiny-agent-很适合作为-agent-入门"&gt;&lt;a href="#62-tiny-agent-%e5%be%88%e9%80%82%e5%90%88%e4%bd%9c%e4%b8%ba-agent-%e5%85%a5%e9%97%a8" class="header-anchor"&gt;&lt;/a&gt;6.2 Tiny-Agent 很适合作为 Agent 入门&#10;&lt;/h3&gt;&lt;p&gt;第七章前面介绍了规划、记忆、反思等能力，但配套 Tiny-Agent 主要还是一个 tool calling demo。它有工具、有消息历史、有二次模型调用，但还没有实现复杂规划、长期记忆或反思循环。&lt;/p&gt;&#10;&lt;p&gt;作为学习入口，它很合适，因为它先把基础接口关系讲清楚了：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;工具如何暴露给模型&lt;/li&gt;&#10;&lt;li&gt;模型如何提出工具调用&lt;/li&gt;&#10;&lt;li&gt;程序如何执行工具&lt;/li&gt;&#10;&lt;li&gt;工具结果如何回到模型上下文&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;等这一层明白之后，再看 ReAct、多 Agent、长期记忆、任务规划，才不会只停在概念名词上。&lt;/p&gt;&#10;&lt;p&gt;工程边界也要记住：Tiny-Agent 中用 &lt;code&gt;eval(...)&lt;/code&gt; 执行工具调用，适合教学演示；真实系统应该换成更安全的白名单分发。模型一旦能触发工具，权限和安全边界就必须认真处理。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="七这一章留给我的应用层框架"&gt;&lt;a href="#%e4%b8%83%e8%bf%99%e4%b8%80%e7%ab%a0%e7%95%99%e7%bb%99%e6%88%91%e7%9a%84%e5%ba%94%e7%94%a8%e5%b1%82%e6%a1%86%e6%9e%b6" class="header-anchor"&gt;&lt;/a&gt;七、这一章留给我的应用层框架&#10;&lt;/h2&gt;&lt;p&gt;这一章最适合留下一个应用层框架：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;评测&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 明确模型能力边界&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAG&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 接入外部知识与可追溯证据&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Agent&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 接入工具和任务执行过程&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这里有三个复习结论：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;评测要看具体任务边界&lt;br&gt;&#10;榜单分数只能提供参考，应用还要关心场景、数据、语言、工具和安全边界。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;RAG 要把知识放到可更新的位置&lt;br&gt;&#10;外部文档、向量索引和检索结果共同决定模型能看到哪些依据。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Agent 要把工具调用纳入控制流程&lt;br&gt;&#10;Agent 让模型不仅能回答，还能通过工具查询、计算、搜索和执行任务。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;第七章适合作为应用入口。Tiny-RAG 和 Tiny-Agent 给出了最小可运行骨架，帮助先看清系统边界。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="八写在最后应用层要把不可靠变得可控"&gt;&lt;a href="#%e5%85%ab%e5%86%99%e5%9c%a8%e6%9c%80%e5%90%8e%e5%ba%94%e7%94%a8%e5%b1%82%e8%a6%81%e6%8a%8a%e4%b8%8d%e5%8f%af%e9%9d%a0%e5%8f%98%e5%be%97%e5%8f%af%e6%8e%a7" class="header-anchor"&gt;&lt;/a&gt;八、写在最后：应用层要把不可靠变得可控&#10;&lt;/h2&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;大模型应用不能只盯着模型本身，还要补上评测、检索、工具、日志和控制边界。&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;评测告诉我模型哪里能用，RAG 让回答尽量有依据，Agent 让模型可以接入行动接口。目标很实际：让模型在真实场景里更可控。&lt;/p&gt;&#10;&lt;p&gt;如果只保留这一章的学习结论，可以记住三句话：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;评测负责应用边界。&lt;/li&gt;&#10;&lt;li&gt;RAG 负责外部知识接口。&lt;/li&gt;&#10;&lt;li&gt;Agent 负责工具调度。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;复习应用层时，关注点要落到三件事：系统怎样设计、怎样观测、怎样迭代。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/datawhalechina/happy-llm/blob/main/docs/chapter7/%E7%AC%AC%E4%B8%83%E7%AB%A0%20%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%BA%94%E7%94%A8.md" target="_blank" rel="noopener"&#10; &gt;Datawhale. Happy-LLM：第七章《大模型应用》&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/datawhalechina/happy-llm" target="_blank" rel="noopener"&#10; &gt;Datawhale Happy-LLM 仓库&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://arxiv.org/pdf/2312.10997.pdf" target="_blank" rel="noopener"&#10; &gt;Retrieval-Augmented Generation for Large Language Models: A Survey&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>