<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>大模型 on Saiga</title>
    <link>http://localhost:1313/tags/%E5%A4%A7%E6%A8%A1%E5%9E%8B/</link>
    <description>Recent content in 大模型 on Saiga</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <managingEditor>wuwenzen@outlook.com (wuwj)</managingEditor>
    <webMaster>wuwenzen@outlook.com (wuwj)</webMaster>
    <lastBuildDate>Wed, 01 May 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://localhost:1313/tags/%E5%A4%A7%E6%A8%A1%E5%9E%8B/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>让 AI 帮我做前端性能分析报告</title>
      <link>http://localhost:1313/posts/2024-05-01-ai-performance-analyzer/</link>
      <pubDate>Wed, 01 May 2024 00:00:00 +0000</pubDate><author>wuwenzen@outlook.com (wuwj)</author>
      <guid>http://localhost:1313/posts/2024-05-01-ai-performance-analyzer/</guid>
      <description>&lt;p&gt;前端做性能优化，两个常见痛点：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;报表很数据化，非技术同学看不懂&lt;/li&gt;&#xA;&lt;li&gt;每次写性能报告都很花时间：看指标 → 找问题 → 翻译成大家听得懂的结论&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;于是试了一件事：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;我负责把数据准备好，AI 帮我写一份「结构化的性能分析报告」，我只做最后校对。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-输入与输出长啥样&#34;&gt;1. 输入与输出长啥样？&lt;/h2&gt;&#xA;&lt;h3 id=&#34;11-输入数据&#34;&gt;1.1 输入数据&lt;/h3&gt;&#xA;&lt;p&gt;主要有两部分：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Lighthouse JSON 报告&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;性能得分&lt;/li&gt;&#xA;&lt;li&gt;LCP / CLS / TBT / TTI 等指标&lt;/li&gt;&#xA;&lt;li&gt;各种「机会」与「诊断」信息&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;真实用户监控数据（RUM）&lt;/strong&gt;（可选）&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;最近一段时间的 LCP P75、FCP P75&lt;/li&gt;&#xA;&lt;li&gt;不同地区/设备的耗时对比&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;12-期望输出&#34;&gt;1.2 期望输出&lt;/h3&gt;&#xA;&lt;p&gt;希望 AI 给我的报告包含：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一段 1～2 句话的性能整体概览&lt;/li&gt;&#xA;&lt;li&gt;用人话解释关键指标的含义和当前水平&lt;/li&gt;&#xA;&lt;li&gt;列出 3～5 个主要问题（按影响排序）&lt;/li&gt;&#xA;&lt;li&gt;每个问题配上具体可执行的优化建议&lt;/li&gt;&#xA;&lt;li&gt;告诉我「先做哪几件事最划算」&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;2-先做精简给-ai-的不是原始-json&#34;&gt;2. 先做精简：给 AI 的不是原始 JSON&lt;/h2&gt;&#xA;&lt;p&gt;原始 Lighthouse JSON 体积很大，直接给模型既浪费 Token，也容易让它迷路。&lt;br&gt;&#xA;所以写了一个小脚本，把它整理成简版结构：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-jsonc&#34; data-lang=&#34;jsonc&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://example.com&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;score&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0.72&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;metrics&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;LCP&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3800&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;CLS&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0.11&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;FID&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;TTI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;4200&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;opportunities&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;减少未使用的 JavaScript&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;estimatedSavingsMs&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;800&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;消除阻塞渲染的资源&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;estimatedSavingsMs&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;diagnostics&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;主线程工作过多&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;部分图片未压缩&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;rum&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;LCP_p75&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;4200&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;FCP_p75&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2100&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;sampleCount&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;120000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样输入既足够有信息量，又相对稳定。&lt;/p&gt;</description>
    </item>
    <item>
      <title>AI Code Review 实战：规则、提示词与边界</title>
      <link>http://localhost:1313/posts/2024-03-18-smart-code-review/</link>
      <pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate><author>wuwenzen@outlook.com (wuwj)</author>
      <guid>http://localhost:1313/posts/2024-03-18-smart-code-review/</guid>
      <description>&lt;p&gt;今年做了一次尝试：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;不改变现有流程的前提下，让大模型参与到 Code Review 里，当一个「辅助 reviewer」。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;它不会替代人类审核，只做三件事：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;帮忙找明显 bug / 边界问题&lt;/li&gt;&#xA;&lt;li&gt;帮忙发现重复逻辑、代码味道&lt;/li&gt;&#xA;&lt;li&gt;帮忙写结构化的改进建议&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-我们希望-ai-扮演什么角色&#34;&gt;1. 我们希望 AI 扮演什么角色？&lt;/h2&gt;&#xA;&lt;p&gt;一开始就想清楚边界：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;不负责通过/拒绝 PR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;不修改状态，只给评论和建议&lt;/li&gt;&#xA;&lt;li&gt;最终决策仍然是人类 reviewer&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;关注「模式」而不是细枝末节&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;比如错误处理缺失、越界风险、循环里请求等&lt;/li&gt;&#xA;&lt;li&gt;而不是变量名叫 &lt;code&gt;a&lt;/code&gt; 还是 &lt;code&gt;data&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;输出要尽量具体&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;指出文件、位置、问题和建议&lt;/li&gt;&#xA;&lt;li&gt;避免空话：「可以优化」「可以重构」这种直接过滤掉&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;2-整体方案在-ci-里多插一段ai-review&#34;&gt;2. 整体方案：在 CI 里多插一段「AI Review」&lt;/h2&gt;&#xA;&lt;p&gt;流程：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;CI 获取本次 PR 的变更文件 + diff&lt;/li&gt;&#xA;&lt;li&gt;对每个文件构造一个「上下文 + diff」的 payload&lt;/li&gt;&#xA;&lt;li&gt;调用大模型，让它产出结构化的 review 结果&lt;/li&gt;&#xA;&lt;li&gt;再由机器人账号把评论贴回 PR（或者汇总成一条）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;为控制成本和复杂度：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;优先只分析变更行附近的代码&lt;/li&gt;&#xA;&lt;li&gt;超长文件只截取相关片段&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;3-prompt-设计告诉-ai只看这四件事&#34;&gt;3. Prompt 设计：告诉 AI「只看这四件事」&lt;/h2&gt;&#xA;&lt;p&gt;一个简化的系统提示大致是：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;你是一名资深前端/全栈工程师，正在做 Code Review。&lt;br&gt;&#xA;请只关注以下问题：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;明显的 bug 或潜在边界问题&lt;/li&gt;&#xA;&lt;li&gt;异常处理和错误提示是否合理&lt;/li&gt;&#xA;&lt;li&gt;性能隐患（多余循环、重复请求等）&lt;/li&gt;&#xA;&lt;li&gt;安全/权限风险&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;不要评论代码风格、缩进、单双引号之类的问题，这些交给 Lint 工具。&lt;/p&gt;</description>
    </item>
    <item>
      <title>用大模型做一个「表单配置助手」</title>
      <link>http://localhost:1313/posts/2024-02-05-ai-powered-form-builder/</link>
      <pubDate>Mon, 05 Feb 2024 00:00:00 +0000</pubDate><author>wuwenzen@outlook.com (wuwj)</author>
      <guid>http://localhost:1313/posts/2024-02-05-ai-powered-form-builder/</guid>
      <description>&lt;p&gt;在很多中台系统里，「加一个表单页面」是非常常见的需求：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;运营要配活动&lt;/li&gt;&#xA;&lt;li&gt;风控要配规则&lt;/li&gt;&#xA;&lt;li&gt;产品要加信息收集表单&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;常规流程比较重：写需求 → 画原型 → 前端实现 → 联调 → 上线。&lt;br&gt;&#xA;对于那些只是字段多、变更频率高的小表单，其实有点浪费。&lt;/p&gt;&#xA;&lt;p&gt;所以我们尝试做了一个小工具：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;运营用自然语言描述表单，大模型帮忙产出一份「表单配置 JSON」，前端根据配置自动渲染。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这篇文章就简单记录一下实现思路。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-目标从一句话到一份表单配置&#34;&gt;1. 目标：从一句话到一份表单配置&lt;/h2&gt;&#xA;&lt;p&gt;我们给自己的目标很克制：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;输入&lt;/strong&gt;：一段自然语言描述，例如&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;“做一个录入投资人基本信息的表单，需要姓名、手机号、证件类型和证件号，手机号必填要校验格式，证件类型从下拉里选身份证/护照。”&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;：一份前端能直接使用的配置 JSON：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;字段列表&lt;/li&gt;&#xA;&lt;li&gt;字段类型、标签、占位&lt;/li&gt;&#xA;&lt;li&gt;是否必填、校验规则&lt;/li&gt;&#xA;&lt;li&gt;下拉选项等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;前端只负责：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;把描述提交给后端&lt;/li&gt;&#xA;&lt;li&gt;拿到配置 JSON&lt;/li&gt;&#xA;&lt;li&gt;交给通用 &lt;code&gt;&amp;lt;FormRenderer :config=&amp;quot;formConfig&amp;quot; /&amp;gt;&lt;/code&gt; 渲染&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;2-配置格式先把机器读得懂定义好&#34;&gt;2. 配置格式：先把「机器读得懂」定义好&lt;/h2&gt;&#xA;&lt;p&gt;要让大模型产出可用结果，首先要有一份清晰的配置格式。示例：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-jsonc&#34; data-lang=&#34;jsonc&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;投资人信息录入&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;layout&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;vertical&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;fields&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;label&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;姓名&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;input&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;required&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;placeholder&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;请输入姓名&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mobile&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;label&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;手机号&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;input&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;required&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;regex&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^1\\d{10}$&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;请输入 11 位手机号&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;idType&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;label&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;证件类型&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;select&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;required&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;label&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;居民身份证&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ID_CARD&amp;#34;&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;label&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;护照&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PASSPORT&amp;#34;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;idNo&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;label&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;证件号码&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;input&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;required&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;前端已经有配套组件：&lt;/p&gt;</description>
    </item>
    <item>
      <title>用大模型做一个简单「文档问答助手」</title>
      <link>http://localhost:1313/posts/2022-10-30-ai-doc-assistant-v1/</link>
      <pubDate>Sun, 30 Oct 2022 00:00:00 +0000</pubDate><author>wuwenzen@outlook.com (wuwj)</author>
      <guid>http://localhost:1313/posts/2022-10-30-ai-doc-assistant-v1/</guid>
      <description>&lt;p&gt;2022 年开始，大模型 API 越来越好用，大家最直觉的一个想法就是：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;能不能把项目文档「喂给」模型，然后直接用自然语言问问题？&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这篇文章记录的是一个从 0 到 1 的小 Demo：&lt;strong&gt;用大模型 API + 向量检索，实现一个能回答「我们自己文档」问题的小助手。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-目标和约束&#34;&gt;1. 目标和约束&lt;/h2&gt;&#xA;&lt;p&gt;目标很简单：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;把部分项目文档（接口说明、架构设计、规范）导入系统；&lt;/li&gt;&#xA;&lt;li&gt;在一个聊天界面里，可以问：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;「用户登录接口的必填参数有哪些？」&lt;/li&gt;&#xA;&lt;li&gt;「私募投资人小程序的技术栈是什么？」&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;助手能基于文档给出相对准确的回答。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;约束：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;不追求「完美答案」；&lt;/li&gt;&#xA;&lt;li&gt;优先做到：&lt;strong&gt;能指向正确文档，并给出简洁总结&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;2-总体架构&#34;&gt;2. 总体架构&lt;/h2&gt;&#xA;&lt;p&gt;整体流程可以概括成：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;文档导入 &amp;amp; 切分；&lt;/li&gt;&#xA;&lt;li&gt;向量化（Embedding）并存入向量库；&lt;/li&gt;&#xA;&lt;li&gt;用户提问 → 向量检索相关片段；&lt;/li&gt;&#xA;&lt;li&gt;把相关片段 + 问题一起发给大模型 → 生成回答；&lt;/li&gt;&#xA;&lt;li&gt;前端展示答案 + 引用片段。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;用一张简图就是所谓的：&lt;strong&gt;RAG（检索增强生成）&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;3-文档预处理从-markdown-到小段文本&#34;&gt;3. 文档预处理：从 Markdown 到「小段文本」&lt;/h2&gt;&#xA;&lt;p&gt;我们选用的文档源主要是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Git 仓库里的 Markdown（README、设计文档）；&lt;/li&gt;&#xA;&lt;li&gt;部分导出的接口文档（JSON/YAML 转文本）。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;预处理步骤：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;把 Markdown 转成纯文本（保留标题层级）；&lt;/li&gt;&#xA;&lt;li&gt;按一定策略切分成「小段文本」，比如每段 300–500 字；&lt;/li&gt;&#xA;&lt;li&gt;每段附带元信息：文档名、段落标题、在文档中的位置。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;简单示例：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;docId&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fund-investor-miniapp&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;技术栈与整体架构&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;前端采用 Vue3 + uni-app...&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;section&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2.1 技术栈&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;切分策略的小经验：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
