<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>setup on Kohsruhe</title><link>https://www.kohsruhe.com/zh/tag/setup/</link><description>Recent content in setup on Kohsruhe</description><generator>Hugo -- gohugo.io</generator><language>zh</language><managingEditor>kohsruhe@outlook.com (Leehyon HNG)</managingEditor><webMaster>kohsruhe@outlook.com (Leehyon HNG)</webMaster><lastBuildDate>Mon, 07 Sep 2026 17:10:50 +0800</lastBuildDate><atom:link href="https://www.kohsruhe.com/zh/tag/setup/index.xml" rel="self" type="application/rss+xml"/><item><title>给博客加了一张旅行地图</title><link>https://www.kohsruhe.com/zh/2026/09/travel-map-on-about/</link><pubDate>Mon, 07 Sep 2026 17:10:50 +0800</pubDate><author>kohsruhe@outlook.com (Leehyon HNG)</author><guid>https://www.kohsruhe.com/zh/2026/09/travel-map-on-about/</guid><description>&lt;p&gt;「关于」页之前只有干巴巴的文字介绍，总觉得单调，便补了一张旅行地图，标记一下自己去过的地方。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本功能是 Vibe 出来的，用的是 MiniMax M3 模型。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="准备工作"&gt;准备工作&lt;/h2&gt;
&lt;p&gt;去年在做婚礼请帖时，也就是「&lt;a href="https://wedding.kohsruhe.com/"&gt;👩‍❤️‍👨 我们结婚啦&lt;/a&gt;」这个站点，有用过高德地图的 API，所以这次还是用它。如果你是第一次接入，要先去 &lt;a href="lbs.amap.com"&gt;高德开放平台&lt;/a&gt; 注册开发者账号、申请 Web 端 JS API 的 Key。&lt;/p&gt;</description><content:encoded><![CDATA[<p>「关于」页之前只有干巴巴的文字介绍，总觉得单调，便补了一张旅行地图，标记一下自己去过的地方。</p>
<blockquote>
<p>本功能是 Vibe 出来的，用的是 MiniMax M3 模型。</p>
</blockquote>
<h2 id="准备工作">准备工作</h2>
<p>去年在做婚礼请帖时，也就是「<a href="https://wedding.kohsruhe.com/">👩‍❤️‍👨 我们结婚啦</a>」这个站点，有用过高德地图的 API，所以这次还是用它。如果你是第一次接入，要先去 <a href="lbs.amap.com">高德开放平台</a> 注册开发者账号、申请 Web 端 JS API 的 Key。</p>
<p>Key 准备好之后，剩下的工作就交给 AI 了。</p>
<h2 id="数据驱动">数据驱动</h2>
<p>旅行数据单独放在 <code>data/travel.yaml</code>，每条记录包含城市名、经纬度、访问时间、可选备注：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Karlsruhe</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">lng</span><span class="p">:</span><span class="w"> </span><span class="m">8.403653</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">lat</span><span class="p">:</span><span class="w"> </span><span class="m">49.006889</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">visited</span><span class="p">:</span><span class="w"> </span><span class="m">2016-04</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">note</span><span class="p">:</span><span class="w"> </span><span class="l">KIT 求学岁月</span><span class="w">
</span></span></span></code></pre></div><p>新增一个城市就在文件末尾追加一条，<code>hugo</code> 重新 build 后地图自动多一个绿点。</p>
<h2 id="hugo-shortcode">Hugo Shortcode</h2>
<p>为了让以后别的页面也能复用，写了一个 <code>amap</code> shortcode。它从 <code>data/travel.yaml</code> 读出城市列表，渲染成一个 map 容器加一份 JSON payload，后面的渲染逻辑交给一个独立 JS 文件。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;amap-container&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;amap-container&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;application/json&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;amap-travel-data&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">{{</span><span class="o">-</span> <span class="nx">$travel</span> <span class="o">|</span> <span class="nx">jsonify</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><h2 id="渲染">渲染</h2>
<p>地图本身的逻辑用一个 IIFE 包起来，关键几步：</p>
<ol>
<li>解析 JSON payload。<code>Hugo jsonify</code> 模板输出的 JSON 字符串放在 <code>&lt;script type=&quot;application/json&quot;&gt;</code> 里时，<code>.textContent</code> 会拿到外层带引号的字符串，需要 <code>JSON.parse</code> 两次</li>
<li>每个城市创建 <code>AMap.Marker</code>。<code>content</code> 字段直接传一段 HTML 字符串（24px 绿圆点 + 白边）</li>
<li>计算所有 markers 的边界，<code>map.setFitView</code> 自动框选到合适缩放</li>
<li>点击 marker 弹 <code>InfoWindow</code> 显示城市名、访问时间、备注</li>
</ol>
<p>为了避免每个 marker 都重复字符串拼接，加了一个 <code>visitCount</code> 字典，同一城市多次访问时显示一个红色小角标。</p>
<h2 id="结论">结论</h2>
<p>之前把 Key 写死在 <code>hugo.toml</code> 里，后来发现不太安全，改成读取 <code>HUGO_AMAP_KEY</code> 环境变量，同时在 Cloudflare Pages 里配成 Secret，本地开发用 <code>hugo.toml</code> 测试。</p>
<p>地图在「<a href="https://www.kohsruhe.com/zh/about/">关于</a>」页都能看到。点击绿色圆点会弹一个小窗显示城市名、访问时间、备注。</p>
<p>目前只是实现了功能，实际去过的地方还要再整理，有些地方确实年代久远，一时半会儿想不起来。</p>
]]></content:encoded></item><item><title>薅一把 ChatGPT API</title><link>https://www.kohsruhe.com/zh/2023/03/chatgpt-api-python/</link><pubDate>Mon, 06 Mar 2023 09:47:44 +0800</pubDate><author>kohsruhe@outlook.com (Leehyon HNG)</author><guid>https://www.kohsruhe.com/zh/2023/03/chatgpt-api-python/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;近期 OpenAI 开放了 gpt-3.5-turbo，第三方开发者可以使用 API 来把 ChatGPT 整合到自己的软件和业务中去。趁着新鲜劲，把玩一下。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ChatGPT 是一个基于 OpenAI 的 gpt-3.5-turbo 模型的云端人工智能聊天机器人，它可以进行自然语言处理和语言生成任务。gpt-3.5-turbo 模型是在 GPT-3 模型的基础上升级和改进的，具有更高的准确性和表现力，它可以自动识别语义和情感，并根据上下文生成合适的回答。&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="前言">前言</h2>
<p>近期 OpenAI 开放了 gpt-3.5-turbo，第三方开发者可以使用 API 来把 ChatGPT 整合到自己的软件和业务中去。趁着新鲜劲，把玩一下。</p>
<blockquote>
<p>ChatGPT 是一个基于 OpenAI 的 gpt-3.5-turbo 模型的云端人工智能聊天机器人，它可以进行自然语言处理和语言生成任务。gpt-3.5-turbo 模型是在 GPT-3 模型的基础上升级和改进的，具有更高的准确性和表现力，它可以自动识别语义和情感，并根据上下文生成合适的回答。</p>
</blockquote>
<h2 id="准备工作">准备工作</h2>
<p>在开始之前，需要进行一些准备工作。</p>
<h3 id="账号申请">账号申请</h3>
<p>首先，确保你有 OpenAI 账号，国内用户参考「<a href="https://cloud.tencent.com/developer/article/2190154">这篇文章</a>」申请一个。</p>
<p>账号申请成功后，去到 <a href="https://platform.openai.com/account/api-keys">Account API Keys</a> 生成自己的 key。</p>
<p><img src="https://images.kohsruhe.com/2024/chatgpt-api-key.jpg" alt="chatgpt-api-key"></p>
<blockquote>
<p>复制保存 key 到本地安全位置，该 key 仅生成的时候出现，避免泄露，谨慎使用！</p>
</blockquote>
<p>目前，OpenAI 提供 $18 的免费试用额度，以 $ 0.002 / 1000 tokens 算，大概可以白嫖 900 万个 tokens。不过需要注意的是，免费额度有时间限制，像我就到今年六月过期。</p>
<p><img src="https://images.kohsruhe.com/2024/chatgpt-trial-usage.jpg" alt="chatgpt-trial-usage"></p>
<h3 id="配置环境">配置环境</h3>
<p>本教程使用 Python 调用 ChatGPT-3.5-API，所以需先安装 Python，如果是 Linux 系统，确保有安装 <code>pip</code>，Windows 系统包含在 Python 安装包中，无需单独安装 <code>pip</code>。</p>
<p>安装好 Python 环境后，使用 <code>pip</code> 安装 <code>openai</code> 库，在命令行窗口中输入以下命令：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">pip</span> <span class="n">install</span> <span class="n">openai</span>
</span></span></code></pre></div><p>如果是系统有安装多个 Python 版本，可参考「<a href="https://www.kohsruhe.com/zh/2022/12/manage-multi-pythons/">之前文章</a>」使用 <code>py.exe</code> 指定 <code>pip</code> 版本安装：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">py</span> <span class="mf">-3</span> <span class="n">-m</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">openai</span>
</span></span></code></pre></div><p>等 <code>openai</code> 库安装完成后，就可以写 Python 脚本调用 API 了。</p>
<h2 id="使用-api">使用 API</h2>
<p>使用文本编辑器如 VS Code 创建一个新的 <code>.py</code> 文件，比如 <code>chat-demo.py</code>。</p>
<p>先导入 <code>openai</code> 模块，然后使用 <code>openai.Completion.create</code> 方法来发送请求并获取响应。可参考以下代码示例：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">openai</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">openai</span><span class="o">.</span><span class="n">api_key</span><span class="o">=</span><span class="s2">&#34;&lt;your key&gt;&#34;</span>  <span class="c1"># 替换成你自己的 API key</span>
</span></span><span class="line"><span class="cl"><span class="n">messages</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="n">system_message</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&#34;What type of chatbot you want me to be?</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">messages</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&#34;role&#34;</span><span class="p">:</span><span class="s2">&#34;system&#34;</span><span class="p">,</span><span class="s2">&#34;content&#34;</span><span class="p">:</span><span class="n">system_message</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Great! I am ready to be &#34;</span> <span class="o">+</span> <span class="n">system_message</span> <span class="o">+</span> <span class="s2">&#34;!</span><span class="se">\n</span><span class="s2">&#34;</span> <span class="o">+</span> <span class="s2">&#34;You can now type your messages.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">message</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">messages</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&#34;role&#34;</span><span class="p">:</span><span class="s2">&#34;user&#34;</span><span class="p">,</span><span class="s2">&#34;content&#34;</span><span class="p">:</span> <span class="n">message</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">response</span><span class="o">=</span><span class="n">openai</span><span class="o">.</span><span class="n">ChatCompletion</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">model</span><span class="o">=</span><span class="s2">&#34;gpt-3.5-turbo&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">messages</span><span class="o">=</span><span class="n">messages</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">reply</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s2">&#34;choices&#34;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s2">&#34;message&#34;</span><span class="p">][</span><span class="s2">&#34;content&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">reply</span><span class="p">)</span>
</span></span></code></pre></div><p>最后，保存文件并在命令行中运行代码，看看效果。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">py</span> <span class="mf">-3</span> <span class="p">.\</span><span class="nb">chat-demo</span><span class="p">.</span><span class="py">py</span>
</span></span></code></pre></div><p><img src="https://images.kohsruhe.com/2024/chatgpt-demo-output.png" alt="chatgpt-demo-output"></p>
<h2 id="最后">最后</h2>
<p>这只是个简单的小例子，更多有趣的功能还待大家自己去发掘，感兴趣的可移步「<a href="https://platform.openai.com/docs/api-reference/making-requests">官方文档</a>」查看详细用法。</p>
<h2 id="参考">参考</h2>
<ul>
<li><a href="https://platform.openai.com/docs/api-reference/introduction">API Reference - OpenAI API</a></li>
</ul>
]]></content:encoded></item></channel></rss>