<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/zh/feed.xml" rel="self" type="application/atom+xml" /><link href="/zh/" rel="alternate" type="text/html" /><updated>2026-03-30T12:43:25+00:00</updated><id>/zh/feed.xml</id><title type="html">蕾娜的叙述</title><author><name>Lenna Hammer</name></author><entry><title type="html">大语言模型1 基本用法</title><link href="/zh/2026/03/16/%E5%A4%A7%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B1-%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95.html" rel="alternate" type="text/html" title="大语言模型1 基本用法" /><published>2026-03-16T00:00:00+00:00</published><updated>2026-03-16T00:00:00+00:00</updated><id>/zh/2026/03/16/%E5%A4%A7%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B1-%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95</id><content type="html" xml:base="/zh/2026/03/16/%E5%A4%A7%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B1-%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95.html"><![CDATA[<p>相关工具和库： langchain, huggingface, ollama, llama-index<br />
模型： chatgpt, deepseek-chat, qwen, embedding bge-m3</p>

<h2 id="调用大语言模型">调用大语言模型</h2>

<p>注意 api key 不能放到 github 上，可以用环境变量传入。<br />
macos 上本地模型有针对 apple m 芯片优化。</p>

<h3 id="使用命令行">使用命令行</h3>

<p><del>ollama 可以给予命令后使用</del> <br />
<del>openai api 可以用curl调用</del></p>

<p>命令行调用 ollama</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ollama run qwen2.5:3b <span class="s2">"hello"</span>

<span class="nb">echo</span> <span class="s2">"hello"</span> | ollama run qwen2.5:3b
</code></pre></div></div>

<p>命令使用 curl 也可以，这样方便切到 chatgpt</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl https://api.openai.com/v1/chat/completions <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Authorization: Bearer 你的OPENAI_API_KEY"</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s1">'{
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "你好，介绍一下自己"}]
  }'</span>
</code></pre></div></div>

<h3 id="使用-openai-api">使用 OpenAI API</h3>

<p>调用 ollama</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>

<span class="c1"># 初始化客户端
</span><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">(</span>
    <span class="n">base_url</span><span class="o">=</span><span class="s">"http://localhost:11434/v1"</span><span class="p">,</span> <span class="c1"># 用的默认端口号
</span>    <span class="n">api_key</span><span class="o">=</span><span class="s">"ollama"</span>  <span class="c1"># API key 可以是任意值
</span><span class="p">)</span>

<span class="c1"># 调用模型
</span><span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">chat</span><span class="p">.</span><span class="n">completions</span><span class="p">.</span><span class="n">create</span><span class="p">(</span>
    <span class="n">model</span><span class="o">=</span><span class="s">"qwen2.5:3b"</span><span class="p">,</span>
    <span class="n">messages</span><span class="o">=</span><span class="p">[</span>
        <span class="p">{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"system"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="s">"你是一个有帮助的助手"</span><span class="p">},</span>
        <span class="p">{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"user"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="s">"请解释什么是大语言模型"</span><span class="p">}</span>
    <span class="p">]</span>
<span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">choices</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">message</span><span class="p">.</span><span class="n">content</span><span class="p">)</span>
</code></pre></div></div>

<p>调用 deepseek api</p>

<p>.env 文件</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>DEEPSEEK_API_KEY=...
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!pip3 install openai
</span><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
<span class="kn">from</span> <span class="nn">dotenv</span> <span class="kn">import</span> <span class="n">load_dotenv</span>
<span class="n">load_dotenv</span><span class="p">()</span>


<span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">(</span>
    <span class="n">api_key</span><span class="o">=</span><span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">[</span><span class="s">'DEEPSEEK_API_KEY'</span><span class="p">],</span>
    <span class="n">base_url</span><span class="o">=</span><span class="s">"https://api.deepseek.com"</span><span class="p">)</span>

<span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">chat</span><span class="p">.</span><span class="n">completions</span><span class="p">.</span><span class="n">create</span><span class="p">(</span>
    <span class="n">model</span><span class="o">=</span><span class="s">"deepseek-chat"</span><span class="p">,</span>
    <span class="n">messages</span><span class="o">=</span><span class="p">[</span>
        <span class="p">{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"system"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="s">"You are a helpful assistant"</span><span class="p">},</span>
        <span class="p">{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"user"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="s">"Hello"</span><span class="p">},</span>
    <span class="p">],</span>
    <span class="n">stream</span><span class="o">=</span><span class="bp">False</span>
<span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">choices</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">message</span><span class="p">.</span><span class="n">content</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="简单扩展">简单扩展</h2>

<h3 id="多轮对话">多轮对话</h3>

<p>多轮对话需要手动保持对话历史。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
</code></pre></div></div>

<h3 id="流式返回">流式返回</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
</code></pre></div></div>

<h3 id="调用工具">调用工具</h3>

<p>常用的工具，比如 联网搜索，计算器，维基百科。</p>
<ul>
  <li>计算器可以用 numexpr 或者 sympy （支持符号计算）</li>
</ul>

<p>使用 OpenAI API</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">openai</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span>
<span class="kn">from</span> <span class="nn">dotenv</span> <span class="kn">import</span> <span class="n">load_dotenv</span>
<span class="n">load_dotenv</span><span class="p">()</span>
<span class="c1"># -------------------------- 配置部分 --------------------------
# 替换为你的 DeepSeek API Key
</span><span class="n">DEEPSEEK_API_KEY</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">[</span><span class="s">'DEEPSEEK_API_KEY'</span><span class="p">]</span>
<span class="c1"># DeepSeek API 基础地址
</span><span class="n">DEEPSEEK_BASE_URL</span> <span class="o">=</span> <span class="s">"https://api.deepseek.com/v1"</span>
<span class="c1"># 要使用的模型名称
</span><span class="n">MODEL_NAME</span> <span class="o">=</span> <span class="s">"deepseek-chat"</span>

<span class="c1"># -------------------------- 初始化客户端 --------------------------
</span><span class="n">client</span> <span class="o">=</span> <span class="n">openai</span><span class="p">.</span><span class="n">OpenAI</span><span class="p">(</span>
    <span class="n">api_key</span><span class="o">=</span><span class="n">DEEPSEEK_API_KEY</span><span class="p">,</span>
    <span class="n">base_url</span><span class="o">=</span><span class="n">DEEPSEEK_BASE_URL</span>
<span class="p">)</span>

<span class="c1"># -------------------------- 工具定义 --------------------------
# 定义计算器工具
</span><span class="k">def</span> <span class="nf">calculator_tool</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">re</span><span class="p">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s">'^[\d\+\-\*\/\(\)\.\s]+$'</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
            <span class="k">return</span> <span class="sa">f</span><span class="s">"无效的表达式：仅支持数字和 +-*/() 运算符，输入内容：</span><span class="si">{</span><span class="n">expression</span><span class="si">}</span><span class="s">"</span>
        <span class="n">result</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="p">{</span><span class="s">"__builtins__"</span><span class="p">:</span> <span class="bp">None</span><span class="p">},</span> <span class="p">{})</span>
        <span class="k">return</span> <span class="sa">f</span><span class="s">"计算结果：</span><span class="si">{</span><span class="n">expression</span><span class="si">}</span><span class="s"> = </span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s">"</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">return</span> <span class="sa">f</span><span class="s">"计算失败：</span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s">，表达式：</span><span class="si">{</span><span class="n">expression</span><span class="si">}</span><span class="s">"</span>

<span class="c1"># 定义工具列表（可扩展更多工具）
</span><span class="n">tools</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span>
        <span class="s">"type"</span><span class="p">:</span> <span class="s">"function"</span><span class="p">,</span>
        <span class="s">"function"</span><span class="p">:</span> <span class="p">{</span>
            <span class="s">"name"</span><span class="p">:</span> <span class="s">"calculator_tool"</span><span class="p">,</span>
            <span class="s">"description"</span><span class="p">:</span> <span class="s">"用于执行数学计算的工具，支持加减乘除和括号运算"</span><span class="p">,</span>
            <span class="s">"parameters"</span><span class="p">:</span> <span class="p">{</span>
                <span class="s">"type"</span><span class="p">:</span> <span class="s">"object"</span><span class="p">,</span>
                <span class="s">"properties"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="s">"expression"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="s">"type"</span><span class="p">:</span> <span class="s">"string"</span><span class="p">,</span>
                        <span class="s">"description"</span><span class="p">:</span> <span class="s">"需要计算的数学表达式，例如 '100+200*3' 或 '(50-20)/5'"</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="s">"required"</span><span class="p">:</span> <span class="p">[</span><span class="s">"expression"</span><span class="p">],</span>
                <span class="s">"additionalProperties"</span><span class="p">:</span> <span class="bp">False</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">]</span>

<span class="c1"># 工具映射：将工具名称映射到实际函数
</span><span class="n">tool_functions</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">"calculator_tool"</span><span class="p">:</span> <span class="n">calculator_tool</span>
<span class="p">}</span>

<span class="c1"># -------------------------- 核心对话函数 --------------------------
</span><span class="k">def</span> <span class="nf">chat_with_tools</span><span class="p">(</span><span class="n">user_message</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
    <span class="s">"""
    与 DeepSeek 模型对话，并自动调用工具
    :param user_message: 用户输入
    :return: 最终回复
    """</span>
    <span class="c1"># 1. 发送用户消息，请求模型判断是否需要调用工具
</span>    <span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">chat</span><span class="p">.</span><span class="n">completions</span><span class="p">.</span><span class="n">create</span><span class="p">(</span>
        <span class="n">model</span><span class="o">=</span><span class="n">MODEL_NAME</span><span class="p">,</span>
        <span class="n">messages</span><span class="o">=</span><span class="p">[{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"user"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="n">user_message</span><span class="p">}],</span>
        <span class="n">tools</span><span class="o">=</span><span class="n">tools</span><span class="p">,</span>
        <span class="n">tool_choice</span><span class="o">=</span><span class="s">"auto"</span><span class="p">,</span>  <span class="c1"># 让模型自动决定是否调用工具
</span>        <span class="n">temperature</span><span class="o">=</span><span class="mf">0.1</span>      <span class="c1"># 降低随机性，保证工具调用的准确性
</span>    <span class="p">)</span>

    <span class="n">assistant_message</span> <span class="o">=</span> <span class="n">response</span><span class="p">.</span><span class="n">choices</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">message</span>
    <span class="n">final_response</span> <span class="o">=</span> <span class="s">""</span>

    <span class="c1"># 2. 检查模型是否要求调用工具
</span>    <span class="k">if</span> <span class="n">assistant_message</span><span class="p">.</span><span class="n">tool_calls</span><span class="p">:</span>
        <span class="c1"># 收集工具调用结果
</span>        <span class="n">tool_results</span> <span class="o">=</span> <span class="p">[]</span>
        
        <span class="c1"># 遍历所有工具调用请求
</span>        <span class="k">for</span> <span class="n">tool_call</span> <span class="ow">in</span> <span class="n">assistant_message</span><span class="p">.</span><span class="n">tool_calls</span><span class="p">:</span>
            <span class="n">tool_name</span> <span class="o">=</span> <span class="n">tool_call</span><span class="p">.</span><span class="n">function</span><span class="p">.</span><span class="n">name</span>
            <span class="n">tool_args</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="n">loads</span><span class="p">(</span><span class="n">tool_call</span><span class="p">.</span><span class="n">function</span><span class="p">.</span><span class="n">arguments</span><span class="p">)</span>
            
            <span class="c1"># 执行工具调用
</span>            <span class="k">if</span> <span class="n">tool_name</span> <span class="ow">in</span> <span class="n">tool_functions</span><span class="p">:</span>
                <span class="n">tool_result</span> <span class="o">=</span> <span class="n">tool_functions</span><span class="p">[</span><span class="n">tool_name</span><span class="p">](</span><span class="o">**</span><span class="n">tool_args</span><span class="p">)</span>
                <span class="n">tool_results</span><span class="p">.</span><span class="n">append</span><span class="p">({</span>
                    <span class="s">"tool_call_id"</span><span class="p">:</span> <span class="n">tool_call</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span>
                    <span class="s">"role"</span><span class="p">:</span> <span class="s">"tool"</span><span class="p">,</span>
                    <span class="s">"name"</span><span class="p">:</span> <span class="n">tool_name</span><span class="p">,</span>
                    <span class="s">"content"</span><span class="p">:</span> <span class="n">tool_result</span>
                <span class="p">})</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">tool_results</span><span class="p">.</span><span class="n">append</span><span class="p">({</span>
                    <span class="s">"tool_call_id"</span><span class="p">:</span> <span class="n">tool_call</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span>
                    <span class="s">"role"</span><span class="p">:</span> <span class="s">"tool"</span><span class="p">,</span>
                    <span class="s">"name"</span><span class="p">:</span> <span class="n">tool_name</span><span class="p">,</span>
                    <span class="s">"content"</span><span class="p">:</span> <span class="sa">f</span><span class="s">"未知工具：</span><span class="si">{</span><span class="n">tool_name</span><span class="si">}</span><span class="s">"</span>
                <span class="p">})</span>
        
        <span class="c1"># 3. 将工具调用结果返回给模型，生成最终回复
</span>        <span class="n">messages</span> <span class="o">=</span> <span class="p">[</span>
            <span class="p">{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"user"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="n">user_message</span><span class="p">},</span>
            <span class="n">assistant_message</span><span class="p">,</span>  <span class="c1"># 模型的工具调用请求
</span>            <span class="c1"># 添加工具调用结果
</span>            <span class="o">*</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="s">"role"</span><span class="p">:</span> <span class="s">"tool"</span><span class="p">,</span>
                    <span class="s">"tool_call_id"</span><span class="p">:</span> <span class="n">res</span><span class="p">[</span><span class="s">"tool_call_id"</span><span class="p">],</span>
                    <span class="s">"name"</span><span class="p">:</span> <span class="n">res</span><span class="p">[</span><span class="s">"name"</span><span class="p">],</span>
                    <span class="s">"content"</span><span class="p">:</span> <span class="n">res</span><span class="p">[</span><span class="s">"content"</span><span class="p">]</span>
                <span class="p">}</span>
                <span class="k">for</span> <span class="n">res</span> <span class="ow">in</span> <span class="n">tool_results</span>
            <span class="p">]</span>
        <span class="p">]</span>

        <span class="c1"># 重新调用模型，结合工具结果生成回复
</span>        <span class="n">final_response</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">chat</span><span class="p">.</span><span class="n">completions</span><span class="p">.</span><span class="n">create</span><span class="p">(</span>
            <span class="n">model</span><span class="o">=</span><span class="n">MODEL_NAME</span><span class="p">,</span>
            <span class="n">messages</span><span class="o">=</span><span class="n">messages</span><span class="p">,</span>
            <span class="n">temperature</span><span class="o">=</span><span class="mf">0.7</span>
        <span class="p">).</span><span class="n">choices</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">message</span><span class="p">.</span><span class="n">content</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="c1"># 不需要调用工具，直接返回模型回复
</span>        <span class="n">final_response</span> <span class="o">=</span> <span class="n">assistant_message</span><span class="p">.</span><span class="n">content</span>

    <span class="k">return</span> <span class="n">final_response</span>

<span class="c1"># -------------------------- 测试示例 --------------------------
</span><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
    <span class="c1"># 测试用例1：需要调用计算器
</span>    <span class="k">print</span><span class="p">(</span><span class="s">"测试1（需要计算）："</span><span class="p">)</span>
    <span class="n">user_input1</span> <span class="o">=</span> <span class="s">"请帮我计算 (100 - 25) * 8 + 150 的结果"</span>
    <span class="n">response1</span> <span class="o">=</span> <span class="n">chat_with_tools</span><span class="p">(</span><span class="n">user_input1</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"用户：</span><span class="si">{</span><span class="n">user_input1</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"模型：</span><span class="si">{</span><span class="n">response1</span><span class="si">}</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>

    <span class="c1"># 测试用例2：不需要调用工具
</span>    <span class="k">print</span><span class="p">(</span><span class="s">"测试2（普通对话）："</span><span class="p">)</span>
    <span class="n">user_input2</span> <span class="o">=</span> <span class="s">"请介绍一下人工智能的发展历程"</span>
    <span class="n">response2</span> <span class="o">=</span> <span class="n">chat_with_tools</span><span class="p">(</span><span class="n">user_input2</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"用户：</span><span class="si">{</span><span class="n">user_input2</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"模型：</span><span class="si">{</span><span class="n">response2</span><span class="si">}</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>

    <span class="c1"># 测试用例3：复杂计算
</span>    <span class="k">print</span><span class="p">(</span><span class="s">"测试3（复杂计算）："</span><span class="p">)</span>
    <span class="n">user_input3</span> <span class="o">=</span> <span class="s">"我有500元，每天花15元，每周额外花50元，请问能坚持多少天？（计算到剩余金额不足一天花费为止）"</span>
    <span class="n">response3</span> <span class="o">=</span> <span class="n">chat_with_tools</span><span class="p">(</span><span class="n">user_input3</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"用户：</span><span class="si">{</span><span class="n">user_input3</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"模型：</span><span class="si">{</span><span class="n">response3</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="langchain">LangChain</h2>

<h3 id="使用--langchain">使用  langchain</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">from</span> <span class="nn">dotenv</span> <span class="kn">import</span> <span class="n">load_dotenv</span>
<span class="kn">from</span> <span class="nn">langchain_openai</span> <span class="kn">import</span> <span class="n">ChatOpenAI</span>
<span class="kn">from</span> <span class="nn">langchain_core.prompts</span> <span class="kn">import</span> <span class="n">ChatPromptTemplate</span>

<span class="c1"># 加载环境变量
</span><span class="n">load_dotenv</span><span class="p">()</span>

<span class="c1"># 初始化模型
</span><span class="n">llm</span> <span class="o">=</span> <span class="n">ChatOpenAI</span><span class="p">(</span>
    <span class="n">model</span><span class="o">=</span><span class="s">"qwen2.5:3b"</span><span class="p">,</span>
    <span class="n">base_url</span><span class="o">=</span><span class="s">"http://localhost:11434/v1"</span><span class="p">,</span>
    <span class="n">api_key</span><span class="o">=</span><span class="s">""</span>
<span class="p">)</span>

<span class="c1"># 定义提示词模板
</span><span class="n">prompt</span> <span class="o">=</span> <span class="n">ChatPromptTemplate</span><span class="p">.</span><span class="n">from_messages</span><span class="p">([</span>
    <span class="p">(</span><span class="s">"system"</span><span class="p">,</span> <span class="s">"你是一个有帮助的助手"</span><span class="p">),</span>
    <span class="p">(</span><span class="s">"user"</span><span class="p">,</span> <span class="s">"{input}"</span><span class="p">)</span>
<span class="p">])</span>

<span class="c1"># 构建链
</span><span class="n">chain</span> <span class="o">=</span> <span class="n">prompt</span> <span class="o">|</span> <span class="n">llm</span>

<span class="c1"># 测试
</span><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
    <span class="c1"># 测试普通对话
</span>    <span class="n">response</span> <span class="o">=</span> <span class="n">chain</span><span class="p">.</span><span class="n">invoke</span><span class="p">({</span><span class="s">"input"</span><span class="p">:</span> <span class="s">"请介绍一下DeepSeek模型"</span><span class="p">})</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"结果: </span><span class="si">{</span><span class="n">response</span><span class="p">.</span><span class="n">content</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="调用工具-1">调用工具</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">langchain.agents</span> <span class="kn">import</span> <span class="n">create_agent</span>
<span class="kn">from</span> <span class="nn">langchain_openai</span> <span class="kn">import</span> <span class="n">ChatOpenAI</span>

<span class="n">model</span> <span class="o">=</span> <span class="n">ChatOpenAI</span><span class="p">(</span>
    <span class="n">model</span><span class="o">=</span><span class="s">"gpt-5"</span><span class="p">,</span>
    <span class="n">temperature</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span>
    <span class="n">max_tokens</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
    <span class="n">timeout</span><span class="o">=</span><span class="mi">3</span>
<span class="p">)</span>
<span class="n">agent</span> <span class="o">=</span> <span class="n">create_agent</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">tools</span><span class="o">=</span><span class="n">tools</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">agent</span><span class="p">.</span><span class="n">invoke</span><span class="p">(</span> <span class="p">{</span><span class="s">"messages"</span><span class="p">:</span> <span class="p">[</span><span class="n">HumanMessage</span><span class="p">(</span><span class="s">"Analyze the major themes in 'Pride and Prejudice'."</span><span class="p">)]}</span> <span class="p">)</span>
</code></pre></div></div>

<p>TODO：这个代码有问题 create_tool_calling_agent, create_react_agent</p>

<p>比如可以支持联网搜索。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="kn">from</span> <span class="nn">langchain_core.tools</span> <span class="kn">import</span> <span class="n">tool</span>  <span class="c1"># 导入tool装饰器
</span><span class="kn">from</span> <span class="nn">langchain_core.prompts</span> <span class="kn">import</span> <span class="n">PromptTemplate</span>
<span class="kn">from</span> <span class="nn">langchain_openai</span> <span class="kn">import</span> <span class="n">ChatOpenAI</span>
<span class="kn">from</span> <span class="nn">langchain.agents</span> <span class="kn">import</span> <span class="n">create_react_agent</span><span class="p">,</span> <span class="n">AgentExecutor</span>
<span class="kn">from</span> <span class="nn">langchain</span> <span class="kn">import</span> <span class="n">hub</span>
<span class="kn">import</span> <span class="nn">sympy</span>

<span class="c1"># --------------------------
# 1. 使用@tool装饰器定义工具（注解方式）
# --------------------------
</span><span class="o">@</span><span class="n">tool</span> 
<span class="k">def</span> <span class="nf">calculate_expression</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
    <span class="s">"""
    高级计算工具，支持解析字符串形式的数学表达式（如"128*45"、"(5+8)*2"）
    Args:
        expression: 数学表达式字符串，支持加减乘除、括号、幂运算等
    Returns:
        计算结果的字符串描述
    """</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">clean_expr</span> <span class="o">=</span> <span class="n">expression</span><span class="p">.</span><span class="n">replace</span><span class="p">(</span><span class="s">"×"</span><span class="p">,</span> <span class="s">"*"</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="s">"÷"</span><span class="p">,</span> <span class="s">"/"</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="s">" "</span><span class="p">,</span> <span class="s">""</span><span class="p">)</span>
        <span class="n">result</span> <span class="o">=</span> <span class="n">sympy</span><span class="p">.</span><span class="n">sympify</span><span class="p">(</span><span class="n">clean_expr</span><span class="p">)</span>
        <span class="n">numeric_result</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">evalf</span><span class="p">())</span>
        <span class="k">if</span> <span class="n">numeric_result</span><span class="p">.</span><span class="n">is_integer</span><span class="p">():</span>
            <span class="n">numeric_result</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">numeric_result</span><span class="p">)</span>
        <span class="k">return</span> <span class="sa">f</span><span class="s">"表达式 '</span><span class="si">{</span><span class="n">expression</span><span class="si">}</span><span class="s">' 的计算结果是：</span><span class="si">{</span><span class="n">numeric_result</span><span class="si">}</span><span class="s">"</span>
    <span class="k">except</span> <span class="nb">ZeroDivisionError</span><span class="p">:</span>
        <span class="k">return</span> <span class="sa">f</span><span class="s">"错误：表达式 '</span><span class="si">{</span><span class="n">expression</span><span class="si">}</span><span class="s">' 中包含除以0的运算"</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">return</span> <span class="sa">f</span><span class="s">"计算出错：无法解析表达式 '</span><span class="si">{</span><span class="n">expression</span><span class="si">}</span><span class="s">'，错误信息：</span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s">"</span>

<span class="o">@</span><span class="n">tool</span> 
<span class="k">def</span> <span class="nf">get_weather</span><span class="p">(</span><span class="n">city</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
    <span class="s">"""
    模拟获取天气的工具（实际场景可替换为真实API调用）
    Args:
        city: 城市名称
    Returns:
        该城市的模拟天气信息
    """</span>
    <span class="n">weather_data</span> <span class="o">=</span> <span class="p">{</span>
        <span class="s">"北京"</span><span class="p">:</span> <span class="s">"晴，温度 15-25℃，微风"</span><span class="p">,</span>
        <span class="s">"上海"</span><span class="p">:</span> <span class="s">"多云，温度 18-28℃，东风3级"</span><span class="p">,</span>
        <span class="s">"广州"</span><span class="p">:</span> <span class="s">"雷阵雨，温度 22-30℃，南风2级"</span><span class="p">,</span>
        <span class="s">"深圳"</span><span class="p">:</span> <span class="s">"阴，温度 23-29℃，北风1级"</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">weather_data</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">city</span><span class="p">.</span><span class="n">strip</span><span class="p">(),</span> <span class="sa">f</span><span class="s">"暂无</span><span class="si">{</span><span class="n">city</span><span class="si">}</span><span class="s">的天气数据"</span><span class="p">)</span>

<span class="c1"># --------------------------
# 2. 直接使用装饰后的函数作为tools列表
# --------------------------
# 装饰后的函数本质上是Tool对象，可直接放入列表
</span><span class="n">tools</span> <span class="o">=</span> <span class="p">[</span><span class="n">calculate_expression</span><span class="p">,</span> <span class="n">get_weather</span><span class="p">]</span>

<span class="c1"># --------------------------
# 3. 后续逻辑与之前一致（省略重复部分）
# --------------------------
</span><span class="n">llm</span> <span class="o">=</span> <span class="n">ChatOpenAI</span><span class="p">(</span>
    <span class="n">model</span><span class="o">=</span><span class="s">"qwen2.5:3b"</span><span class="p">,</span>
    <span class="n">temperature</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span>
    <span class="n">openai_api_base</span><span class="o">=</span><span class="s">"http://localhost:11434/v1"</span><span class="p">,</span>
    <span class="n">openai_api_key</span><span class="o">=</span><span class="s">"ollama"</span><span class="p">,</span>
    <span class="n">max_tokens</span><span class="o">=</span><span class="mi">2048</span>
<span class="p">)</span>

<span class="n">prompt</span> <span class="o">=</span> <span class="n">hub</span><span class="p">.</span><span class="n">pull</span><span class="p">(</span><span class="s">"hwchase17/react"</span><span class="p">)</span>
<span class="n">agent</span> <span class="o">=</span> <span class="n">create_react_agent</span><span class="p">(</span><span class="n">llm</span><span class="o">=</span><span class="n">llm</span><span class="p">,</span> <span class="n">tools</span><span class="o">=</span><span class="n">tools</span><span class="p">,</span> <span class="n">prompt</span><span class="o">=</span><span class="n">prompt</span><span class="p">)</span>
<span class="n">agent_executor</span> <span class="o">=</span> <span class="n">AgentExecutor</span><span class="p">(</span>
    <span class="n">agent</span><span class="o">=</span><span class="n">agent</span><span class="p">,</span>
    <span class="n">tools</span><span class="o">=</span><span class="n">tools</span><span class="p">,</span>
    <span class="n">verbose</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
    <span class="n">handle_parsing_errors</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
    <span class="n">max_iterations</span><span class="o">=</span><span class="mi">5</span>
<span class="p">)</span>

<span class="c1"># 测试调用
</span><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"===== 测试注解式Tool：天气查询 ====="</span><span class="p">)</span>
    <span class="n">result1</span> <span class="o">=</span> <span class="n">agent_executor</span><span class="p">.</span><span class="n">invoke</span><span class="p">({</span><span class="s">"input"</span><span class="p">:</span> <span class="s">"请问北京今天的天气怎么样？"</span><span class="p">})</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"最终回答："</span><span class="p">,</span> <span class="n">result1</span><span class="p">[</span><span class="s">"output"</span><span class="p">])</span>

    <span class="k">print</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">===== 测试注解式Tool：复杂计算 ====="</span><span class="p">)</span>
    <span class="n">result2</span> <span class="o">=</span> <span class="n">agent_executor</span><span class="p">.</span><span class="n">invoke</span><span class="p">({</span><span class="s">"input"</span><span class="p">:</span> <span class="s">"计算(80+20)*3-150/3的结果是多少？"</span><span class="p">})</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"最终回答："</span><span class="p">,</span> <span class="n">result2</span><span class="p">[</span><span class="s">"output"</span><span class="p">])</span>
</code></pre></div></div>

<h2 id="微调-qwen">微调 Qwen</h2>

<p>能用提示词的就不要去微调。很多时候差异并不明显。通常 Prompt &gt; RAG &gt; 高效微调（如LoRA）&gt; 全参数微调。</p>

<p>下面是在 Colab 上微调，不同环境可以需要改动代码。</p>

<p>构建微调数据集，问答对。<br />
LoRA 低秩<br />
量化需要 cuda<br />
选一个较小的模型演示 “Qwen/Qwen2.5-0.5B-Instruct”<br />
huggingface 有封装好的么？</p>

<p>TODO：这个代码有问题</p>

<p>依赖</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip3 <span class="nb">install</span> <span class="nt">-q</span> transformers peft accelerate datasets bitsandbytes trl sentencepiece protobuf
pip3 <span class="nb">install</span> <span class="nt">-q</span> torch torchvision torchaudio
</code></pre></div></div>
<p>代码</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1"># ======================== 1. 环境准备 ========================
</span><span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">U</span> <span class="n">transformers</span> <span class="n">accelerate</span> <span class="n">peft</span> <span class="n">trl</span> <span class="n">datasets</span> <span class="n">bitsandbytes</span> <span class="n">torch</span> <span class="n">sentencepiece</span>

<span class="kn">import</span> <span class="nn">torch</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="n">warnings</span><span class="p">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s">"ignore"</span><span class="p">)</span>

<span class="c1"># 检查 GPU
</span><span class="err">!</span><span class="n">nvidia</span><span class="o">-</span><span class="n">smi</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"GPU 可用: </span><span class="si">{</span><span class="n">torch</span><span class="p">.</span><span class="n">cuda</span><span class="p">.</span><span class="n">is_available</span><span class="p">()</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"GPU 名称: </span><span class="si">{</span><span class="n">torch</span><span class="p">.</span><span class="n">cuda</span><span class="p">.</span><span class="n">get_device_name</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">if</span> <span class="n">torch</span><span class="p">.</span><span class="n">cuda</span><span class="p">.</span><span class="n">is_available</span><span class="p">()</span> <span class="k">else</span> <span class="s">'无'</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>

<span class="c1"># ======================== 2. 加载模型与Tokenizer (4bit量化) ========================
</span><span class="kn">from</span> <span class="nn">transformers</span> <span class="kn">import</span> <span class="p">(</span>
    <span class="n">AutoModelForCausalLM</span><span class="p">,</span>
    <span class="n">AutoTokenizer</span><span class="p">,</span>
    <span class="n">BitsAndBytesConfig</span><span class="p">,</span>
    <span class="n">TrainingArguments</span><span class="p">,</span>
    <span class="n">Trainer</span><span class="p">,</span>
    <span class="n">DataCollatorForLanguageModeling</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">peft</span> <span class="kn">import</span> <span class="n">LoraConfig</span><span class="p">,</span> <span class="n">get_peft_model</span><span class="p">,</span> <span class="n">PeftModel</span>
<span class="kn">from</span> <span class="nn">datasets</span> <span class="kn">import</span> <span class="n">Dataset</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="c1"># 4bit量化配置（核心：省显存，T4必开）
</span><span class="n">bnb_config</span> <span class="o">=</span> <span class="n">BitsAndBytesConfig</span><span class="p">(</span>
    <span class="n">load_in_4bit</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
    <span class="n">bnb_4bit_use_double_quant</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
    <span class="n">bnb_4bit_quant_type</span><span class="o">=</span><span class="s">"nf4"</span><span class="p">,</span>
    <span class="n">bnb_4bit_compute_dtype</span><span class="o">=</span><span class="n">torch</span><span class="p">.</span><span class="n">bfloat16</span>
<span class="p">)</span>

<span class="c1"># 加载模型和Tokenizer
</span><span class="n">model_name</span> <span class="o">=</span> <span class="s">"Qwen/Qwen2.5-0.5B-Instruct"</span>
<span class="n">tokenizer</span> <span class="o">=</span> <span class="n">AutoTokenizer</span><span class="p">.</span><span class="n">from_pretrained</span><span class="p">(</span>
    <span class="n">model_name</span><span class="p">,</span>
    <span class="n">trust_remote_code</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
    <span class="n">padding_side</span><span class="o">=</span><span class="s">"right"</span>  <span class="c1"># 推理时避免警告
</span><span class="p">)</span>
<span class="c1"># Qwen系列需要手动设置pad_token
</span><span class="n">tokenizer</span><span class="p">.</span><span class="n">pad_token</span> <span class="o">=</span> <span class="n">tokenizer</span><span class="p">.</span><span class="n">eos_token</span>
<span class="n">tokenizer</span><span class="p">.</span><span class="n">pad_token_id</span> <span class="o">=</span> <span class="n">tokenizer</span><span class="p">.</span><span class="n">eos_token_id</span>
<span class="n">tokenizer</span><span class="p">.</span><span class="n">padding</span> <span class="o">=</span> <span class="s">"max_length"</span>  <span class="c1"># 强制padding到固定长度
</span>
<span class="c1"># 加载量化后的模型
</span><span class="n">model</span> <span class="o">=</span> <span class="n">AutoModelForCausalLM</span><span class="p">.</span><span class="n">from_pretrained</span><span class="p">(</span>
    <span class="n">model_name</span><span class="p">,</span>
    <span class="n">quantization_config</span><span class="o">=</span><span class="n">bnb_config</span><span class="p">,</span>
    <span class="n">device_map</span><span class="o">=</span><span class="s">"auto"</span><span class="p">,</span>
    <span class="n">trust_remote_code</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
    <span class="n">torch_dtype</span><span class="o">=</span><span class="n">torch</span><span class="p">.</span><span class="n">bfloat16</span>
<span class="p">)</span>
<span class="c1"># 训练时关闭缓存和并行配置
</span><span class="n">model</span><span class="p">.</span><span class="n">config</span><span class="p">.</span><span class="n">use_cache</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">model</span><span class="p">.</span><span class="n">config</span><span class="p">.</span><span class="n">pretraining_tp</span> <span class="o">=</span> <span class="mi">1</span>

<span class="c1"># ======================== 3. 准备微调数据 (修复padding/truncation) ========================
# 示例数据：Python编程助手指令集（可替换为任意符合格式的数据集）
</span><span class="n">train_data</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span>
        <span class="s">"system"</span><span class="p">:</span> <span class="s">"你是一个专业的Python编程助手，简洁、准确地回答代码问题，只输出代码和必要注释。"</span><span class="p">,</span>
        <span class="s">"instruction"</span><span class="p">:</span> <span class="s">"写一个Python函数，计算列表中所有偶数的和。"</span><span class="p">,</span>
        <span class="s">"output"</span><span class="p">:</span> <span class="s">"def sum_even_numbers(lst):</span><span class="se">\n</span><span class="s">    </span><span class="se">\"\"\"</span><span class="s">计算列表中偶数的和</span><span class="se">\"\"\"\n</span><span class="s">    return sum(num for num in lst if num % 2 == 0)"</span>
    <span class="p">},</span>
    <span class="p">{</span>
        <span class="s">"system"</span><span class="p">:</span> <span class="s">"你是一个专业的Python编程助手，简洁、准确地回答代码问题，只输出代码和必要注释。"</span><span class="p">,</span>
        <span class="s">"instruction"</span><span class="p">:</span> <span class="s">"用Python读取CSV文件并打印前5行。"</span><span class="p">,</span>
        <span class="s">"output"</span><span class="p">:</span> <span class="s">"import pandas as pd</span><span class="se">\n\n</span><span class="s">def read_csv_sample(file_path):</span><span class="se">\n</span><span class="s">    </span><span class="se">\"\"\"</span><span class="s">读取CSV文件并打印前5行</span><span class="se">\"\"\"\n</span><span class="s">    df = pd.read_csv(file_path)</span><span class="se">\n</span><span class="s">    print(df.head())</span><span class="se">\n\n</span><span class="s"># 调用示例</span><span class="se">\n</span><span class="s"># read_csv_sample('data.csv')"</span>
    <span class="p">},</span>
    <span class="p">{</span>
        <span class="s">"system"</span><span class="p">:</span> <span class="s">"你是一个专业的Python编程助手，简洁、准确地回答代码问题，只输出代码和必要注释。"</span><span class="p">,</span>
        <span class="s">"instruction"</span><span class="p">:</span> <span class="s">"写一个Python函数，判断一个数是否为质数。"</span><span class="p">,</span>
        <span class="s">"output"</span><span class="p">:</span> <span class="s">"def is_prime(n):</span><span class="se">\n</span><span class="s">    </span><span class="se">\"\"\"</span><span class="s">判断一个数是否为质数</span><span class="se">\"\"\"\n</span><span class="s">    if n &lt;= 1:</span><span class="se">\n</span><span class="s">        return False</span><span class="se">\n</span><span class="s">    for i in range(2, int(n**0.5) + 1):</span><span class="se">\n</span><span class="s">        if n % i == 0:</span><span class="se">\n</span><span class="s">            return False</span><span class="se">\n</span><span class="s">    return True"</span>
    <span class="p">},</span>
    <span class="p">{</span>
        <span class="s">"system"</span><span class="p">:</span> <span class="s">"你是一个专业的Python编程助手，简洁、准确地回答代码问题，只输出代码和必要注释。"</span><span class="p">,</span>
        <span class="s">"instruction"</span><span class="p">:</span> <span class="s">"用Python实现冒泡排序。"</span><span class="p">,</span>
        <span class="s">"output"</span><span class="p">:</span> <span class="s">"def bubble_sort(lst):</span><span class="se">\n</span><span class="s">    </span><span class="se">\"\"\"</span><span class="s">冒泡排序实现</span><span class="se">\"\"\"\n</span><span class="s">    arr = lst.copy()</span><span class="se">\n</span><span class="s">    n = len(arr)</span><span class="se">\n</span><span class="s">    for i in range(n):</span><span class="se">\n</span><span class="s">        for j in range(0, n-i-1):</span><span class="se">\n</span><span class="s">            if arr[j] &gt; arr[j+1]:</span><span class="se">\n</span><span class="s">                arr[j], arr[j+1] = arr[j+1], arr[j]</span><span class="se">\n</span><span class="s">    return arr"</span>
    <span class="p">},</span>
    <span class="p">{</span>
        <span class="s">"system"</span><span class="p">:</span> <span class="s">"你是一个专业的Python编程助手，简洁、准确地回答代码问题，只输出代码和必要注释。"</span><span class="p">,</span>
        <span class="s">"instruction"</span><span class="p">:</span> <span class="s">"Python如何遍历字典的键值对？"</span><span class="p">,</span>
        <span class="s">"output"</span><span class="p">:</span> <span class="s">"# 方法1：items()（推荐）</span><span class="se">\n</span><span class="s">my_dict = {'a': 1, 'b': 2, 'c': 3}</span><span class="se">\n</span><span class="s">for key, value in my_dict.items():</span><span class="se">\n</span><span class="s">    print(f</span><span class="se">\"</span><span class="s">键：{key}，值：{value}</span><span class="se">\"</span><span class="s">)</span><span class="se">\n\n</span><span class="s"># 方法2：遍历键再取值</span><span class="se">\n</span><span class="s">for key in my_dict:</span><span class="se">\n</span><span class="s">    print(f</span><span class="se">\"</span><span class="s">键：{key}，值：{my_dict[key]}</span><span class="se">\"</span><span class="s">)"</span>
    <span class="p">}</span>
<span class="p">]</span>

<span class="c1"># 第一步：格式化数据为Qwen官方对话模板
</span><span class="k">def</span> <span class="nf">format_dataset</span><span class="p">(</span><span class="n">example</span><span class="p">):</span>
    <span class="s">"""将单条数据转为Qwen的chat模板格式"""</span>
    <span class="n">messages</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"system"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="n">example</span><span class="p">[</span><span class="s">"system"</span><span class="p">]},</span>
        <span class="p">{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"user"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="n">example</span><span class="p">[</span><span class="s">"instruction"</span><span class="p">]},</span>
        <span class="p">{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"assistant"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="n">example</span><span class="p">[</span><span class="s">"output"</span><span class="p">]}</span>
    <span class="p">]</span>
    <span class="n">example</span><span class="p">[</span><span class="s">"text"</span><span class="p">]</span> <span class="o">=</span> <span class="n">tokenizer</span><span class="p">.</span><span class="n">apply_chat_template</span><span class="p">(</span>
        <span class="n">messages</span><span class="p">,</span>
        <span class="n">tokenize</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
        <span class="n">add_generation_prompt</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
        <span class="n">padding</span><span class="o">=</span><span class="bp">False</span>
    <span class="p">)</span>
    <span class="k">return</span> <span class="n">example</span>

<span class="c1"># 第二步：手动Tokenize数据（🔥 核心修复：统一长度）
</span><span class="k">def</span> <span class="nf">tokenize_function</span><span class="p">(</span><span class="n">examples</span><span class="p">):</span>
    <span class="s">"""手动编码文本，强制统一长度"""</span>
    <span class="c1"># 🔥 关键修复：开启padding和truncation，统一到512长度
</span>    <span class="n">tokenized</span> <span class="o">=</span> <span class="n">tokenizer</span><span class="p">(</span>
        <span class="n">examples</span><span class="p">[</span><span class="s">"text"</span><span class="p">],</span>
        <span class="n">truncation</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>                <span class="c1"># 截断超长文本
</span>        <span class="n">max_length</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span>                 <span class="c1"># 固定最大长度
</span>        <span class="n">padding</span><span class="o">=</span><span class="s">"max_length"</span><span class="p">,</span>           <span class="c1"># 不足补pad_token
</span>        <span class="n">return_overflowing_tokens</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
        <span class="n">return_tensors</span><span class="o">=</span><span class="bp">None</span>             <span class="c1"># 返回list而非tensor，避免批次问题
</span>    <span class="p">)</span>
    <span class="c1"># 语言模型训练需要labels（与input_ids一致）
</span>    <span class="n">tokenized</span><span class="p">[</span><span class="s">"labels"</span><span class="p">]</span> <span class="o">=</span> <span class="n">tokenized</span><span class="p">[</span><span class="s">"input_ids"</span><span class="p">].</span><span class="n">copy</span><span class="p">()</span>
    
    <span class="c1"># 🔥 重要：将labels中pad_token的位置设为-100（训练时忽略）
</span>    <span class="n">tokenized</span><span class="p">[</span><span class="s">"labels"</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">[</span><span class="o">-</span><span class="mi">100</span> <span class="k">if</span> <span class="n">token</span> <span class="o">==</span> <span class="n">tokenizer</span><span class="p">.</span><span class="n">pad_token_id</span> <span class="k">else</span> <span class="n">token</span> <span class="k">for</span> <span class="n">token</span> <span class="ow">in</span> <span class="n">label</span><span class="p">]</span>
        <span class="k">for</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">tokenized</span><span class="p">[</span><span class="s">"labels"</span><span class="p">]</span>
    <span class="p">]</span>
    
    <span class="k">return</span> <span class="n">tokenized</span>

<span class="c1"># 构建Dataset并处理
</span><span class="n">dataset</span> <span class="o">=</span> <span class="n">Dataset</span><span class="p">.</span><span class="n">from_list</span><span class="p">(</span><span class="n">train_data</span><span class="p">)</span>
<span class="n">dataset</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">.</span><span class="nb">map</span><span class="p">(</span><span class="n">format_dataset</span><span class="p">)</span>  <span class="c1"># 格式化文本
</span><span class="n">dataset</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">.</span><span class="nb">map</span><span class="p">(</span>
    <span class="n">tokenize_function</span><span class="p">,</span>
    <span class="n">batched</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>  <span class="c1"># 批量处理更快
</span>    <span class="n">remove_columns</span><span class="o">=</span><span class="n">dataset</span><span class="p">.</span><span class="n">column_names</span><span class="p">,</span>  <span class="c1"># 移除原始列
</span>    <span class="n">desc</span><span class="o">=</span><span class="s">"Tokenizing dataset"</span>
<span class="p">)</span>

<span class="c1"># 转换为数组（避免list嵌套问题）
</span><span class="n">dataset</span><span class="p">.</span><span class="n">set_format</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s">"torch"</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="s">"input_ids"</span><span class="p">,</span> <span class="s">"attention_mask"</span><span class="p">,</span> <span class="s">"labels"</span><span class="p">])</span>

<span class="c1"># 查看处理后的数据样例
</span><span class="k">print</span><span class="p">(</span><span class="s">"=== 处理后的数据样例 ==="</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"input_ids形状: </span><span class="si">{</span><span class="n">dataset</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">'input_ids'</span><span class="p">].</span><span class="n">shape</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"labels形状: </span><span class="si">{</span><span class="n">dataset</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">'labels'</span><span class="p">].</span><span class="n">shape</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"padding位置label值: </span><span class="si">{</span><span class="n">dataset</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">'labels'</span><span class="p">][</span><span class="o">-</span><span class="mi">10</span><span class="si">:</span><span class="p">]</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>  <span class="c1"># 验证pad位置是否为-100
</span>
<span class="c1"># ======================== 4. 配置LoRA (低秩适配) ========================
</span><span class="n">lora_config</span> <span class="o">=</span> <span class="n">LoraConfig</span><span class="p">(</span>
    <span class="n">r</span><span class="o">=</span><span class="mi">64</span><span class="p">,</span>                    <span class="c1"># 秩：0.5B模型推荐64，小数据集可降为32
</span>    <span class="n">lora_alpha</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span>           <span class="c1"># 缩放因子，通常为r的1/4
</span>    <span class="n">target_modules</span><span class="o">=</span><span class="p">[</span><span class="s">"q_proj"</span><span class="p">,</span> <span class="s">"v_proj"</span><span class="p">],</span>  <span class="c1"># Qwen核心可训练层
</span>    <span class="n">lora_dropout</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span>       <span class="c1"># dropout防止过拟合
</span>    <span class="n">bias</span><span class="o">=</span><span class="s">"none"</span><span class="p">,</span>             <span class="c1"># 不训练bias参数
</span>    <span class="n">task_type</span><span class="o">=</span><span class="s">"CAUSAL_LM"</span>    <span class="c1"># 因果语言模型任务
</span><span class="p">)</span>

<span class="c1"># 包装模型为LoRA模型
</span><span class="n">model</span> <span class="o">=</span> <span class="n">get_peft_model</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">lora_config</span><span class="p">)</span>
<span class="c1"># 打印可训练参数占比（0.5B模型约0.1%，极省显存）
</span><span class="k">print</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">=== 可训练参数 ==="</span><span class="p">)</span>
<span class="n">model</span><span class="p">.</span><span class="n">print_trainable_parameters</span><span class="p">()</span>

<span class="c1"># 🔥 修复数据整理器：禁用自动padding（已手动处理）
</span><span class="n">data_collator</span> <span class="o">=</span> <span class="n">DataCollatorForLanguageModeling</span><span class="p">(</span>
    <span class="n">tokenizer</span><span class="o">=</span><span class="n">tokenizer</span><span class="p">,</span>
    <span class="n">mlm</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>  <span class="c1"># 因果语言模型用False
</span>    <span class="n">pad_to_multiple_of</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>  <span class="c1"># 禁用自动padding
</span><span class="p">)</span>

<span class="c1"># ======================== 5. 配置训练参数并启动训练 ========================
</span><span class="n">training_args</span> <span class="o">=</span> <span class="n">TrainingArguments</span><span class="p">(</span>
    <span class="n">output_dir</span><span class="o">=</span><span class="s">"./qwen2.5-0.5b-finetune"</span><span class="p">,</span>  <span class="c1"># 训练结果保存路径
</span>    <span class="n">per_device_train_batch_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>         <span class="c1"># 单卡batch size（T4最大4）
</span>    <span class="n">gradient_accumulation_steps</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span>         <span class="c1"># 梯度累积，等效batch=8
</span>    <span class="n">learning_rate</span><span class="o">=</span><span class="mf">2e-4</span><span class="p">,</span>                    <span class="c1"># 学习率（LoRA常用2e-4）
</span>    <span class="n">num_train_epochs</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>                    <span class="c1"># 训练轮数（小数据3-5足够）
</span>    <span class="n">logging_steps</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>                       <span class="c1"># 每1步打印一次日志
</span>    <span class="n">save_strategy</span><span class="o">=</span><span class="s">"epoch"</span><span class="p">,</span>                 <span class="c1"># 每轮保存一次模型
</span>    <span class="n">fp16</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>                             <span class="c1"># 混合精度训练（T4支持）
</span>    <span class="n">optim</span><span class="o">=</span><span class="s">"paged_adamw_8bit"</span><span class="p">,</span>              <span class="c1"># 8bit优化器（省显存）
</span>    <span class="n">report_to</span><span class="o">=</span><span class="s">"none"</span><span class="p">,</span>                      <span class="c1"># 关闭wandb日志
</span>    <span class="n">gradient_checkpointing</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>           <span class="c1"># 梯度检查点（进一步省显存）
</span>    <span class="n">disable_tqdm</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>                    <span class="c1"># 显示进度条
</span>    <span class="c1"># 🔥 新增：禁用自动发现长度
</span>    <span class="n">auto_find_batch_size</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
    <span class="n">dataloader_pin_memory</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
<span class="p">)</span>

<span class="c1"># 初始化Trainer
</span><span class="n">trainer</span> <span class="o">=</span> <span class="n">Trainer</span><span class="p">(</span>
    <span class="n">model</span><span class="o">=</span><span class="n">model</span><span class="p">,</span>
    <span class="n">args</span><span class="o">=</span><span class="n">training_args</span><span class="p">,</span>
    <span class="n">train_dataset</span><span class="o">=</span><span class="n">dataset</span><span class="p">,</span>
    <span class="n">data_collator</span><span class="o">=</span><span class="n">data_collator</span><span class="p">,</span>  <span class="c1"># 处理batch的padding
</span><span class="p">)</span>

<span class="c1"># 开始训练
</span><span class="k">print</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">=== 开始训练 ==="</span><span class="p">)</span>
<span class="n">trainer</span><span class="p">.</span><span class="n">train</span><span class="p">()</span>

<span class="c1"># 保存最终LoRA模型（仅几十MB）
</span><span class="n">trainer</span><span class="p">.</span><span class="n">model</span><span class="p">.</span><span class="n">save_pretrained</span><span class="p">(</span><span class="s">"./qwen2.5-0.5b-lora-final"</span><span class="p">)</span>
<span class="n">tokenizer</span><span class="p">.</span><span class="n">save_pretrained</span><span class="p">(</span><span class="s">"./qwen2.5-0.5b-lora-final"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">=== 训练完成，模型已保存 ==="</span><span class="p">)</span>

<span class="c1"># ======================== 6. 推理测试（加载微调后的模型） ========================
</span><span class="k">def</span> <span class="nf">generate_response</span><span class="p">(</span><span class="n">prompt</span><span class="p">):</span>
    <span class="s">"""
    生成回答函数
    :param prompt: 用户提问
    :param system_prompt: 系统提示词
    :return: 模型回答
    """</span>
    <span class="c1"># 构造对话模板
</span>    <span class="n">messages</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"system"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="s">"你是一个专业的Python编程助手，简洁、准确地回答代码问题。"</span><span class="p">},</span>
        <span class="p">{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"user"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="n">prompt</span><span class="p">}</span>
    <span class="p">]</span>
    
    <span class="c1"># 编码输入
</span>    <span class="n">inputs</span> <span class="o">=</span> <span class="n">tokenizer</span><span class="p">.</span><span class="n">apply_chat_template</span><span class="p">(</span>
        <span class="n">messages</span><span class="p">,</span>
        <span class="n">tokenize</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
        <span class="n">add_generation_prompt</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
        <span class="n">return_tensors</span><span class="o">=</span><span class="s">"pt"</span>
    <span class="p">).</span><span class="n">to</span><span class="p">(</span><span class="s">"cuda"</span><span class="p">)</span>
    
    <span class="c1"># 生成回答
</span>    <span class="n">outputs</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="n">generate</span><span class="p">(</span>
        <span class="o">**</span><span class="n">inputs</span><span class="p">,</span>
        <span class="n">max_new_tokens</span><span class="o">=</span><span class="mi">256</span><span class="p">,</span>    <span class="c1"># 最大生成长度
</span>        <span class="n">temperature</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span>       <span class="c1"># 随机性（0-1，越小越确定）
</span>        <span class="n">top_p</span><span class="o">=</span><span class="mf">0.9</span><span class="p">,</span>             <span class="c1"># 核采样
</span>        <span class="n">do_sample</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>        <span class="c1"># 采样生成
</span>        <span class="n">num_return_sequences</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
        <span class="n">pad_token_id</span><span class="o">=</span><span class="n">tokenizer</span><span class="p">.</span><span class="n">pad_token_id</span><span class="p">,</span>
        <span class="n">eos_token_id</span><span class="o">=</span><span class="n">tokenizer</span><span class="p">.</span><span class="n">eos_token_id</span>
    <span class="p">)</span>
    
    <span class="c1"># 解码并返回结果
</span>    <span class="n">response</span> <span class="o">=</span> <span class="n">tokenizer</span><span class="p">.</span><span class="n">decode</span><span class="p">(</span><span class="n">outputs</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">skip_special_tokens</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
    <span class="c1"># 提取助手回答部分
</span>    <span class="n">assistant_response</span> <span class="o">=</span> <span class="n">response</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s">"assistant</span><span class="se">\n</span><span class="s">"</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">strip</span><span class="p">()</span>
    <span class="k">return</span> <span class="n">assistant_response</span>

<span class="c1"># 测试案例
</span><span class="k">print</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">=== 推理测试 ==="</span><span class="p">)</span>
<span class="n">test_prompts</span> <span class="o">=</span> <span class="p">[</span>
    <span class="s">"写一个Python函数，计算列表中所有奇数的和。"</span><span class="p">,</span>
    <span class="s">"如何用Python实现快速排序？"</span>
<span class="p">]</span>

<span class="k">for</span> <span class="n">prompt</span> <span class="ow">in</span> <span class="n">test_prompts</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="se">\n</span><span class="s">用户提问：</span><span class="si">{</span><span class="n">prompt</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
    <span class="n">response</span> <span class="o">=</span> <span class="n">generate_response</span><span class="p">(</span><span class="n">prompt</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"模型回答：</span><span class="se">\n</span><span class="si">{</span><span class="n">response</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>

 
</code></pre></div></div>
<h2 id="提示词工程">提示词工程</h2>

<p>提示词工程 https://www.promptingguide.ai/</p>

<p>平时能用提示词的就不要去微调。Prompt → RAG → 高效微调（如LoRA）→ 全参数微调</p>

<p>生成 SQL<br />
使用工具</p>

<p>提示词工程</p>
<ul>
  <li><strong>思维链</strong> CoT 可以要求按步骤写出过程，也可以给一个思维链的示例,这样可以按照某种特定的方式引导。</li>
  <li><strong>示例</strong> Example 给几个示例。</li>
</ul>

<p>拆解任务<br />
RAG<br />
优化提示词的工具，通过在任务上评估。</p>

<h2 id="agent">Agent</h2>

<p>记忆，通过总结来实现。记忆，压缩状态。</p>

<p>ReAct</p>

<p>协议<br />
MCP Skill.md</p>

<p>调用工具 -, 调用自定义工具（天气、计算器、数据库、API…） -, 联网搜索实时信息 -, 自动判断什么时候用工具 -, 多轮工具调用</p>
<ul>
  <li>工具： - 文件读写 - 联网搜索 - Excel/CSV/JSON 解析与写入， - 天气 - 计算器 - 数据库 - 执行 Python 代码 -, 文件读写（txt/md）, Excel / CSV / JSON 全解析, 联网搜索, 文件夹遍历, 运行 Python 代码（安全沙盒）, 读取图片/OCR, 系统信息查询, 命令行多轮对话- 运行Python代码 - 数据库查询 - 文件夹遍历、 - 图片读取</li>
  <li>可以实现以下任务： - 读取 Excel： 帮我读一下 data.xlsx 里面的内容 - 读取 CSV： 帮我分析 data.csv - 生成表格： 帮我创建一个学生名单.csv，包含姓名、年龄、班级 - 生成 JSON： 把用户信息保存到 user.json - 搜索 + 保存： 搜索2026手机销量，保存到 report.csv - 读取后总结： 帮我读 data.json 并总结 - 帮我列出当前文件夹所有文件 - 读一下 test.xlsx 并分析 - 把 2026 年手机销量数据存成 data.csv - 识别这张图片 img.png 的文字 - 写一段 Python 代码计算 1 到 100 的和 - 查我的电脑 CPU 占用 - 搜索 2026 年 AI 趋势并保存为 report.md - 读取 info.json 并帮我总结</li>
</ul>

<p>加载 Skill.md</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">load_skill_md</span><span class="p">(</span><span class="n">skill_path</span><span class="o">=</span><span class="s">"Skill.md"</span><span class="p">):</span>
<span class="s">"""加载并解析 Skill.md 技能手册"""</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">skill_path</span><span class="p">,</span> <span class="s">"r"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s">"utf-8"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">f</span><span class="p">.</span><span class="n">read</span><span class="p">()</span>

<span class="c1"># 提取元数据与技能描述
</span><span class="n">meta_match</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s">'---\n(.*?)\n---'</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">re</span><span class="p">.</span><span class="n">DOTALL</span><span class="p">)</span>
<span class="n">meta</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">meta_match</span><span class="p">:</span>
<span class="n">meta_lines</span> <span class="o">=</span> <span class="n">meta_match</span><span class="p">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="n">splitlines</span><span class="p">()</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">meta_lines</span><span class="p">:</span>
<span class="k">if</span> <span class="s">":"</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
<span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">line</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s">":"</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">meta</span><span class="p">[</span><span class="n">k</span><span class="p">.</span><span class="n">strip</span><span class="p">()]</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">strip</span><span class="p">()</span>

<span class="n">skill_body</span> <span class="o">=</span> <span class="n">content</span><span class="p">.</span><span class="n">replace</span><span class="p">(</span><span class="n">meta_match</span><span class="p">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="s">""</span><span class="p">)</span> <span class="k">if</span> <span class="n">meta_match</span> <span class="k">else</span> <span class="n">content</span>
<span class="k">return</span> <span class="sa">f</span><span class="s">"""
【已加载技能：</span><span class="si">{</span><span class="n">meta</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'name'</span><span class="p">,</span> <span class="s">'默认技能'</span><span class="p">)</span><span class="si">}</span><span class="s">】
描述：</span><span class="si">{</span><span class="n">meta</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'description'</span><span class="p">,</span> <span class="s">'无'</span><span class="p">)</span><span class="si">}</span><span class="s">
---
</span><span class="si">{</span><span class="n">skill_body</span><span class="si">}</span><span class="s">
"""</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">return</span> <span class="s">"未加载 Skill.md 或文件不存在"</span>
</code></pre></div></div>
<h2 id="相关论文">相关论文</h2>

<p>ReAct（Reason + Act，2022，ICLR） 通过提示词实现，可以参考 langchain 中的实现。</p>

<p>DeepSeek</p>
<ul>
  <li>DeepMath</li>
  <li>DeepSeek R1 使用合成数据</li>
  <li>DeepProver 使用</li>
</ul>]]></content><author><name>Lenna Hammer</name></author><summary type="html"><![CDATA[相关工具和库： langchain, huggingface, ollama, llama-index 模型： chatgpt, deepseek-chat, qwen, embedding bge-m3]]></summary></entry><entry><title type="html">如何应对目标</title><link href="/zh/2026/03/15/%E5%A6%82%E4%BD%95%E5%BA%94%E5%AF%B9%E7%9B%AE%E6%A0%87.html" rel="alternate" type="text/html" title="如何应对目标" /><published>2026-03-15T00:00:00+00:00</published><updated>2026-03-15T00:00:00+00:00</updated><id>/zh/2026/03/15/%E5%A6%82%E4%BD%95%E5%BA%94%E5%AF%B9%E7%9B%AE%E6%A0%87</id><content type="html" xml:base="/zh/2026/03/15/%E5%A6%82%E4%BD%95%E5%BA%94%E5%AF%B9%E7%9B%AE%E6%A0%87.html"><![CDATA[<p>来说说数学学科的学习。先说说错误的做法吧。很多人觉得学习数学只有一种方式，就是先学定义、先学概念之类的，而且这些概念往往很抽象，然后还会从各种角度去理解、分析这些概念。有了概念之后，就通过例题去学这些抽象的东西，再去解题。可这样学下来，一个是概念记不住，另一个是题目也解决不了。</p>

<p>那该怎么学习数学呢？以我的经验来说，虽然我也不算擅长，而且经验可能有好有坏，毕竟应该还有更好的方法，但我还是想说说我的方法。首先要找一些问题，不用先想着有什么知识，把问题梳理一遍，对问题进行分解。然后看看解决步骤是怎样的，搞清楚每一步有什么特征。这时候不用急着做题，就是看答案给出的解题过程，而且要仔细看，看到每一步是针对哪个问题的特征进行操作的，而且这一步操作会用到什么假设。这里说的假设可以理解为某种知识，只是现在可能还不知道，就先把它当成假设。把每一步的问题特征和对应的假设找张纸写下来，这样看完一个问题的答案后，就能把涉及到的内容都记下来。之后再多看几道题，会发现有些问题有相似或重复的地方，它们所依据的前提和假设是一致的。</p>

<p>还有一个问题，就是很多人觉得数学里的东西都是名人说的，或者是被天才证明出来的。但是其实不是这样，数学里很多内容实际上都来自经验和直觉。就是从现实中观察到某种现象，当这种现象具有普遍性时，就变成了定理之类的。证明定理其实是在发现知识之间的关系，就像我们刚才分析问题找前提一样，也是看一个问题，再到更小的问题，这才是证明要做的。不能反过来理解，觉得知识是被证明出来的，证明其实是一个分析的过程，是从我们观察到的具有广泛性的事实中，寻找前提和适用条件。这样才能更好地运用它，这才是我们要去证明的原因。</p>

<p>把这些都写下来之后，就可以进行下一步了。之前都是看着答案写的，接下来就不看答案，看看刚才记录的东西能不能解决问题，能不能符合问题的要求。先不管怎么解决，就看刚才写下的问题特征，新问题下来后，是否符合这些特征。如果符合，刚才记录的对应解决方案能不能用上。如果很有用，就要重点注意这一点；如果有欠缺，就重新补充到记录里。记录的时候，还要把问题中分解出来的小问题化解成非常简单的问题，不要记那些很抽象的东西，要记具体的小问题以及对应的解决方法，把大问题分解成小问题记录下来。当然，只记重要的、有必要的，别什么都记，免得记成一堆琐碎的内容，要有所挑选。</p>

<p>以上就是我对数学学习的看法。之前写过一个帖子，感觉太抽象，所以这里想找更具体的例子来说明。其实这种方法不仅局限于数学，很多问题都可以通过分解来解决，从一个例子可以引申到其他例子。关键是不要急于抽象化，不要把问题想得太抽象，也不要认为一切可以直接用已有的知识去推导，这都是不对的。要假设在知识都不存在的情况下思考如何解决问题，核心还是学习经验，而不是局限于某些概念或内容，毕竟我们的目的是解决问题。</p>]]></content><author><name>Lenna Hammer</name></author><summary type="html"><![CDATA[来说说数学学科的学习。先说说错误的做法吧。很多人觉得学习数学只有一种方式，就是先学定义、先学概念之类的，而且这些概念往往很抽象，然后还会从各种角度去理解、分析这些概念。有了概念之后，就通过例题去学这些抽象的东西，再去解题。可这样学下来，一个是概念记不住，另一个是题目也解决不了。]]></summary></entry><entry><title type="html">Ruby代码片段4 搜索与规划</title><link href="/zh/2026/02/23/Ruby%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B54-%E6%90%9C%E7%B4%A2%E4%B8%8E%E8%A7%84%E5%88%92.html" rel="alternate" type="text/html" title="Ruby代码片段4 搜索与规划" /><published>2026-02-23T00:00:00+00:00</published><updated>2026-02-23T00:00:00+00:00</updated><id>/zh/2026/02/23/Ruby%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B54-%E6%90%9C%E7%B4%A2%E4%B8%8E%E8%A7%84%E5%88%92</id><content type="html" xml:base="/zh/2026/02/23/Ruby%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B54-%E6%90%9C%E7%B4%A2%E4%B8%8E%E8%A7%84%E5%88%92.html"><![CDATA[<p>这里突出搜索算法，包括图上的，和搜索空间上的。还有一些规划算法。</p>

<h2 id="树的遍历">树的遍历</h2>

<p>很多搜索问题可以转化为树，二叉树是最基本的情况。</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 二叉树节点定义</span>
<span class="k">class</span> <span class="nc">TreeNode</span>
  <span class="nb">attr_accessor</span> <span class="ss">:val</span><span class="p">,</span> <span class="ss">:left</span><span class="p">,</span> <span class="ss">:right</span>
  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">left</span> <span class="o">=</span> <span class="kp">nil</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="kp">nil</span><span class="p">)</span>
    <span class="vi">@val</span> <span class="o">=</span> <span class="n">val</span>
    <span class="vi">@left</span> <span class="o">=</span> <span class="n">left</span>
    <span class="vi">@right</span> <span class="o">=</span> <span class="n">right</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="c1"># 二叉树的遍历（DFS）前序遍历（根 → 左 → 右）</span>

<span class="c1"># 递归版本</span>
<span class="k">def</span> <span class="nf">preorder_recursive</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">res</span> <span class="o">=</span> <span class="p">[])</span>
  <span class="k">return</span> <span class="n">res</span> <span class="k">if</span> <span class="n">root</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="n">res</span> <span class="o">&lt;&lt;</span> <span class="n">root</span><span class="p">.</span><span class="nf">val</span>
  <span class="n">preorder_recursive</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="nf">left</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
  <span class="n">preorder_recursive</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="nf">right</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
  <span class="n">res</span>
<span class="k">end</span>

<span class="c1"># 非递归（栈）版本</span>
<span class="k">def</span> <span class="nf">preorder_iterative</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
  <span class="k">return</span> <span class="p">[]</span> <span class="k">if</span> <span class="n">root</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
  <span class="n">stack</span> <span class="o">=</span> <span class="p">[</span><span class="n">root</span><span class="p">]</span>
  <span class="k">while</span> <span class="o">!</span><span class="n">stack</span><span class="p">.</span><span class="nf">empty?</span>
    <span class="n">node</span> <span class="o">=</span> <span class="n">stack</span><span class="p">.</span><span class="nf">pop</span>
    <span class="n">res</span> <span class="o">&lt;&lt;</span> <span class="n">node</span><span class="p">.</span><span class="nf">val</span>
    <span class="c1"># 先右后左入栈，保证出栈时左先遍历</span>
    <span class="n">stack</span> <span class="o">&lt;&lt;</span> <span class="n">node</span><span class="p">.</span><span class="nf">right</span> <span class="k">if</span> <span class="n">node</span><span class="p">.</span><span class="nf">right</span>
    <span class="n">stack</span> <span class="o">&lt;&lt;</span> <span class="n">node</span><span class="p">.</span><span class="nf">left</span> <span class="k">if</span> <span class="n">node</span><span class="p">.</span><span class="nf">left</span>
  <span class="k">end</span>
  <span class="n">res</span>
<span class="k">end</span>

<span class="c1"># 测试二叉树遍历</span>
<span class="n">root</span> <span class="o">=</span> <span class="no">TreeNode</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">root</span><span class="p">.</span><span class="nf">right</span> <span class="o">=</span> <span class="no">TreeNode</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">root</span><span class="p">.</span><span class="nf">right</span><span class="p">.</span><span class="nf">left</span> <span class="o">=</span> <span class="no">TreeNode</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>

<span class="nb">puts</span> <span class="s2">"前序递归: </span><span class="si">#{</span><span class="n">preorder_recursive</span><span class="p">(</span><span class="n">root</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>   <span class="c1"># [1, 2, 3]</span>
<span class="nb">puts</span> <span class="s2">"前序非递归: </span><span class="si">#{</span><span class="n">preorder_iterative</span><span class="p">(</span><span class="n">root</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span> <span class="c1"># [1, 2, 3]</span>

</code></pre></div></div>

<h2 id="图的遍历">图的遍历</h2>

<p>深度优先遍历</p>

<p>广度优先遍历</p>

<p>在树的基础上，有环。</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 图的遍历（DFS）</span>

<span class="c1"># 图的表示：邻接表（哈希，key 为节点，value 为相邻节点数组）</span>
<span class="c1"># 示例无向图</span>
<span class="n">graph</span> <span class="o">=</span> <span class="p">{</span>
  <span class="mi">0</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span>
  <span class="mi">1</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">],</span>
  <span class="mi">2</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">5</span><span class="p">],</span>
  <span class="mi">3</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">],</span>
  <span class="mi">4</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">],</span>
  <span class="mi">5</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
<span class="p">}</span>

<span class="c1"># 递归 DFS</span>
<span class="k">def</span> <span class="nf">dfs_recursive</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">visited</span> <span class="o">=</span> <span class="no">Set</span><span class="p">.</span><span class="nf">new</span><span class="p">,</span> <span class="n">result</span> <span class="o">=</span> <span class="p">[])</span>
  <span class="k">return</span> <span class="n">result</span> <span class="k">if</span> <span class="n">start</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="n">visited</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
  <span class="n">result</span> <span class="o">&lt;&lt;</span> <span class="n">start</span>
  <span class="c1"># 遍历邻居</span>
  <span class="n">graph</span><span class="p">[</span><span class="n">start</span><span class="p">].</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">neighbor</span><span class="o">|</span>
    <span class="k">unless</span> <span class="n">visited</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">neighbor</span><span class="p">)</span>
      <span class="n">dfs_recursive</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">neighbor</span><span class="p">,</span> <span class="n">visited</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
    <span class="k">end</span>
  <span class="k">end</span>
  <span class="n">result</span>
<span class="k">end</span>

<span class="c1"># 非递归 DFS（栈实现）</span>
<span class="k">def</span> <span class="nf">dfs_iterative</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">start</span><span class="p">)</span>
  <span class="k">return</span> <span class="p">[]</span> <span class="k">if</span> <span class="n">start</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="n">visited</span> <span class="o">=</span> <span class="no">Set</span><span class="p">.</span><span class="nf">new</span>
  <span class="n">stack</span> <span class="o">=</span> <span class="p">[</span><span class="n">start</span><span class="p">]</span>
  <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
  <span class="k">while</span> <span class="o">!</span><span class="n">stack</span><span class="p">.</span><span class="nf">empty?</span>
    <span class="n">node</span> <span class="o">=</span> <span class="n">stack</span><span class="p">.</span><span class="nf">pop</span>
    <span class="k">next</span> <span class="k">if</span> <span class="n">visited</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
    <span class="n">visited</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
    <span class="n">result</span> <span class="o">&lt;&lt;</span> <span class="n">node</span>
    <span class="c1"># 逆序入栈，保证遍历顺序与递归一致（可选）</span>
    <span class="n">graph</span><span class="p">[</span><span class="n">node</span><span class="p">].</span><span class="nf">reverse_each</span> <span class="k">do</span> <span class="o">|</span><span class="n">neighbor</span><span class="o">|</span>
      <span class="n">stack</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="n">neighbor</span><span class="p">)</span> <span class="k">unless</span> <span class="n">visited</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">neighbor</span><span class="p">)</span>
    <span class="k">end</span>
  <span class="k">end</span>
  <span class="n">result</span>
<span class="k">end</span>

<span class="c1"># 图的广度优先遍历</span>

<span class="c1"># TODO</span>

<span class="c1"># 测试图遍历</span>
<span class="nb">require</span> <span class="s1">'set'</span>
<span class="nb">puts</span> <span class="s2">"图递归 DFS: </span><span class="si">#{</span><span class="n">dfs_recursive</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>   <span class="c1"># [0, 1, 3, 4, 5, 2]</span>
<span class="nb">puts</span> <span class="s2">"图非递归 DFS: </span><span class="si">#{</span><span class="n">dfs_iterative</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span> <span class="c1"># [0, 1, 3, 4, 5, 2]</span>
</code></pre></div></div>

<h2 id="线性规划">线性规划</h2>

<p>自行实现比较麻烦，建议调库。</p>]]></content><author><name>Lenna Hammer</name></author><summary type="html"><![CDATA[这里突出搜索算法，包括图上的，和搜索空间上的。还有一些规划算法。]]></summary></entry><entry><title type="html">心情日记</title><link href="/zh/2026/02/23/%E5%BF%83%E6%83%85%E6%97%A5%E8%AE%B0.html" rel="alternate" type="text/html" title="心情日记" /><published>2026-02-23T00:00:00+00:00</published><updated>2026-02-23T00:00:00+00:00</updated><id>/zh/2026/02/23/%E5%BF%83%E6%83%85%E6%97%A5%E8%AE%B0</id><content type="html" xml:base="/zh/2026/02/23/%E5%BF%83%E6%83%85%E6%97%A5%E8%AE%B0.html"><![CDATA[<p>假期躺在床上，整个世界都很安静。</p>]]></content><author><name>Lenna Hammer</name></author><summary type="html"><![CDATA[假期躺在床上，整个世界都很安静。]]></summary></entry><entry><title type="html">英语笔记 词缀词根</title><link href="/zh/2026/02/18/%E8%8B%B1%E8%AF%AD%E7%AC%94%E8%AE%B0-%E8%AF%8D%E7%BC%80%E8%AF%8D%E6%A0%B9.html" rel="alternate" type="text/html" title="英语笔记 词缀词根" /><published>2026-02-18T20:04:36+00:00</published><updated>2026-02-18T20:04:36+00:00</updated><id>/zh/2026/02/18/%E8%8B%B1%E8%AF%AD%E7%AC%94%E8%AE%B0-%E8%AF%8D%E7%BC%80%E8%AF%8D%E6%A0%B9</id><content type="html" xml:base="/zh/2026/02/18/%E8%8B%B1%E8%AF%AD%E7%AC%94%E8%AE%B0-%E8%AF%8D%E7%BC%80%E8%AF%8D%E6%A0%B9.html"><![CDATA[<h1 id="常见词缀词根">常见词缀词根</h1>

<p>前缀和后缀比较固定，改变单词原有的意思。词根则反映单词的意思。</p>

<h2 id="词缀">词缀</h2>
<p>affix</p>

<p>前缀 prefix</p>
<ul>
  <li>方向前缀： <strong>dis-</strong>=away 离开/分离, <strong>ex-</strong>=out 向外/出, <strong>in-</strong>=into 进入/向内, <strong>re-</strong>=back 向后/返回, <strong>sub-</strong>=under 在……之下/向下, <strong>com/con/col-</strong>=with/together 共同/一起, <strong>pro-</strong>=forward 向前/支持</li>
  <li>数量前缀： <strong>uni-</strong>=one 单一, <strong>bi-</strong>=two 双/二, <strong>tri-</strong>=three 三, <strong>multi-</strong>=many 多, <strong>semi-</strong>=half 半</li>
  <li>否定前缀： <strong>un-</strong>=not 不/非, <strong>in-</strong>=not 不/无，变体 il-/im-/ir- <strong>dis-</strong>=not 否定/相反, <strong>non-</strong>=not 非/不, <strong>anti-</strong>=against 反对/抗</li>
</ul>

<p>后缀 suffix</p>
<ul>
  <li>名词后缀
    <ul>
      <li>表人/职业, <strong>-er</strong> ……者/从事……的人, <strong>-or</strong> ……者/执行者, <strong>-ist</strong> ……主义者/专家, <strong>-ian</strong> ……领域的人, <strong>-ee</strong> 受动者/被……的人</li>
      <li>表物, <strong>-ment</strong> 具体事物/工具, <strong>-tion</strong> 事物/结果, <strong>-er</strong> 工具/物品</li>
      <li>表抽象概念/状态, <strong>-tion/-ation</strong> 动作/状态, <strong>-ment</strong> 行为/结果, <strong>-ness</strong> 性质/状态, <strong>-ity</strong> 性质/状态, <strong>-hood</strong> 状态/时期</li>
    </ul>
  </li>
  <li>动词后缀： <strong>-ize/-ise</strong>=make 使……化, <strong>-ate</strong>=make/do 使……/做……, <strong>-en</strong>=make 使……变得, <strong>-ify/-fy</strong>=make 使……具……性质</li>
  <li>形容词后缀： <strong>-ful</strong>=full of 充满……的, <strong>-less</strong>=without 无……的, <strong>-able/-ible</strong>=able to 能……的, <strong>-ous/-ious</strong>=having 具……性质的, <strong>-y</strong>=characterized by 带……特征的, <strong>-ive</strong>=tending to 具……倾向的</li>
  <li>副词后缀： <strong>-ly</strong>=way 以……方式, <strong>-ward/-wards</strong>=direction 朝……方向, <strong>-wise</strong>=manner/aspect 以……方式/方面</li>
</ul>

<h2 id="词根">词根</h2>

<p>这里详细列举一下，串记单词。</p>

<p>动作/器官相关</p>
<ul>
  <li><strong>man/manu=hand 手</strong>: manual 手册/手动的，manufacture 制造，manuscript 手稿，manipulate 操作</li>
  <li><strong>ped=foot 脚</strong>: pedestrian 行人，pedal 踏板，centipede 蜈蚣，expedition 远征</li>
  <li><strong>port=carry 搬运</strong>: transport 运输，import 进口，portable 便携的，support 支持</li>
  <li><strong>struct=build 建造</strong>: construct 建造，structure 结构，destruction 破坏，instruction 指示</li>
  <li><strong>act/ag=do/drive 做/驱动</strong>: action 行动，agent 代理人，react 反应，agenda 议程</li>
  <li><strong>ced/ceed/cess=go 走</strong>: proceed 进行，succeed 成功，process 过程，access 进入</li>
  <li><strong>stat=stand 站立</strong>: station 车站，status 地位，statue 雕像，statistics 统计学</li>
  <li><strong>dict=say/speak 说</strong>: dictionary 字典，predict 预测，dictate 口述，contradict 反驳</li>
  <li><strong>log/loqu=speak 说</strong>: dialogue 对话，apology 道歉，eloquent 雄辩的，logic 逻辑</li>
  <li><strong>scrib/script=write 写</strong>: describe 描述，prescription 处方，manuscript 手稿，subscribe 订阅</li>
  <li><strong>graph/gram=write/draw 写/画</strong>: photograph 照片，autograph 亲笔签名，telegram 电报，grammar 语法</li>
  <li><strong>mot/mob=move 移动</strong>: motion 运动， promote 促进， mobile 移动的， automobile 汽车</li>
  <li><strong>ject=throw 投掷</strong>: project 投射， reject 拒绝， inject 注射， eject 弹出</li>
  <li><strong>vert/vers=turn 转</strong>: convert 转换， reverse 反转， advertise 广告， diverse 多样的</li>
  <li><strong>tract=draw, pull 拉</strong>: attract 吸引， contract 合同， tractor 拖拉机， extract 提取</li>
  <li><strong>pos/pon=put, place 放置</strong>: position 位置， postpone 推迟， compose 组成， expose 暴露</li>
  <li><strong>claim/clam=shout, cry out 呼喊</strong>: exclaim 惊呼， proclaim 宣布， clamor 喧闹， acclaim 称赞</li>
</ul>

<p>感知相关</p>
<ul>
  <li><strong>vis/vid=see 看</strong>：visible 可见的、vision 视力/视野、video 视频、evidence 证据、obvious、</li>
  <li><strong>aud=hear 听</strong>：audio 音频、audience 观众/听众</li>
  <li><strong>sci=know 知道</strong>：science 科学、conscious 有意识的、conscience 良心</li>
  <li><strong>cogn=know 知道</strong>：recognize 认出、cognitive 认知的、cognition 认知</li>
  <li><strong>sent/sens=feel 感觉</strong>: sensitive 敏感的， sentiment 情感， consensus 共识， nonsense 废话</li>
</ul>

<p>自然相关</p>
<ul>
  <li><strong>bio=life 生命</strong>：biology 生物学、biography 传记</li>
  <li><strong>geo=earth 大地</strong>：geography 地理学、geology 地质学、geometry 几何学</li>
  <li><strong>aqua/hydr=water 水</strong>: aquarium 水族馆， aquatic 水生的， hydrate 补水， hydroelectric 水力发电的</li>
  <li><strong>ign=fire 火</strong>: ignite 点燃， ignition 点火， igneous 火成的</li>
  <li><strong>photo/luc=light 光</strong>: photograph 照片， photon 光子， lucid 清晰的， translucent 半透明的</li>
  <li><strong>viv=live, life 活</strong>: vivid 生动的， survive 幸存， revive 复活， vital 至关重要的</li>
  <li><strong>astr/aster=star 星星</strong>: astronaut 宇航员， astronomy 天文学， disaster 灾难（原意：星位不正）</li>
  <li><strong>chron=time 时间</strong>: chronic 慢性的， chronology 年表， synchronize 同步</li>
  <li><strong>phon=sound 声音</strong>: telephone 电话， symphony 交响乐， microphone 麦克风</li>
</ul>

<p>学科/研究相关</p>
<ul>
  <li><strong>logy=study of ……学</strong>：biology 生物学、psychology 心理学、geology 地质学</li>
  <li><strong>techno=art, skill 技术</strong>: technology 技术， technician 技师</li>
  <li><strong>philia=love 爱</strong>: philosophy 哲学（爱智慧），</li>
</ul>

<p>参考资料</p>
<ul>
  <li>《》</li>
</ul>]]></content><author><name>Lenna Hammer</name></author><summary type="html"><![CDATA[常见词缀词根]]></summary></entry><entry><title type="html">英语笔记 读音</title><link href="/zh/2026/02/18/%E8%8B%B1%E8%AF%AD%E7%AC%94%E8%AE%B0-%E8%AF%BB%E9%9F%B3.html" rel="alternate" type="text/html" title="英语笔记 读音" /><published>2026-02-18T19:45:54+00:00</published><updated>2026-02-18T19:45:54+00:00</updated><id>/zh/2026/02/18/%E8%8B%B1%E8%AF%AD%E7%AC%94%E8%AE%B0-%E8%AF%BB%E9%9F%B3</id><content type="html" xml:base="/zh/2026/02/18/%E8%8B%B1%E8%AF%AD%E7%AC%94%E8%AE%B0-%E8%AF%BB%E9%9F%B3.html"><![CDATA[<p>英语发音</p>
<h3 id="读音">读音</h3>

<h3 id="音标">音标</h3>

<p>音标是用来记录发音的</p>

<ul>
  <li>元音字母有固定的发音，区分开音节（元音字母结尾，长，字母本身读音）、闭音节（元音字母后接辅音，短）、重读、弱读（/ə/），长短。</li>
  <li>音节划分：按元音，前后有辅音，从后往前划分。重音，双音节词重音，名词在前<code class="language-plaintext highlighter-rouge">'object</code> ，动词在后<code class="language-plaintext highlighter-rouge">ob'ject</code> 。有些固定后缀在倒数第三个音节（如-tion）。</li>
</ul>

<p><strong>元音</strong>字母的发音</p>
<ul>
  <li><strong>a</strong>: 开音节 /eɪ/ cake, 闭音节 /æ/ cat, 在 ss/st/sk/th/f/n 前 /ɑː/ ask,  非重读音节 /ə/ about, .</li>
  <li><strong>e</strong>: 开音节 /iː/  she, 闭音节 /e/ pen,  非重读音节, /ə/ open  /ɪ/ begin.</li>
  <li><strong>i</strong>: 开音节 /aɪ/ like,  闭音节 /ɪ/ ,  特殊情况 /iː/ machine,  非重读音节 /ə/ possible, .</li>
  <li><strong>o</strong>: 开音节 /əʊ/ /oʊ/ no, home,  闭音节 /ɒ/ /ɑː/ hot, dog, 在 m/n/v/th 前 /ʌ/ come,  在 st/ld 前 /uː/ most, cold,  非重读音节 /ə/ photo, .</li>
  <li><strong>u</strong>: 开音节 /juː/ use, 闭音节 /ʌ/ bus ,在 l/r/j 后 /uː/ blue ,部分单词 /ʊ/ put, 非重读音节  /ə/ minute, autumn, difficult.</li>
  <li>半元音 y: 词尾开音节 /aɪ/ my, 词中闭音节 /ɪ/ gym, 非重读音节词尾 /iː/ baby, 词首作辅音 /j/ yes,.</li>
</ul>

<p><strong>双元音</strong>，元音字母组合的发音</p>
<ul>
  <li>ai/ay  /eɪ/ rain,  day,</li>
  <li>ea /iː/ eat,  闭音节 /e/ head, /eɪ/ great,</li>
  <li>ee /iː/ see,</li>
  <li>ei/ey  /eɪ/ eight, they,</li>
  <li>er // version</li>
  <li>oo 长音 /uː/ moon, 短音 /ʊ/ book,</li>
  <li>ou,  /aʊ/ out,  /uː/ soup,  /ʌ/ touch,</li>
</ul>

<p><strong>辅音</strong>字母的发音</p>
<ul>
  <li><strong>c</strong>： 清辅音 /k/在 a/o/u 前 cat /kæt/、cup /kʌp/，清辅音 /s/ 在 e/i/y 前 city /ˈsɪti/、nice /naɪs/</li>
  <li><strong>g</strong>： 浊辅音 /ɡ/ 在 a/o/u 前 go /ɡəʊ/，浊辅音 /dʒ/ 在 e/i/y 前 age /eɪdʒ/</li>
  <li><strong>j</strong>： 浊辅音 /dʒ/ jump</li>
  <li><strong>y</strong>：浊辅音 /j/ yes</li>
  <li><strong>s</strong>： 清辅音 /s/ 在词首或清辅音后 sun /sʌn/、desk /desk/，浊辅音/z/ 在元音后或词尾浊音后 rose /rəʊz/、has /hæz/，/ʃ/ 在 /ʃ//tʃ/ 前发 /ʃ/ sure /ʃʊə(r)/</li>
  <li><strong>th</strong>: 清辅音 /θ/  think /θɪŋk/ ，浊辅音 /ð/  this /ðɪs/、</li>
  <li><strong>ch:</strong>  浊辅音 /tʃ/ chair,  清辅音 /k/：school /skuːl/、清辅音  /ʃ/：machine /məˈʃiːn/</li>
  <li><strong>sh</strong>：始终发 /ʃ/“she” 。</li>
</ul>

<p>固定组合，前缀，后缀的发音</p>
<ul>
  <li>-er 名词后缀，动词变名词（表 “人 / 工具”），形容词变比较级  /ə(r)/ teacher， 重读 /ɜː(r)/ her</li>
  <li>-tion：名词后缀   <strong>/ʃn/</strong> action /ˈækʃn/、 重音通常在 -tion 前倒数第三个音节</li>
  <li>-sion：名词后缀 /ʒn/ 或 /ʒən/ 名词 decision /dɪˈsɪʒn/、television /ˈtelɪvɪʒn/</li>
  <li>-ment： /mənt/ 名词 development /dɪˈveləpmənt/、movement /ˈmuːvmənt/</li>
  <li>-ing： /ɪŋ/ 动名词 / 现在分词 running /ˈrʌnɪŋ/、thinking /ˈθɪŋkɪŋ/</li>
  <li>-ed： /t/（在清辅音后） 动词过去式 过去分词 worked /wɜːkt/、washed /wɒʃt/   ,，    /d/（在浊辅音 / 元音后） played /pleɪd/、called /kɔːld/ ，      /ɪd/（在t/d 后） wanted /ˈwɒntɪd/、needed /ˈniːdɪd/</li>
  <li>-en</li>
</ul>

<p>音标</p>

<p>连读，按照短语，<br />
辅音+元音连读，辅音+辅音，失去爆破。听力的时候格外要注意。</p>

<p>重音</p>

<p>断句</p>

<p>参考资料</p>
<ul>
  <li>《》</li>
  <li>自然拼读</li>
</ul>]]></content><author><name>Lenna Hammer</name></author><summary type="html"><![CDATA[英语发音 读音]]></summary></entry><entry><title type="html">如何阅读一本书</title><link href="/zh/2026/02/17/%E5%A6%82%E4%BD%95%E9%98%85%E8%AF%BB%E4%B8%80%E6%9C%AC%E4%B9%A6.html" rel="alternate" type="text/html" title="如何阅读一本书" /><published>2026-02-17T00:00:00+00:00</published><updated>2026-02-17T00:00:00+00:00</updated><id>/zh/2026/02/17/%E5%A6%82%E4%BD%95%E9%98%85%E8%AF%BB%E4%B8%80%E6%9C%AC%E4%B9%A6</id><content type="html" xml:base="/zh/2026/02/17/%E5%A6%82%E4%BD%95%E9%98%85%E8%AF%BB%E4%B8%80%E6%9C%AC%E4%B9%A6.html"><![CDATA[<p>为什么有些中文教科书很难阅读。这是因为它们往往把知识当作默认已经存在、不言自明的前提，再由此进行推导，但在这个过程中，缺少了很关键的归纳这一步。</p>

<p>而事实上，只有现实中发生的现象才是真实存在的，那些所谓的“知识”并不是天然存在，它们只是人们脑海中形成的印记。思考本应从现实中的现象、从观察出发，而不是从一些默认存在、被假设存在的知识出发。</p>

<p>无论情况如何，我们都可以利用笔记来记录观察和整理思路。</p>

<ol>
  <li>
    <p>记笔记的时候，每一条都要是一个独立完整的句子，不要做成树形结构，不要依赖上下文。每条笔记单独一行，看上去都是针对特定问题的独立、完整的内容。可以作为思维的提纲，从中看到涉及的要点，或者作为实现特定的功能和目标的回应。</p>
  </li>
  <li>
    <p>可以用一张白纸，专门记录想法片段，这些片段不需要完整，只要是看到的内容、或是想到的内容就行，一定要是具体简单的内容，收集在一起。之后可以把这些片段合并到新的笔记里，或者根据新看到的内容来调整之前的笔记。</p>
  </li>
  <li>
    <p>有的时候，还需要记录做事的过程，一步一步把可复现的流程记下来。之后可以梳理这个流程，只记录流程里实际做过的部分，只保留必要的内容就可以。也可以去看别人记录的流程，用讨论的心态去看待这些流程性记录，这样就能从中获得启示。</p>
  </li>
</ol>

<p>总而言之，有很多方法可以帮助我们填补这个缺失的过程。</p>]]></content><author><name>Lenna Hammer</name></author><summary type="html"><![CDATA[为什么有些中文教科书很难阅读。这是因为它们往往把知识当作默认已经存在、不言自明的前提，再由此进行推导，但在这个过程中，缺少了很关键的归纳这一步。]]></summary></entry><entry><title type="html">数学笔记1</title><link href="/zh/2026/02/13/%E6%95%B0%E5%AD%A6%E7%AC%94%E8%AE%B01.html" rel="alternate" type="text/html" title="数学笔记1" /><published>2026-02-13T00:00:00+00:00</published><updated>2026-02-13T00:00:00+00:00</updated><id>/zh/2026/02/13/%E6%95%B0%E5%AD%A6%E7%AC%94%E8%AE%B01</id><content type="html" xml:base="/zh/2026/02/13/%E6%95%B0%E5%AD%A6%E7%AC%94%E8%AE%B01.html"><![CDATA[<blockquote>
  <p>目前这里数学公式显示有点问题。</p>
</blockquote>

<h1 id="数学笔记1">数学笔记1</h1>

<p>本文假设已经知道微积分的内容，并着重复习一下数学分析的部分核心知识和方法。</p>

<p>数学分数通常作为微积分的后置课程，因为微积分的结论是符合现实的并具有使用价值，而数学分析是尝试对已有结论做形式化和公理化。</p>

<h2 id="定义定理">定义定理</h2>

<p>极限</p>
<ul>
  <li>
    <table>
      <tbody>
        <tr>
          <td>极限的定义: $\forall \varepsilon&gt;0,\ \exists N\in\mathbb{N}^*,\ \text{s.t. } n&gt;N \Rightarrow</td>
          <td>x_n - A</td>
          <td>&lt;\varepsilon$。</td>
        </tr>
      </tbody>
    </table>
  </li>
  <li>常见的极限：$\lim_{n\to\infty} \frac{1}{n} = 0$。</li>
  <li>极限的运算：lim a + lim b = lim (a+b)</li>
  <li>三明治定理 Sandwich/Squeeze Theorem：若对充分大的 n，有xn​≤yn​≤zn​且limn→∞​xn​=limn→∞​zn​=L则limn→∞​yn​=L,例如 lim x→0​ x^2 sin(1/x)=0</li>
</ul>

<p>实数</p>
<ul>
  <li>实数完备性：实数域关于极限运算封闭，即实数列的极限仍为实数。</li>
  <li>确界存在定理：非空有上界数集必有上确界。</li>
  <li>单调有界定理: 单调有界数列必收敛。</li>
  <li>区间套定理：满足区间套条件的所有闭区间有唯一公共点，且左右端点都收敛于这个点。</li>
  <li>聚点定理：实轴上任意有界无限点集至少有一个聚点。</li>
  <li>有限覆盖定理：闭区间 $[a,b]$ 的任意开覆盖必有有限子覆盖。</li>
  <li>Bolzano–Weierstrass 定理：任何有界实数列必有收敛子列。</li>
  <li>柯西收敛定理：柯西列 $\iff$ 收敛</li>
</ul>

<p>连续（以及闭区间上连续函数的性质）</p>
<ul>
  <li>
    <table>
      <tbody>
        <tr>
          <td>连续的定义: $\displaystyle\lim_{x\to x_0} f(x)=f(x_0) \iff \forall\varepsilon&gt;0,\exists\delta&gt;0,$ 当 $</td>
          <td>x-x_0</td>
          <td>&lt;\delta$ 时，有 $</td>
          <td>f(x)-f(x_0)</td>
          <td>&lt;\varepsilon$。</td>
        </tr>
      </tbody>
    </table>
  </li>
  <li>有界性定理 Boundedness Theorem：闭区间上的连续函数必有界。</li>
  <li>最值定理 Extreme Value Theorem：闭区间上的连续函数必能取到最大值和最小值。</li>
  <li>零点定理 Bolzano’s Theorem：若 $f\in C[a,b]$ 且 $f(a)f(b)&lt;0$，则 $\exists\xi\in(a,b)$ 使得 $f(\xi)=0$。</li>
  <li>介值定理 Intermediate Value Theorem：若 $f\in C[a,b]$，则 $f$ 可取到介于 $f(a)$ 与 $f(b)$ 之间的一切值。</li>
  <li>一致连续：</li>
</ul>

<p>微分</p>
<ul>
  <li>费马引理 Fermat’s Theorem：若 $f$ 在 $x_0$ 可导且在 $x_0$ 取极值，则 $f’(x_0)=0$。</li>
  <li>罗尔定理 Rolle’s Theorem: 若 $f\in [a,b]$，在 $(a,b)$ 内可导，且 $f(a)=f(b)$，则 $\exists\xi\in(a,b)$ 使得 $f’(\xi)=0$。</li>
  <li>拉格朗日中值定理 Lagrange Mean Value Theorem: 若 $f\in [a,b]$，在 $(a,b)$ 内可导，则 $\exists\xi\in(a,b)$ 使得<br />
$f(b)-f(a)=f’(\xi)(b-a)$。</li>
</ul>

<p>积分</p>
<ul>
  <li>黎曼积分: $\displaystyle\int_a^b f(x)dx=\lim_{\lambda\to 0}\sum_{i=1}^n f(\xi_i)\Delta x_i$。</li>
</ul>

<p>向量空间和拓扑中的极限</p>
<ul>
  <li>极限（向量空间），用范数（距离）定义接近。<br />
$\displaystyle\lim_{x\to x_0} f(x)=a \iff \forall\varepsilon&gt;0,\ \exists\delta&gt;0,\ 0&lt;|x-x_0|&lt;\delta\Rightarrow|f(x)-a|&lt;\varepsilon$</li>
  <li>极限（拓扑空间），只用开集定义接近，不需要距离。<br />
For every open set $U$ containing $x$, there exists $N$ such that $x_n\in U$ for all $n\ge N$.<br />
即 $x_n\to x \iff \forall\ \text{open } U\ni x,\ \exists N,\ n\ge N\Rightarrow x_n\in U$</li>
</ul>

<p>说明</p>
<ul>
  <li>文字描述利用<strong>定义</strong>来翻译。定义出现在条件中时可以展开，出现在结论中时需要构造。</li>
  <li>语言描述也可以转化为<strong>符号</strong>描述。</li>
</ul>

<h2 id="证明">证明</h2>

<p>这里选择一部分定理来证明。证明思路如下：</p>

<ul>
  <li>极限
    <ul>
      <li>三明治定义 &lt;- 极限定义</li>
    </ul>
  </li>
  <li>实数
    <ul>
      <li>单调有界 &lt;- 确界存在定理</li>
      <li>闭区间套 &lt;- 单调有界</li>
      <li>BW定理 &lt;- 闭区间套 或者 单调有界</li>
    </ul>
  </li>
  <li>连续
    <ul>
      <li>有界性 &lt;- BW定理（反证法）</li>
      <li>最值定理 &lt;- 有界性定理 + BW定理（反证法）</li>
      <li>零点定理 &lt;- 闭区间套定理（或确界存在定理）</li>
    </ul>
  </li>
  <li>微分
    <ul>
      <li>费马引理 &lt;- 函数极限的保号性 + 导数定义</li>
      <li>罗尔定理 &lt;- 最值定理 + 费马引理</li>
      <li>拉格朗日中值定理 &lt;- 罗尔定理（构造辅助函数）</li>
    </ul>
  </li>
  <li>积分</li>
</ul>

<p>注意定理是因为符合现实而正确，证明只是在寻找成立的条件。</p>

<h2 id="极限">极限</h2>
<h3 id="极限的定义">极限的定义</h3>

<p>数列极限</p>
<ul>
  <li>若∀ε&gt;0, ∃N∈N,n&gt;N⟹∣xn​−a∣&lt;ε则 n→∞lim​xn​=a。</li>
</ul>

<p>函数极限（x→x₀）</p>
<ul>
  <li>设 f(x) 在 x0​ 某去心邻域有定义，若∀ε&gt;0, ∃δ&gt;0,0&lt;∣x−x0​∣&lt;δ⟹∣f(x)−A∣&lt;ε 则 x→x0​lim​f(x)=A。</li>
</ul>

<h3 id="常见的极限">常见的极限</h3>

<p>利用极限的定义，构造对应的表达式。先根据结果反推需要的取值，在书写证明。</p>

<p>证明：n→∞lim​n1​=0<br />
要证：∀ε&gt;0, ∃N, n&gt;N⇒​n1​−0​&lt;ε。<br />
任给 ε&gt;0。<br />
要n1​&lt;ε⟺n&gt;ε1​<br />
取N=⌈ε1​⌉<br />
当 n&gt;N 时，必有 n&gt;ε1​，从而​n1​−0​=n1​&lt;ε<br />
故 n→∞lim​n1​=0。</p>

<p>证明：n→∞lim​n+1n​=1<br />
估计：​n+1n​−1​=​n+1−1​​=n+11​&lt;n1​<br />
任给 ε&gt;0。<br />
要 n1​&lt;ε⇒n&gt;ε1​。<br />
取 N=⌈ε1​⌉。<br />
当 n&gt;N，​n+1n​−1​&lt;n1​&lt;ε<br />
故 n→∞lim​n+1n​=1。</p>

<p>证明：∣q∣&lt;1 时 n→∞lim​qn=0<br />
只证 0&lt;q&lt;1（负的可加绝对值）。令 q=1+a1​, a&gt;0，则qn=(1+a)n1​&lt;1+na1​&lt;na1​<br />
任给 ε&gt;0。<br />
要na1​&lt;ε⟺n&gt;aε1​<br />
取 N=⌈aε1​⌉。<br />
当 n&gt;N，∣qn−0∣=qn&lt;na1​&lt;ε<br />
故 n→∞lim​qn=0 (∣q∣&lt;1)。</p>

<h3 id="极限的运算">极限的运算</h3>

<p>定理：若 x→x0​lim​f(x)=A，x→x0​lim​g(x)=B，则limx→x0​​[f(x)+g(x)]=A+B</p>

<p>证明：对任意 ε&gt;0，<br />
由 x→x0​lim​f(x)=A，存在 δ1​&gt;0，当0&lt;∣x−x0​∣&lt;δ1​时，有∣f(x)−A∣&lt;2ε​<br />
由 x→x0​lim​g(x)=B，存在 δ2​&gt;0，当0&lt;∣x−x0​∣&lt;δ2​时，有∣g(x)−B∣&lt;2ε​<br />
取 δ=min{δ1​,δ2​}，则当0&lt;∣x−x0​∣&lt;δ时，​[f(x)+g(x)]−(A+B)​=​[f(x)−A]+[g(x)−B]​≤∣f(x)−A∣+∣g(x)−B∣&lt;2ε​+2ε​=ε<br />
故limx→x0​​[f(x)+g(x)]=A+B</p>

<h3 id="三明治定理夹逼准则">三明治定理（夹逼准则）</h3>

<p><strong>定理</strong>：若 $y_n\le x_n\le z_n$，且 $\lim y_n=\lim z_n=A$，则 $\lim x_n=A$。</p>

<p><strong>证明</strong><br />
对任意 $\varepsilon&gt;0$，当 $n$ 足够大时：<br />
$A-\varepsilon &lt; y_n,\quad z_n &lt; A+\varepsilon$<br />
于是<br />
$A-\varepsilon &lt; y_n\le x_n\le z_n &lt; A+\varepsilon$<br />
即 $|x_n-A|&lt;\varepsilon$，故 $\lim x_n=A$。</p>

<h2 id="实数">实数</h2>

<h3 id="确界原理">确界原理</h3>

<p>通常作为公理使用。也可以从实数定义推导。</p>

<h3 id="单调有界定理">单调有界定理</h3>

<p><strong>定理</strong></p>

<p>若数列 ${x_n}$ 满足：</p>
<ol>
  <li>单调递增：$x_1 \le x_2 \le \dots \le x_n \le \cdots$</li>
  <li>有上界：$\exists M,\ \forall n,\ x_n \le M$<br />
则 ${x_n}$ 收敛，且 $\lim_{n\to\infty}x_n = \sup{x_n}$</li>
</ol>

<p><strong>证明</strong></p>

<ol>
  <li>由确界原理： 非空有上界数集必有上确界，记 $\xi = \sup{x_n}$</li>
  <li>由上确界定义： $\forall n,\ x_n \le \xi$ ； $\forall \varepsilon&gt;0,\ \exists N,\ x_N &gt; \xi - \varepsilon$</li>
  <li>
    <table>
      <tbody>
        <tr>
          <td>因 ${x_n}$ 单调递增：   当 $n&gt;N$ 时，   $\xi - \varepsilon &lt; x_N \le x_n \le \xi &lt; \xi + \varepsilon$   即   $</td>
          <td>x_n - \xi</td>
          <td>&lt; \varepsilon$</td>
        </tr>
      </tbody>
    </table>
  </li>
  <li>由极限定义：   $\lim_{n\to\infty}x_n = \xi$</li>
</ol>

<p><em>递减情形（一句话）</em><br />
单调递减有下界 $\implies$ 必有下确界 $\eta = \inf{x_n}$，同理可证</p>

<p>$\lim_{n\to\infty}x_n = \eta$</p>

<h3 id="闭区间套定理">闭区间套定理</h3>

<p>满足区间套条件的所有闭区间有唯一公共点，且左右端点都收敛于这个点。</p>

<p>定理</p>

<p>设闭区间列 ${[a_n,b_n]}$ 满足：</p>
<ol>
  <li>区间套条件：$[a_1,b_1] \supset [a_2,b_2] \supset \dots \supset [a_n,b_n] \supset \cdots$<br />
即：   $a_1 \le a_2 \le \dots \le a_n \le \dots \le b_n \le \dots \le b_2 \le b_1$</li>
  <li>长度趋于 0：$\displaystyle\lim_{n\to\infty}(b_n-a_n)=0$<br />
则存在唯一的实数 $\xi$，使得$\xi \in \bigcap_{n=1}^{\infty} [a_n,b_n]$ 且 $\lim_{n\to\infty}a_n=\lim_{n\to\infty}b_n=\xi$</li>
</ol>

<p><strong>证明</strong>（用确界原理证明）</p>

<p>存在性</p>

<p>由区间套条件：</p>
<ul>
  <li>数列 ${a_n}$ 单调递增且有上界（任一 $b_n$ 都是上界）；</li>
  <li>数列 ${b_n}$ 单调递减且有下界（任一 $a_n$ 都是下界）。</li>
</ul>

<p>根据单调有界定理（由确界原理推出）：   ${a_n}$ 收敛，记 $\displaystyle\lim_{n\to\infty}a_n = \xi$。</p>

<p>又   $\lim_{n\to\infty}b_n = \lim_{n\to\infty}\big[(b_n-a_n)+a_n\big] = 0 + \xi = \xi$</p>

<p>对任意 $n$：   $a_n \le \xi \le b_n$   故   $\xi \in \bigcap_{n=1}^{\infty}[a_n,b_n]$</p>

<p>唯一性</p>

<table>
  <tbody>
    <tr>
      <td>假设另有 $\eta \in \displaystyle\bigcap_{n=1}^{\infty}[a_n,b_n]$，则   $</td>
      <td>\xi-\eta</td>
      <td>\le b_n - a_n,\quad \forall n$</td>
    </tr>
  </tbody>
</table>

<table>
  <tbody>
    <tr>
      <td>令 $n\to\infty$，$b_n-a_n\to0$，得   $</td>
      <td>\xi-\eta</td>
      <td>=0 \implies \xi=\eta$</td>
    </tr>
  </tbody>
</table>

<p>唯一性得证。</p>

<h3 id="bolzanoweierstrass-定理">Bolzano–Weierstrass 定理</h3>

<p><strong>定理</strong>：有界数列必有收敛子列。</p>

<p><strong>证明</strong>1（用区间套定理）：<br />
设 ${x_n}\subset[a,b]$，不断二等分区间，每次选含无穷多项的一半，得闭区间套<br />
\([a_1,b_1]\supset[a_2,b_2]\supset\cdots,\quad b_n-a_n\to0.\)<br />
由区间套定理，$\exists\xi\in\bigcap[a_n,b_n]$，且 $\lim a_n=\lim b_n=\xi$。<br />
在第 $k$ 个区间内取 $x_{n_k}$（下标严格递增），由夹逼准则：<br />
\(\lim_{k\to\infty}x_{n_k}=\xi.\)<br />
故 ${x_{n_k}}$ 是收敛子列。</p>

<p><strong>证明</strong>2（用单调有界定理）：<br />
称 $x_n$ 为<strong>巨项</strong>，若对所有 $m&gt;n$ 有 $x_n\ge x_m$。</p>

<ol>
  <li>若有无穷多巨项 $\Rightarrow$ 可取出<strong>单调递减子列</strong>；</li>
  <li>若只有有限个巨项 $\Rightarrow$ 从某项后可取出<strong>单调递增子列</strong>。</li>
</ol>

<p>总之，<strong>任一数列必有单调子列</strong>。<br />
又原数列有界，故此单调子列<strong>单调有界</strong>。<br />
由单调有界定理，该子列必收敛。</p>

<h2 id="连续">连续</h2>

<h3 id="连续的定义">连续的定义</h3>

<p>对任意 ε&gt;0，存在 δ&gt;0，当∣x−x0​∣&lt;δ时，有∣f(x)−f(x0​)∣&lt;ε 则称 f(x) 在点 x0​ <strong>连续</strong>。</p>

<p>很多常见函数都是连续的，且运算之后也是连续的。这里证明略过。</p>

<p>连续函数在闭区间上的性质</p>

<h3 id="有界性定理-boundedness-theorem">有界性定理 Boundedness Theorem</h3>

<p><strong>定理</strong>：若 $f(x)$ 在 $[a,b]$ 连续，则 $f(x)$ 在 $[a,b]$ 有界。</p>

<p><strong>证明</strong>（用BW定理，反证法）：<br />
反证。假设 $f$ 无界，则 $\forall n,\ \exists x_n\in[a,b],\ |f(x_n)|&gt;n$。<br />
${x_n}$ 有界，由致密性定理，存在子列 $x_{n_k}\to x_0\in[a,b]$。<br />
由连续性：$\lim\limits_{k\to\infty}f(x_{n_k})=f(x_0)$，<br />
与 $|f(x_{n_k})|&gt;n_k\to\infty$ 矛盾。<br />
故 $f$ 在 $[a,b]$ 有界。</p>

<h3 id="最值定理-extreme-value-theorem">最值定理 Extreme Value Theorem</h3>

<p><strong>定理</strong>：若 $f(x)$ 在 $[a,b]$ 连续，则 $f$ 可取到最大值、最小值。</p>

<p><strong>证明</strong>：<br />
由有界性，设 $M=\sup\limits_{[a,b]}f(x)$。<br />
则 $\forall n,\ \exists x_n\in[a,b],\ M-\dfrac1n&lt;f(x_n)\le M$。<br />
${x_n}$ 有子列 $x_{n_k}\to \xi_1\in[a,b]$。<br />
由连续性：$\lim\limits_{k\to\infty}f(x_{n_k})=f(\xi_1)=M$。<br />
即 $f(\xi_1)=\max f$。同理可证最小值。</p>

<h3 id="介值定理-intermediate-value-theorem">介值定理 Intermediate Value Theorem</h3>
<p><strong>定理</strong>：$f\in C[a,b]$，$\mu$ 介于 $f(a),f(b)$ 之间，则 $\exists\xi\in(a,b),\ f(\xi)=\mu$。</p>

<p><strong>证明</strong>（用闭区间套定理）：<br />
令 $F(x)=f(x)-\mu$，不妨 $F(a)&lt;0,F(b)&gt;0$。<br />
用二分法构造闭区间套 $[a_n,b_n]$，满足：<br />
$F(a_n)&lt;0,\ F(b_n)&gt;0,\ b_n-a_n\to0.$<br />
由闭区间套定理，$\exists\xi\in\bigcap[a_n,b_n]$，且 $a_n\to\xi,\ b_n\to\xi$。<br />
由连续性：<br />
$F(\xi)=\lim F(a_n)\le0,\quad F(\xi)=\lim F(b_n)\ge0 \Rightarrow F(\xi)=0\Rightarrow f(\xi)=\mu.$</p>

<h3 id="零点存在定理-bolzanos-theorem">零点存在定理 Bolzano’s Theorem</h3>
<p><strong>定理</strong>：$f\in C[a,b]$，$f(a)f(b)&lt;0$，则 $\exists\xi\in(a,b),\ f(\xi)=0$。</p>

<p><strong>证明</strong>（介值定理的特殊情况）：<br />
在介值定理中取 $\mu=0$，<br />
由 $f(a),f(b)$ 异号，$0$ 介于两者之间，<br />
故 $\exists\xi\in(a,b)$，使 $f(\xi)=0$。</p>

<h2 id="微分">微分</h2>

<h3 id="导数的定义">导数的定义</h3>

<h3 id="费马引理-fermats-theorem">费马引理 Fermat’s Theorem</h3>

<p><strong>条件</strong> $f(x)$ 在 $x_0$ 处可导，且在 $x_0$ 取极值。 <strong>结论</strong> $f’(x_0)=0$</p>

<p><strong>证明</strong>（利用导数定义）</p>
<ul>
  <li>不妨设 $x_0$ 为极大值点，则 $\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x} \begin{cases} \ge 0,\ \Delta x&lt;0\ \le 0,\ \Delta x&gt;0 \end{cases}$</li>
  <li>取极限 $\Delta x\to0$：$f’(x_0)\ge 0,\quad f’(x_0)\le 0 \Rightarrow f’(x_0)=0$</li>
</ul>

<h3 id="罗尔定理-rolles-theorem">罗尔定理 Rolle’s Theorem</h3>

<p><strong>条件</strong></p>
<ol>
  <li>$f(x)$ 在 $[a,b]$ 连续</li>
  <li>$f(x)$ 在 $(a,b)$ 可导</li>
  <li>$f(a)=f(b)$</li>
</ol>

<p><strong>结论</strong><br />
$\exists\ \xi\in(a,b)$，使 $f’(\xi)=0$</p>

<p><strong>证明</strong>（利用最值定理+费马引理）</p>
<ul>
  <li>$f$ 在 $[a,b]$ 连续 ，由最值定理，有最大值 $M$、最小值 $m$。</li>
  <li>若 $M=m$，则 $f$ 为常数，$f’\equiv0$，任取 ξ∈(a,b) 即可。</li>
  <li>若 $M&gt;m$，因 f(a)=f(b)，故 M 或 m 必在内部某点 ξ∈(a,b) 取得。</li>
  <li>内部最值点必为极值点，由费马引理：$f’(\xi)=0$。</li>
</ul>

<h3 id="拉格朗日中值定理">拉格朗日中值定理</h3>

<p><strong>条件</strong></p>
<ol>
  <li>$f(x)$ 在 $[a,b]$ 连续</li>
  <li>$f(x)$ 在 $(a,b)$ 可导</li>
</ol>

<p><strong>结论</strong><br />
$f(b)-f(a)=f’(\xi)(b-a)$</p>

<p><strong>证明</strong>（利用罗尔定理）</p>
<ul>
  <li>构造辅助函数：$\varphi(x)=f(x)-f(a)-\frac{f(b)-f(a)}{b-a}(x-a)$</li>
  <li>则$\varphi(a)=\varphi(b)=0$</li>
  <li>由罗尔定理，$\exists\ \xi\in(a,b)$ 使 $\varphi’(\xi)=0$，即$f’(\xi)=\frac{f(b)-f(a)}{b-a}$</li>
</ul>

<h3 id="柯西中值定理">柯西中值定理</h3>

<p><strong>条件</strong></p>
<ol>
  <li>$f,g$ 在 $[a,b]$ 连续</li>
  <li>$f,g$ 在 $(a,b)$ 可导</li>
  <li>$g’(x)\neq 0$</li>
</ol>

<p><strong>结论</strong></p>

<p>$\frac{f(b)-f(a)}{g(b)-g(a)}=\frac{f’(\xi)}{g’(\xi)}$</p>

<p><strong>证明</strong></p>
<ul>
  <li>构造： $\varphi(x)=f(x)-f(a)-\frac{f(b)-f(a)}{g(b)-g(a)}\big(g(x)-g(a)\big)$</li>
  <li>则 $\varphi(a)=\varphi(b)=0$</li>
  <li>由罗尔定理，$\exists\ \xi$ 使 $\varphi’(\xi)=0$，整理即得。</li>
</ul>

<h1 id="附录">附录</h1>

<p>逻辑</p>

<p>量词、量词的否定、量词的嵌套。</p>
<ul>
  <li>∀ε&gt;0, ∃δ&gt;0, ∀x (0&lt;∣x−a∣&lt;δ⇒∣f(x)−A∣&lt;ε)</li>
  <li>不收敛，上面的否定命题是∃ε&gt;0, ∀δ&gt;0, ∃x (0&lt;∣x−a∣&lt;δ 且 ∣f(x)−A∣≥ε)，即找到这样的反例就不收敛。即存在一个正数 ε0​，无论你取多小的 δ&gt;0，都至少存在一个点 ** x 满足：x 在 a 的 δ 邻域内，但 f(x) 离 A 仍然不小于 ε0​。</li>
</ul>

<p>代数</p>

<p>向量（矢量）的定义：</p>
<ul>
  <li>既有大小，又有方向的量。</li>
  <li>满足<strong>加法</strong>交换律、结合律、有零元、有负元，<strong>数乘</strong>满足四条分配与结合律、1 乘不变的集合元素，就是向量。通过运算来定义。</li>
  <li>通过数组来定义。</li>
</ul>

<p>统计</p>

<p>大数定律：样本量越大，样本均值依概率收敛到总体均值。</p>
<ul>
  <li>对任意 ε&gt;0，limn→∞​P(∣Xˉn​−μ∣&lt;ε)=1</li>
  <li>强大数定律 ⇒ 弱大数定律</li>
</ul>

<p>参考资料</p>
<ul>
  <li>《数学分析原理》（Principles of Mathematical Analysis， Rudin 著）</li>
  <li>《》</li>
</ul>]]></content><author><name>Lenna Hammer</name></author><summary type="html"><![CDATA[目前这里数学公式显示有点问题。]]></summary></entry><entry><title type="html">Ruby代码片段3 常见算法</title><link href="/zh/2026/01/18/Ruby%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B53-%E5%B8%B8%E8%A7%81%E7%AE%97%E6%B3%95.html" rel="alternate" type="text/html" title="Ruby代码片段3 常见算法" /><published>2026-01-18T00:00:00+00:00</published><updated>2026-01-18T00:00:00+00:00</updated><id>/zh/2026/01/18/Ruby%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B53-%E5%B8%B8%E8%A7%81%E7%AE%97%E6%B3%95</id><content type="html" xml:base="/zh/2026/01/18/Ruby%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B53-%E5%B8%B8%E8%A7%81%E7%AE%97%E6%B3%95.html"><![CDATA[<p><del>这个文件移动到 2，要不要把娱乐移动到这里。</del></p>
<h2 id="快速排序">快速排序</h2>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 快速排序的 Ruby 实现</span>

<span class="k">def</span> <span class="nf">quick_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">left</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="n">arr</span><span class="p">.</span><span class="nf">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
  <span class="k">return</span> <span class="n">arr</span> <span class="k">if</span> <span class="n">left</span> <span class="o">&gt;=</span> <span class="n">right</span>
  
  <span class="n">pivot_index</span> <span class="o">=</span> <span class="n">partition</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">)</span>
  <span class="n">quick_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">pivot_index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
  <span class="n">quick_sort</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">pivot_index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">right</span><span class="p">)</span>
  
  <span class="n">arr</span>
<span class="k">end</span>

<span class="k">def</span> <span class="nf">partition</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">)</span>
  <span class="c1"># 选择最右边的元素作为基准</span>
  <span class="n">pivot</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">right</span><span class="p">]</span>
  <span class="n">i</span> <span class="o">=</span> <span class="n">left</span> <span class="o">-</span> <span class="mi">1</span>
  
  <span class="p">(</span><span class="n">left</span><span class="o">...</span><span class="n">right</span><span class="p">).</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">j</span><span class="o">|</span>
    <span class="k">if</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">pivot</span>
      <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
      <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
    <span class="k">end</span>
  <span class="k">end</span>
  
  <span class="c1"># 将基准放到正确位置</span>
  <span class="n">arr</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">right</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">right</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
  <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">end</span>




</code></pre></div></div>

<h2 id="二分查找">二分查找</h2>

<p>注意边界条件，很容易弄错。</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 二分查找的 Ruby 实现</span>

<span class="k">def</span> <span class="nf">binary_search</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span>
  <span class="n">left</span> <span class="o">=</span> <span class="mi">0</span>
  <span class="n">right</span> <span class="o">=</span> <span class="n">arr</span><span class="p">.</span><span class="nf">length</span> <span class="o">-</span> <span class="mi">1</span>
  
  <span class="k">while</span> <span class="n">left</span> <span class="o">&lt;=</span> <span class="n">right</span>
    <span class="n">mid</span> <span class="o">=</span> <span class="n">left</span> <span class="o">+</span> <span class="p">(</span><span class="n">right</span> <span class="o">-</span> <span class="n">left</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>  <span class="c1"># 避免溢出</span>
    
    <span class="k">if</span> <span class="n">arr</span><span class="p">[</span><span class="n">mid</span><span class="p">]</span> <span class="o">==</span> <span class="n">target</span>
      <span class="k">return</span> <span class="n">mid</span>  <span class="c1"># 找到目标，返回索引</span>
    <span class="k">elsif</span> <span class="n">arr</span><span class="p">[</span><span class="n">mid</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">target</span>
      <span class="n">left</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span>  <span class="c1"># 目标在右半部分</span>
    <span class="k">else</span>
      <span class="n">right</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">-</span> <span class="mi">1</span>  <span class="c1"># 目标在左半部分</span>
    <span class="k">end</span>
  <span class="k">end</span>
  
  <span class="o">-</span><span class="mi">1</span>  <span class="c1"># 未找到</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="最小生成树">最小生成树</h2>

<h2 id="最短距离">最短距离</h2>

<p>数值算法</p>

<h2 id="附录">附录</h2>

<p>参考资料</p>
<ul>
  <li>Project Euler</li>
  <li>LeetCode</li>
</ul>]]></content><author><name>Lenna Hammer</name></author><summary type="html"><![CDATA[这个文件移动到 2，要不要把娱乐移动到这里。 快速排序]]></summary></entry><entry><title type="html">Latex的使用</title><link href="/zh/2026/01/17/LaTeX%E7%9A%84%E4%BD%BF%E7%94%A8.html" rel="alternate" type="text/html" title="Latex的使用" /><published>2026-01-17T00:00:00+00:00</published><updated>2026-01-17T00:00:00+00:00</updated><id>/zh/2026/01/17/LaTeX%E7%9A%84%E4%BD%BF%E7%94%A8</id><content type="html" xml:base="/zh/2026/01/17/LaTeX%E7%9A%84%E4%BD%BF%E7%94%A8.html"><![CDATA[<p>一些入门知识，适用于在集成好的环境中快速上手，并补充一些为完成学术写作所必要的背景知识。针对一些希望表达的意图，提供完成的方法。</p>

<p>这里也是记录，把用来的东西记录下来。</p>

<h2 id="基本用法">基本用法</h2>

<p>最基本的用法首先是输入文本，然后调整格式。</p>

<p>常见元素用法如下：</p>
<ol>
  <li><strong>文本样式</strong>有 <strong>粗体</strong> <code class="language-plaintext highlighter-rouge">\textbf{}</code> <em>斜体</em> <code class="language-plaintext highlighter-rouge">\textit{}</code> 作为书名 [下划线]{.underline} <code class="language-plaintext highlighter-rouge">\underline{}</code> <code class="language-plaintext highlighter-rouge">引文</code> <code class="language-plaintext highlighter-rouge">\verb|...|</code>。</li>
  <li><strong>注释</strong>行用 <code class="language-plaintext highlighter-rouge">%</code></li>
  <li><strong>段落</strong>用空行（两个换行）表示，一个换行会被吃掉。英文<strong>标点</strong> <code class="language-plaintext highlighter-rouge">``引号''</code>前后是不同符号 。这样，输入一些符号需要反斜杠\ 转义。</li>
  <li><strong>数学公式</strong>环境，行内使用 <code class="language-plaintext highlighter-rouge">$ $</code> 公式块使用 <code class="language-plaintext highlighter-rouge">\[ \]</code>，效果如 $f(x)=\sin(x)$。某些环境给公式带编号用然后引用。</li>
  <li><strong>章节</strong>用 <code class="language-plaintext highlighter-rouge">\section{}</code> 以及 <code class="language-plaintext highlighter-rouge">\subsection{}</code>。会自动编号，用来生成对应的目录显示为 ` ` 或者 pdf 文附带件的大纲。</li>
  <li><strong>列表</strong> 用 <code class="language-plaintext highlighter-rouge">\begin{itemize}</code> 编号列表（会自动按前后顺序编号）用 <code class="language-plaintext highlighter-rouge">\begin{enumerate}</code> ，其中的列表项目用 <code class="language-plaintext highlighter-rouge">\item</code> 。</li>
  <li><strong>图片</strong>用 <code class="language-plaintext highlighter-rouge">\includegraphics{}</code>。论文中通常放在 <code class="language-plaintext highlighter-rouge">\begin{figure}</code> 位置跟随页面在顶端<em>居中</em>并包含<em>标题</em> <code class="language-plaintext highlighter-rouge">\caption{...}</code>，不随跟随文本位置，然后通过交叉引用来指明。</li>
  <li><strong>表格</strong>（含线） <code class="language-plaintext highlighter-rouge">\begin{tabular}{|c|c|c|}\hline</code> 用 <code class="language-plaintext highlighter-rouge">&amp;</code> 和 <code class="language-plaintext highlighter-rouge">\\</code> 分隔列和行。线条样式常用三线表。表格位置可以类似图片放在 <code class="language-plaintext highlighter-rouge">\begin{table}</code> 中跟随页面，并通过引用来使用。</li>
  <li><strong>代码块</strong> 用 <code class="language-plaintext highlighter-rouge">\begin{verbatim}</code> 行内用 <code class="language-plaintext highlighter-rouge">\verb||</code>，如需伪代码或代码高亮可以用其他的包。通常位置类似图片。</li>
  <li><strong>交叉引用</strong> 使用 <code class="language-plaintext highlighter-rouge">\ref{label:1}</code>（显示为数字编号），用来引用章节、图片（以及页码、公式）。在被引用对象后面添加 <code class="language-plaintext highlighter-rouge">\label{label:1}</code>。例如当前是在第 <a href="#label1">[label1]</a>{reference-type=”ref” reference=”label1”} 节、第 页。</li>
  <li><strong>参考文献</strong>用BibTeX 把文献列表放在 .bib 文件中，然后 <code class="language-plaintext highlighter-rouge">\cite{...}</code> 引用.需要文档最后放上 <code class="language-plaintext highlighter-rouge">\bibliography{bib文件名}</code>，并多编译几次，就不显示为问号了。这里显示为[@einstein]。通常习惯取名为作者+年份+短标题。注意 tex 和 latex 不一样。</li>
  <li><strong>多文件</strong>项目用 <code class="language-plaintext highlighter-rouge">\include{...}</code> 作为段落 以及 <code class="language-plaintext highlighter-rouge">\input{...}</code> 用来嵌入文本。合理利用以加速编译。</li>
  <li><strong>中文文档</strong>使用 <code class="language-plaintext highlighter-rouge">\usepackage{ctex}</code> 并用 XeLaTeX 编译（有时要加参数 <code class="language-plaintext highlighter-rouge">-shell-escape</code>），这样每段段首会空两格。如果仅需中文显示，只用 <code class="language-plaintext highlighter-rouge">\usepackage{xeCJK}</code>。</li>
</ol>

<p>说明：</p>
<ul>
  <li>以下是在建好文档后基本的文本格式操作。对于某一些非视觉的文本的效果，可以直接编辑文本也可以用一些已有的指令自动创建。</li>
  <li>对于论文中出现的非文本元素，如图表、表格和伪代码，以如下方式插入。这些元素可以出现在文本中，也通常浮动float在论文页面的固定位置。</li>
  <li>相比以上直接输入内容和调整格式，以下的操作的会在格式上和编号上都有自动生成的内容。</li>
  <li>首先是会自动编号的层次型结构。</li>
  <li>然后是编号的前后引用。</li>
  <li>为了在当前论文的不同位置或元素之间，以及相关文档之间建立链接，并由系统自动维护编号，可以使用交叉引用和参考文献功能。</li>
  <li>编辑tex文件，直接使用任何常用的文本编辑器都是可以的。一些综合的原文件的例子，见这个文档的后面的内容。编译文档到PDF文件可以使用命令行，或者选择让IDE自动进行。</li>
  <li>参考文献和交叉引用需要多次编译才能正确显示编号。</li>
</ul>

<h2 id="其他用法">其他用法</h2>

<ul>
  <li><strong>浮动元素</strong>：图片、表格和伪代码通常放置为页面上元素，不随跟随文本位置，然后通过交叉引用来指明。</li>
  <li><strong>图片</strong>：图片宽度，图片分栏，</li>
  <li><strong>标题</strong>（包含作者、日期）、目录<code class="language-plaintext highlighter-rouge">\tableofcontents</code></li>
  <li><strong>双栏文档</strong></li>
  <li><strong>演示文稿</strong> Beamer frame section</li>
  <li><strong>示意图</strong> tikz 配合编辑器的预览功能使用</li>
  <li><strong>代码块</strong>用 verbatim 语法高亮用额外的包 listings</li>
  <li><strong>伪代码</strong>的格式效果可以使用 algorithm - 包提供的环境放置浮动位置，然后加上使用 algpseudocode 包提供的 - algorithmic 环境（用来代替之前的 algorithmic 包，并提供兼容用的 - algcompatible 包） 。或者使用 algorithm2e - 包书写伪代码。注意这是两种不同的书写格式，且一个文档里只使用一种包。
    <ul>
      <li>:::: algorithm</li>
      <li>::: algorithmic</li>
    </ul>
  </li>
</ul>

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code>	
<span class="c">% 参考文献。应放在\backmatter之前。</span>
<span class="c">% 推荐使用BibTeX，若不使用BibTeX时注释掉下面一句。</span>
<span class="c">%\nocite{*}</span>
<span class="k">\bibliography</span><span class="p">{</span>sample<span class="p">}</span>


<span class="c">% 附录，必须放在参考文献后，backmatter前</span>
<span class="k">\appendix</span>
<span class="c">%\begin{lstlisting}[language=C]</span>
<span class="c">%int main()</span>
<span class="c">%{</span>
<span class="c">%   return 0;</span>
<span class="c">%}</span>
<span class="c">%\end{lstlisting}</span>

<span class="c">%\chapter{算法}</span>
<span class="c">%</span>
<span class="c">%\begin{algorithm}[htbp]</span>
<span class="c">%  \caption{算法名字}</span>
<span class="c">%  \label{alg:alg1}</span>
<span class="c">%  \begin{algorithmic}[1]</span>
<span class="c">%        \REQUIRE 这是输入</span>
<span class="c">%        \ENSURE 这是输出</span>
<span class="c">%        \WHILE {flag}</span>
<span class="c">%             \STATE 这是语句</span>
<span class="c">%        \ENDWHILE</span>
<span class="c">%  \end{algorithmic}</span>
<span class="c">%\end{algorithm}</span>
<span class="c">%</span>
<span class="c">%\chapter{实验验证}</span>
<span class="c">%</span>
<span class="c">%\begin{figure}[htbp]</span>
<span class="c">%  \centering</span>
<span class="c">%  \includegraphics[width=0.6\linewidth]{./figure/github.jpg}</span>
<span class="c">%  \caption{单图示例}</span>
<span class="c">%  \label{fig:system}</span>
<span class="c">%\end{figure}</span>
<span class="c">%</span>
<span class="c">%实验硬件设备如图\ref{img:1}所示。</span>
<span class="c">%\begin{figure}[htbp]</span>
<span class="c">%\begin{minipage}[t]{0.5\textwidth}</span>
<span class="c">%\centering</span>
<span class="c">%\includegraphics[width=0.8\textwidth]{./figure/github.jpg}</span>
<span class="c">%\caption{实验硬件设备总览}</span>
<span class="c">%\label{img:1}</span>
<span class="c">%\end{minipage}</span>
<span class="c">%\begin{minipage}[t]{0.5\textwidth}</span>
<span class="c">%\centering</span>
<span class="c">%\includegraphics[width=0.8\textwidth]{./figure/github.jpg}</span>
<span class="c">%\caption{实验测量示意图}</span>
<span class="c">%\label{img:2}</span>
<span class="c">%\end{minipage}</span>
<span class="c">%\end{figure}</span>
<span class="c">%</span>
<span class="c">%图\ref{fig:sub}所示子图\ref{subfig:a}和子图\ref{subfig:b}。</span>
<span class="c">%\begin{figure}[H]</span>
<span class="c">%   \begin{subfigure}{.5\textwidth}</span>
<span class="c">%       \centering</span>
<span class="c">%       \includegraphics[width=0.8\textwidth]{./figure/github.jpg}</span>
<span class="c">%       \caption{子图}</span>
<span class="c">%       \label{subfig:a}</span>
<span class="c">%   \end{subfigure}</span>
<span class="c">%   \begin{subfigure}{.5\textwidth}</span>
<span class="c">%       \centering</span>
<span class="c">%       \includegraphics[width=0.8\textwidth]{./figure/github.jpg}</span>
<span class="c">%       \caption{子图}</span>
<span class="c">%       \label{subfig:b}</span>
<span class="c">%   \end{subfigure}</span>
<span class="c">%\caption{子图样例}</span>
<span class="c">%\label{fig:sub}</span>
<span class="c">%\end{figure}</span>

<span class="c">%\section{章节}\label{subsec:mptcp_conges}</span>

<span class="c">%\chapter{绪论}\label{chapter_introduction}</span>
<span class="c">%\section{研究背景}</span>
<span class="c">%使用.bib文件管理参考文献引用，引用示例：\cite{BHR12}.\par</span>
</code></pre></div></div>

<h3 id="新建文档">新建文档</h3>

<p>空白文档示例</p>
<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">\documentclass</span><span class="na">[10pt,letterpaper]</span><span class="p">{</span>article<span class="p">}</span>
<span class="k">\usepackage</span><span class="na">[utf8]</span><span class="p">{</span>inputenc<span class="p">}</span> <span class="c">% 文件编码，默认 utf-8</span>
<span class="c">% \usepackage{ctex} % 中文版式</span>

<span class="k">\title</span><span class="p">{</span>LaTeX 的使用<span class="p">}</span>
<span class="k">\author</span><span class="p">{</span>...<span class="p">}</span>
<span class="k">\date</span><span class="p">{</span>...<span class="p">}</span>
<span class="nt">\begin{document}</span>
<span class="k">\maketitle</span>
<span class="c">% 正文在这里</span>
<span class="nt">\end{document}</span>

</code></pre></div></div>

<h3 id="浮动图表">浮动图表</h3>

<p>页面浮动元素，可以是插图，表格，伪代码。</p>

<p>图片</p>
<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">\begin{figure}</span>[hbt!]
<span class="k">\centering</span>
<span class="k">\includegraphics</span><span class="na">[width=0.3\linewidth]</span><span class="p">{</span>lion-logo.png<span class="p">}</span>
<span class="k">\caption</span><span class="p">{</span>This image will be referenced below<span class="p">}</span>
<span class="k">\label</span><span class="p">{</span>fig:lion<span class="p">}</span>
<span class="nt">\end{figure}</span>
You can reference images, for instance, figure <span class="k">\ref</span><span class="p">{</span>fig:lion<span class="p">}</span> shows 
the logo of the red lion logo.
</code></pre></div></div>

<p>多图</p>

<p>表格</p>
<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Table <span class="k">\ref</span><span class="p">{</span>table:data<span class="p">}</span> is an example of referenced <span class="k">\LaTeX</span><span class="p">{}</span> elements.

<span class="nt">\begin{table}</span>[h!]
<span class="k">\centering</span>
<span class="nt">\begin{tabular}</span><span class="p">{</span>||c c c c||<span class="p">}</span> 
<span class="k">\hline</span>
Col1 <span class="p">&amp;</span> Col2 <span class="p">&amp;</span> Col2 <span class="p">&amp;</span> Col3 <span class="k">\\</span> [0.5ex] 
<span class="k">\hline\hline</span>
1 <span class="p">&amp;</span> 6 <span class="p">&amp;</span> 87837 <span class="p">&amp;</span> 787 <span class="k">\\</span> 
2 <span class="p">&amp;</span> 7 <span class="p">&amp;</span> 78 <span class="p">&amp;</span> 5415 <span class="k">\\</span>
3 <span class="p">&amp;</span> 545 <span class="p">&amp;</span> 778 <span class="p">&amp;</span> 7507 <span class="k">\\</span>
4 <span class="p">&amp;</span> 545 <span class="p">&amp;</span> 18744 <span class="p">&amp;</span> 7560 <span class="k">\\</span>
5 <span class="p">&amp;</span> 88 <span class="p">&amp;</span> 788 <span class="p">&amp;</span> 6344 <span class="k">\\</span> [1ex] 
<span class="k">\hline</span>
<span class="nt">\end{tabular}</span>
<span class="k">\caption</span><span class="p">{</span>Table to test captions and labels<span class="p">}</span>
<span class="k">\label</span><span class="p">{</span>table:data<span class="p">}</span>
<span class="nt">\end{table}</span>
</code></pre></div></div>

<p>流程图</p>

<p>伪代码</p>

<h3 id="数学公式">数学公式</h3>

<ol>
  <li>数学公式编号用 <code class="language-plaintext highlighter-rouge">\begin{equation}</code></li>
  <li>多行对齐用 <code class="language-plaintext highlighter-rouge">\begin{align}</code></li>
  <li>引用数学公式的自动编号用</li>
  <li>矩阵 $\begin{bmatrix}<br />
    1 &amp; 2 \<br />
    3 &amp; 4 \<br />
    \end{bmatrix}$</li>
  <li>分段函数</li>
</ol>

<p>定理<br />
公式编号 用 label<br />
微积分，泰勒级数<br />
矩阵，<br />
概率，大数定理<br />
定理证明<br />
定义</p>

<p>::: theorem<br />
<strong>定理 1</strong>. <em>Let $f$ be a function whose derivative exists in every<br />
point, then $f$ is a continuous function.</em><br />
:::</p>

<p>::: lemma<br />
<strong>Lemma 2</strong>. <em>Given two line segments whose lengths are $a$ and $b$<br />
respectively there is a real number $r$ such that $b=ra$.</em><br />
:::</p>

<p>To prove it by contradiction try and assume that the statement is false,<br />
proceed from there and at some point you will arrive to a contradiction.</p>

<h3 id="演示文稿">演示文稿</h3>

<h3 id="书籍排版">书籍排版</h3>

<p>章节</p>

<p>目录</p>
<h2 id="数据整理">数据整理</h2>
<h3 id="使用-excel-整理数据">使用 Excel 整理数据</h3>

<p>Excel 是一个很直观和方便的数据展示和处理工具，有需要时也可以用 matlab 或 python 脚本。</p>

<p>表格的基本操作</p>
<ol>
  <li>csv文件导出。</li>
  <li>数据透视表用来对原始数据进行分类汇总，也用来长表转宽表。</li>
</ol>

<p>可视化分析</p>

<p>线性回归</p>

<p>线性回归可以扩展到回归分析，进而到一些机器学习的方法，例如建立多分类模型</p>

<p>假设验证</p>

<p>规划求解</p>

<p>读取数据，可以从 csv 文件读取</p>

<p>导出表格，导出图片</p>

<p>可视化</p>

<p>线性回归</p>

<p>统计分析可以直接用公式或者在插件中开启专门的工具。</p>

<p>常用的如 pair t test 一组不同的实验对象，用两种待比较的方法得到每个实验对象在两种情况下的结果，可以用成对t检验判断方法造成的差异是否显著。</p>

<p>显著性水平双侧取 $\alpha=$ 单侧取 $\alpha=$，计算 $p&lt;\alpha$</p>

<p>假设 $x_i-y_i \sim N$</p>

<p><strong>单变量求解</strong> 即 单变量等式求根.</p>

<p>一个单元格表示需要求解的变量 $x$<br />
，另一个是单元格的内容是引用这个变量的公式 $f(x)$ ，解方程 $f(x)=0$ 。</p>

<p><strong>规划求解</strong>（需要在插件中开启）</p>

<p>每个变量占一个相邻的单元格，目标函数=公式的形式写在单元格了，然后在求解器对话框中执行是哪些单元格。<br />
约束条件的表达式也以公式的形式写在单元格内，相邻单元格可以同时添加到求解器的对话框中。<br />
常用有线性规划，整数线性规划，非线性规划。</p>

<p>对于常见线性规划线性目标和线性约束，标准型是小于等于约束。且能保证最快多项式时间找到全局最优解.</p>

<p>预测工作表功能用于多时间序列数据基于历史值对未来值进行预测。</p>

<p>交互</p>

<p>在 LibreOffice Calc（一个开源的 Excel 实现）上， 统计 Tools 菜单下 Goal Seek 和 Solver.</p>

<h3 id="使用-matlab-整理数据">使用 MatLab 整理数据</h3>

<p>也可以使用 Octave 或者 Python</p>

<p>读取数据</p>

<p>从文本中读取矩阵可以用 load<br />
，此时以非数字作为分割符，注意每行元素个数相等.</p>

<p>画图</p>

<p>figure plot hold on title</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>x = -10*pi:0.1:10*pi
y1 = sin(x)
y2 = cos(x)
plot(x,y1)
plot(x,y2)
</code></pre></div></div>

<p>统计分析</p>

<p>load</p>

<p><code class="language-plaintext highlighter-rouge">[h,p] = ttest(x,y)</code> 其中 x,y 是向量，返回 h=1 表示拒绝零假设。</p>

<p>默认双侧 alpha 取 0.05</p>

<p>处理图片</p>

<p>matlab可以通过矩阵的形式处理图像数据。</p>

<p>图像的读写与显示 imread、imshow、imsave</p>

<p>二值化，通过阈值或者其他的分割方法</p>

<p>特征提取，图片的特征，以及局部的特征。</p>

<h2 id="科技论文写作">科技论文写作</h2>

<p>参考书 Writing scientific articles strategy and steps (Cargill, Margaret<br />
O’Connor, Patrick)</p>

<p>结构</p>

<p>structures: AIMRaD (Abstract, Introduction, Materials and methods,<br />
Results, and Discussion)</p>

<p>语言表达</p>

<p>词汇句子</p>

<h2 id="附录">附录</h2>

<p>安装 latex 环境 windows 使用 texlive 或 MiKTeX ubuntu 使用 texlive<br />
中文安装 texlive-chinese</p>

<p>编辑器 TeXStudio Lyx 提供了所见即所得的界面（比如编辑公式的时候） VSCode<br />
有专门的插件（使用XeLaTeX要配置一下编译命令）</p>

<p>工具 字典/同义词 在线网址 自动缩进 latexindent.py? 拼写检查 languagetool<br />
grammarly<br />
有个 perl 写的自动编译工具</p>

<p>相关教程和书籍</p>

<p>overleaf 的帮助文档，提供的常用的用法。</p>

<p>相关工具</p>
<ul>
  <li>编译环境</li>
  <li>编辑器</li>
  <li>语法检查</li>
  <li>教程手册</li>
  <li>https://www.codecogs.com/latex/eqneditor.php</li>
  <li>注意一些包使用创建特定的效果的，只是为了带来方便，有时候也可以有不同的选择。</li>
</ul>]]></content><author><name>Lenna Hammer</name></author><summary type="html"><![CDATA[一些入门知识，适用于在集成好的环境中快速上手，并补充一些为完成学术写作所必要的背景知识。针对一些希望表达的意图，提供完成的方法。]]></summary></entry></feed>