AI智能伴侣开发实战:从零构建你的专属聊天机器人
一、引言当AI走进生活在2026年的今天人工智能早已不再是科幻电影中的遥远概念。从ChatGPT到DeepSeek从Gemini到Qwen大语言模型正以前所未有的速度改变着我们与计算机交互的方式。然而对于大多数开发者而言如何将这些强大的AI能力真正落地到实际应用中仍然是一道需要跨越的门槛。本文将通过一个完整的项目实战——AI智能伴侣带你一步步掌握从大模型调用、会话管理到Web应用构建的全流程。无论你是Python初学者还是有一定经验的开发者这篇文章都将为你打开AI应用开发的大门。二、项目概述什么是AI智能伴侣2.1 项目定位AI智能伴侣是一个基于DeepSeek大模型和Streamlit框架构建的交互式聊天应用。它不仅仅是简单的问答机器人而是一个能够记住对话历史、拥有个性化性格、支持会话管理的虚拟伴侣。2.2 核心功能自然对话能力基于DeepSeek大模型能够理解并回应用户的各类问题性格定制用户可以自由设定伴侣的昵称和性格特征会话记忆通过滚雪球机制实现多轮对话的上下文理解会话管理支持新建、保存、加载和删除历史会话流式输出AI回复实时显示提升交互体验2.3 技术栈技术组件用途Python 3.8主要编程语言StreamlitWeb界面快速构建OpenAI SDKDeepSeek API调用JSON会话数据持久化OS/datetime文件操作与时间管理三、环境搭建与准备工作3.1 安装依赖首先我们需要安装项目所需的核心库bash# 安装Streamlit pip install streamlit # 安装OpenAI SDK用于调用DeepSeek API pip install openai3.2 获取DeepSeek API Key要调用DeepSeek大模型你需要访问DeepSeek官网注册账号进入控制台充值少量余额最低1元即可创建API Key并妥善保存bash# 设置环境变量推荐在终端中执行 export DEEPSEEK_API_KEY你的API密钥四、核心技术原理解析4.1 大模型调用机制在项目中我们通过OpenAI SDK来调用DeepSeek的API。核心代码如下pythonfrom openai import OpenAI import os client OpenAI( api_keyos.environ.get(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com ) response client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: 你是一个智能助手}, {role: user, content: 你好请介绍一下自己} ], streamTrue # 启用流式输出 )这里的关键在于messages数组的结构system设定AI的角色和行为准则user用户的实际问题assistantAI的历史回复用于会话记忆4.2 会话记忆的滚雪球方案大模型本质上是无状态的——每次请求都是独立的。为了实现多轮对话的记忆功能我们采用了历史消息累积的策略python# 每次对话时将完整的消息历史发送给大模型 messages [ {role: system, content: system_prompt}, *st.session_state.messages # 展开所有历史消息 ]这种方案就像滚雪球一样每轮对话都会把之前的所有消息重新发送一遍。虽然会消耗更多token但对于轻量级应用来说是最简单可靠的方案。4.3 流式输出实现流式输出能让用户实时看到AI的回复过程体验更接近真人聊天pythonresponse_message st.empty() # 创建占位组件 full_response for chunk in response: if chunk.choices[0].delta.content is not None: content chunk.choices[0].delta.content full_response content response_message.chat_message(assistant).write(full_response)五、完整代码实现5.1 项目结构textai-companion/ ├── app.py # 主程序文件 ├── resources/ │ └── logo.png # 应用Logo ├── sessions/ # 会话存储目录自动创建 │ ├── 2026-07-05_14-30-15.json │ └── ... └── requirements.txt # 依赖清单5.2 完整代码以下是app.py的完整实现我将逐段解释其核心逻辑pythonimport streamlit as st import os from openai import OpenAI from datetime import datetime import json # 页面配置 st.set_page_config( page_titleAI智能伴侣, page_icon, layoutwide, initial_sidebar_stateexpanded ) # 工具函数 def generate_session_name(): 生成基于时间戳的会话名称 return datetime.now().strftime(%Y-%m-%d_%H-%M-%S) def save_session(): 保存当前会话到JSON文件 if st.session_state.current_session: session_data { nick_name: st.session_state.nick_name, nature: st.session_state.nature, current_session: st.session_state.current_session, messages: st.session_state.messages } if not os.path.exists(sessions): os.mkdir(sessions) with open(fsessions/{st.session_state.current_session}.json, w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) def load_sessions(): 加载所有历史会话列表 session_list [] if os.path.exists(sessions): for filename in os.listdir(sessions): if filename.endswith(.json): session_list.append(filename[:-5]) session_list.sort(reverseTrue) return session_list def load_session(session_name): 加载指定的会话数据 try: with open(fsessions/{session_name}.json, r, encodingutf-8) as f: session_data json.load(f) st.session_state.messages session_data[messages] st.session_state.nick_name session_data[nick_name] st.session_state.nature session_data[nature] st.session_state.current_session session_name except Exception: st.error(加载会话失败!) def delete_session(session_name): 删除指定的会话文件 try: os.remove(fsessions/{session_name}.json) if session_name st.session_state.current_session: st.session_state.messages [] st.session_state.current_session generate_session_name() except Exception: st.error(删除会话失败!) # 系统提示词模板 system_prompt 你叫 %s现在是用户的真实伴侣请完全代入伴侣角色。 规则 1. 每次只回1条消息 2. 禁止任何场景或状态描述性文字 3. 匹配用户的语言 4. 回复简短像微信聊天一样 5. 有需要的话可以用❤️等emoji表情 6. 用符合伴侣性格的方式对话 7. 回复的内容要充分体现伴侣的性格特征 伴侣性格%s 你必须严格遵守上述规则来回复用户。 # 初始化状态 if messages not in st.session_state: st.session_state.messages [] if nick_name not in st.session_state: st.session_state.nick_name 小甜甜 if nature not in st.session_state: st.session_state.nature 活泼开朗的东北姑娘 if current_session not in st.session_state: st.session_state.current_session generate_session_name() # 界面标题与Logo st.title( AI智能伴侣) st.logo(resources/logo.png) # 显示聊天历史 st.text(f 会话: {st.session_state.current_session}) for message in st.session_state.messages: st.chat_message(message[role]).write(message[content]) # 初始化AI客户端 client OpenAI( api_keyos.environ.get(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com ) # 侧边栏 - 控制面板 with st.sidebar: st.subheader(️ AI控制面板) # 新建会话按钮 if st.button(✏️ 新建会话, widthstretch): save_session() if st.session_state.messages: st.session_state.messages [] st.session_state.current_session generate_session_name() save_session() st.rerun() # 会话历史列表 st.text( 会话历史) session_list load_sessions() for session in session_list: col1, col2 st.columns([4, 1]) with col1: if st.button(session, widthstretch, keyfload_{session}, typeprimary if session st.session_state.current_session else secondary): load_session(session) st.rerun() with col2: if st.button(❌, widthstretch, keyfdelete_{session}): delete_session(session) st.rerun() st.divider() # 伴侣信息定制 st.subheader( 伴侣信息) nick_name st.text_input(昵称, valuest.session_state.nick_name) if nick_name: st.session_state.nick_name nick_name nature st.text_area(性格, valuest.session_state.nature) if nature: st.session_state.nature nature # 消息输入与AI响应 prompt st.chat_input( 输入你的消息...) if prompt: # 显示用户消息 st.chat_message(user).write(prompt) st.session_state.messages.append({role: user, content: prompt}) # 构建完整的消息列表包含系统提示词和历史 messages [ {role: system, content: system_prompt % (st.session_state.nick_name, st.session_state.nature)}, *st.session_state.messages ] # 调用AI并流式输出 response client.chat.completions.create( modeldeepseek-chat, messagesmessages, streamTrue ) response_placeholder st.empty() full_response for chunk in response: if chunk.choices[0].delta.content is not None: full_response chunk.choices[0].delta.content response_placeholder.chat_message(assistant).write(full_response) # 保存AI回复到历史 st.session_state.messages.append({role: assistant, content: full_response}) # 自动保存会话 save_session()六、运行与测试6.1 启动应用在项目目录下执行bashstreamlit run app.py应用将在浏览器中自动打开默认地址为http://localhost:8501。6.2 功能测试流程基础对话在输入框中发送消息观察AI的实时回复性格定制在侧边栏修改昵称和性格AI的回复风格会随之变化会话管理创建多个会话切换加载验证数据持久化流式体验注意AI回复是逐字显示的而非一次性弹出七、知识扩展与进阶思考7.1 JSON文件操作的最佳实践在项目中我们使用JSON格式存储会话数据。Python的json模块提供了简洁的APIpython# 序列化写入 with open(data.json, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) # 反序列化读取 with open(data.json, r, encodingutf-8) as f: data json.load(f)关键点ensure_asciiFalse保证中文正常显示indent2格式化输出便于阅读使用with语句自动管理文件资源7.2 Streamlit的核心APIAPI用途st.title()页面大标题st.chat_message()聊天气泡st.chat_input()输入框st.sidebar侧边栏st.button()按钮st.text_input()文本输入st.text_area()多行文本st.columns()列布局st.rerun()页面刷新7.3 优化方向建议会话压缩当对话历史过长时可以使用摘要技术压缩上下文多模型支持扩展支持Gemini、Qwen等不同大模型语音交互集成语音识别与合成实现全语音对话情感分析增加情感识别模块让回复更具共情力云端部署使用Streamlit Cloud或Docker将应用部署到公网八、总结通过本文的项目实战我们完整地走完了AI应用开发的整个流程阶段核心内容理论准备理解大模型、HTTP协议、API调用环境搭建Python环境、依赖安装、API密钥配置核心开发大模型调用、会话记忆、流式输出界面构建Streamlit布局、交互组件数据持久化JSON文件读写、会话管理测试优化功能验证、用户体验提升收获与启示开发AI应用并不需要从零训练大模型我们只需要学会如何用好现有的模型服务。通过合理的提示词工程、巧妙的状态管理和友好的界面设计就能打造出富有价值的产品。AI智能伴侣这个项目虽然简单但它所包含的技术框架——前端交互层、业务逻辑层、数据持久层和AI服务层——正是所有AI应用开发的基础范式。掌握了这套方法论你就具备了开发各类AI应用的能力。

相关新闻

避开 Playwright 常见陷阱,让你的 UI 测试更快更稳

避开 Playwright 常见陷阱,让你的 UI 测试更快更稳

做UI自动化测试的朋友应该都有过这种体验——本地跑得好好的,一上CI就挂;周一全绿,周二莫名其妙红一片;加了sleep能过,不加就报元素找不到。 如果你也遇到过这些情况,别急着怀疑是自己的代码写得不够好。很…

2026/7/6 2:57:57 阅读更多 →
AI Agent Skills:从代码补全到智能开发的效率革命

AI Agent Skills:从代码补全到智能开发的效率革命

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你还在用 AI 编程助手只是让它帮你补全代码行,那你可能只发挥了它 10% 的潜力。真正的效率革命,发生在你教…

2026/7/6 2:57:57 阅读更多 →
SONiC 2024 容器化架构解析:10个核心Docker容器如何驱动网络转发

SONiC 2024 容器化架构解析:10个核心Docker容器如何驱动网络转发

SONiC 2024容器化架构深度解析:10个核心容器如何构建下一代云网络1. 现代网络操作系统的容器化革命当微软在2016年首次开源SONiC项目时,很少有人能预料到这个基于Linux的网络操作系统会彻底改变数据中心网络的构建方式。八年后的今天,SONiC已…

2026/7/6 2:55:56 阅读更多 →

最新新闻

你的前端代码打包后究竟经历了什么?

你的前端代码打包后究竟经历了什么?

打包命令执行的一瞬间,构建工具并不会立刻编译代码,第一步永远是读取并整合所有配置规则。构建工具配置读取: 以 Vite 为例,工具会自动查找项目根目录 vite.config.js,读取入口文件、输出目录、打包策略、公共路径等核…

2026/7/6 3:50:11 阅读更多 →
[实例] SPI接口的ADC芯片全通道纯硬件驱动——基于HAL库和TLA2518芯片

[实例] SPI接口的ADC芯片全通道纯硬件驱动——基于HAL库和TLA2518芯片

本次需要通过TI的TL2518芯片进行ADC采样。该芯片为SPI接口,具有八个通道,可以全部配置成AIN进行采样,本次需要探究如何该如何配置才能将芯片的采样率达到最大。1.TLA2158首先要陈列一下该芯片的一些特性,为节省篇幅,此…

2026/7/6 3:48:11 阅读更多 →
【全文系列目录】风控PM记

【全文系列目录】风控PM记

风控PM记 一:风险认知与识别(入门篇) ① 入门第一课:认识风险,了解风控 ② 入门第二课:业务催生风险,常见的业务风险有哪些? ③ 《电商风控入门:我们到底在“防”什…

2026/7/6 3:48:11 阅读更多 →
基于Databricks的企业级AI Agent生产实践:从架构设计到部署运维

基于Databricks的企业级AI Agent生产实践:从架构设计到部署运维

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在考虑将AI Agent引入企业生产环境,可能会面临这样的困境:在本地开发环境中跑得飞快的Agent原型&…

2026/7/6 3:42:09 阅读更多 →
飞书卡片表格渲染踩坑记:从 Markdown 到原生 table 组件的迁移实战

飞书卡片表格渲染踩坑记:从 Markdown 到原生 table 组件的迁移实战

背景 团队每日通过飞书推送项目晨报和日报,内容从项目管理平台实时拉取,包含任务统计、进度列表、风险项等多维数据,天然需要表格来承载。 最初的实现方案是飞书消息推送 纯文本,格式简陋,阅读体验差。于是决定升级为…

2026/7/6 3:40:09 阅读更多 →
构建AI毒舌投资人:用Prompt工程验证副业想法的可行性

构建AI毒舌投资人:用Prompt工程验证副业想法的可行性

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在折腾各种 AI 工具时,我发现一个挺有意思的现象:很多人拿到一个强大的 AI 模型,比如 DeepSee…

2026/7/6 3:40:09 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻