<?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>项目 on WishBottle</title><link>/tags/%E9%A1%B9%E7%9B%AE/</link><description>Recent content in 项目 on WishBottle</description><generator>Hugo -- 0.156.0</generator><language>zh-cn</language><lastBuildDate>Thu, 05 Mar 2026 00:00:00 +0800</lastBuildDate><atom:link href="/tags/%E9%A1%B9%E7%9B%AE/index.xml" rel="self" type="application/rss+xml"/><item><title>用 Streamlit + DeepSeek 做一个 AI 智能伴侣：从能跑到工程化的复盘</title><link>/posts/streamlit-ai-companion/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0800</pubDate><guid>/posts/streamlit-ai-companion/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;声明 / 致谢&lt;/strong&gt;：此项目的最初版本是我在学习黑马程序员的网课时，跟着课程一步步敲出来的练习项目。课程链接：&lt;a href="https://www.bilibili.com/video/BV1sHU9BmEne/?vd_source=b7fe282ae22dcad10ba845b5eea36a47"&gt;https://www.bilibili.com/video/BV1sHU9BmEne/?vd_source=b7fe282ae22dcad10ba845b5eea36a47&lt;/a&gt;。&lt;br&gt;
本文更多是在此基础上做的&lt;strong&gt;个人复盘与工程化整理&lt;/strong&gt;（如 .env、LICENSE、Topics、GitHub Actions、Ruff、README 徽章等），并记录我在同步、配置与 CI 上踩过的坑和解决方式。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;这篇文章复盘我做 &lt;code&gt;streamlit-ai-companion&lt;/code&gt; 的过程：前半部分是项目实现（Streamlit + DeepSeek API），后半部分是把仓库“工程化”的学习经历（.env、License、Topics、GitHub Actions、Ruff、README 徽章）。整体不是教程流水账，而是按“我遇到的问题 → 为什么 → 怎么解决”的方式写。&lt;/p&gt;
&lt;h2 id="1-项目简介我做了什么"&gt;1. 项目简介：我做了什么&lt;/h2&gt;
&lt;p&gt;我做了一个基于 &lt;strong&gt;Streamlit&lt;/strong&gt; 的 AI 智能伴侣聊天应用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;聊天 UI：&lt;code&gt;st.chat_input&lt;/code&gt; + &lt;code&gt;st.chat_message&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可配置“伴侣信息”：昵称 + 性格（sidebar 动态修改）&lt;/li&gt;
&lt;li&gt;流式输出：模型一边生成一边显示，聊天更自然&lt;/li&gt;
&lt;li&gt;会话历史：保存为本地 JSON 文件，支持加载/删除
&lt;img alt="AI智能伴侣界面" loading="lazy" src="/posts/streamlit-ai-companion/companion.png"&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-为什么要做工程化而不是只停留在能跑"&gt;2. 为什么要做工程化（而不是只停留在能跑）&lt;/h2&gt;
&lt;p&gt;一开始我的项目确实能运行，但“能跑”和“可维护/可分享”是两回事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要别人一眼看懂怎么运行（README）&lt;/li&gt;
&lt;li&gt;不能把 API Key 提交上去（.env 处理）&lt;/li&gt;
&lt;li&gt;需要许可证声明（LICENSE）&lt;/li&gt;
&lt;li&gt;最好能有自动检查（CI），避免以后改坏了都不知道&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以我给仓库补齐了这些“标配”。&lt;/p&gt;
&lt;h2 id="3-项目核心实现复盘结合-ai_companionpy"&gt;3. 项目核心实现复盘（结合 AI_companion.py）&lt;/h2&gt;
&lt;h3 id="31-关键配置模型base-url环境变量"&gt;3.1 关键配置：模型、Base URL、环境变量&lt;/h3&gt;
&lt;p&gt;我把关键参数集中在文件顶部：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt;：用环境变量读取 Key&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BASE_URL = &amp;quot;https://api.deepseek.com&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MODEL_NAME = &amp;quot;deepseek-chat&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SESSIONS_DIR = &amp;quot;sessions&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样做的好处是：以后换模型/换环境变量名时不会到处改。&lt;/p&gt;</description></item></channel></rss>