AI 应用实战 —— 打造你的 AI 智能伴侣
目录
2022年11月30日,ChatGPT 横空出世。2025年1月20日,DeepSeek 震撼全球。大模型时代,每个开发者都该学会的一件事:调用 AI API 构建智能应用。
一、AI 大模型基础
1.1 什么是大模型?
大模型(LLM, Large Language Model)是训练在海量数据上的超大规模神经网络,能够理解和生成人类语言。
2022.11ChatGPT 发布2023.03GPT-4 发布2024.05GPT-4o 多模态2025.01DeepSeek-R1开源推理模型2025.03DeepSeek-V3 发布大模型发展里程碑
1.2 大模型能做什么?
大模型能力文本生成写作翻译代码生成对话交互智能客服AI伴侣教育辅导推理分析逻辑推理数据分析决策建议知识问答百科问答专业咨询多模态图像理解语音交互
二、HTTP 协议速通
调用 AI API 本质就是发 HTTP 请求。先搞懂 HTTP。
关键概念
| 概念 | 说明 | 示例 |
|---|---|---|
| URL | 请求地址 | https://api.deepseek.com/v1/chat/completions |
| Method | 请求方法 | GET(查)、POST(增)、PUT(改)、DELETE(删) |
| Header | 请求头(元信息) | Authorization: Bearer sk-xxx |
| Body | 请求体(数据) | JSON 格式的 messages |
| Status Code | 响应状态码 | 200 成功、401 未授权、500 服务器错误 |
三、接入 DeepSeek API
3.1 获取 API Key
-
注册/登录 → API Keys → 创建新的 API Key
-
保存好 Key(只显示一次!)
3.2 安装 OpenAI SDK
DeepSeek API 兼容 OpenAI 接口格式,直接用 openai 库:
pip install openai
3.3 第一次调用
from openai import OpenAI
client = OpenAI(
api_key="sk-xxxxxxxxxxxxxxxx", # 替换为你的 API Key
base_url="https://api.deepseek.com/v1", # DeepSeek 的地址
)
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "你是一个知识渊博的AI助手"},
{"role": "user", "content": "用一句话解释什么是递归"},
],
temperature=0.7,
)
# 提取回复内容
reply = response.choices[0].message.content
print(reply)
3.4 Messages 结构详解
# Messages 是对话的核心数据结构
messages = [
{
"role": "system", # 系统提示词:定义AI的角色/行为
"content": "你叫小甜甜,是一个可爱、活泼的AI助手,请用亲切可爱的语气回答"
},
{
"role": "user", # 用户消息
"content": "你好呀,今天天气真好"
},
{
"role": "assistant", # AI的历史回复(多轮对话用)
"content": "嘻嘻,是呀~阳光明媚的,最适合出去玩耍啦!"
},
{
"role": "user", # 新一轮用户消息
"content": "推荐一个适合今天去的地方吧"
}
]
四、Prompt 工程 —— 让 AI 更好用的艺术
4.1 System Prompt 设计
# ❌ 不好的 System Prompt
system_prompt = "回答问题"
# ✅ 好的 System Prompt —— 角色 + 能力 + 约束 + 格式
system_prompt = """
你叫小甜甜,是一个温柔可爱的AI伴侣。
能力:
- 日常闲聊、情感陪伴
- 知识问答、学习辅导
- 创意灵感、故事创作
性格特征:
- 温柔体贴,善于倾听
- 活泼但不聒噪
- 偶尔使用颜文字 (◕‿◕)
约束:
- 不讨论政治敏感话题
- 不提供医疗/法律建议(请咨询专业人士)
- 回答简洁,控制在200字以内
回复格式:始终用亲切的"你"来称呼,用"~"结尾给人文案感。
"""
4.2 关键参数
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
temperature=0.7, # 0-2:越高越随机/创意,越低越确定/保守
max_tokens=1000, # 最大输出长度
top_p=0.9, # 核采样:只考虑概率累积到 top_p 的 token
frequency_penalty=0, # 重复惩罚:降低重复内容的概率
)
| 参数 | 作用 | 建议值 |
|---|---|---|
temperature |
控制随机性 | 创意写作 0.8-1.0;事实问答 0-0.3 |
max_tokens |
限制输出长度 | 根据需求设定 |
top_p |
核采样 | 通常 0.9 |
frequency_penalty |
防重复 | 需要多样性时 0.3-0.5 |
五、Streamlit —— 10分钟构建 AI 聊天界面
Streamlit 是 Python 生态中最快的 Web 应用框架,几行代码就能把 AI 对话变成网页。
5.1 安装与入门
pip install streamlit
# app.py
import streamlit as st
st.title("🤖 AI 智能伴侣")
st.write("你好!我是你的 AI 伴侣小甜甜~")
user_input = st.chat_input("说点什么吧...")
if user_input:
st.chat_message("user").write(user_input)
st.chat_message("assistant").write(f"收到你的消息:{user_input} ✨")
streamlit run app.py
5.2 AI 智能伴侣完整代码
# ai_companion.py
import streamlit as st
from openai import OpenAI
# ===== 页面配置 =====
st.set_page_config(
page_title="AI 智能伴侣",
page_icon="💕",
layout="wide"
)
# ===== 初始化 =====
if "messages" not in st.session_state:
st.session_state.messages = []
if "client" not in st.session_state:
st.session_state.client = OpenAI(
api_key="sk-xxxxxxxx",
base_url="https://api.deepseek.com/v1",
)
SYSTEM_PROMPT = """
你叫小甜甜,是一个温柔可爱的AI伴侣。
请用亲切、可爱的语气与用户交流,适当使用颜文字 (◕‿◕)。
保持回复简洁温暖,像朋友聊天一样自然。
"""
# ===== 侧边栏:伴侣设定 =====
with st.sidebar:
st.title("💕 小甜甜")
st.image("https://via.placeholder.com/150", caption="你的AI伴侣")
# 性格选择
personality = st.selectbox(
"伴侣性格",
["温柔可爱", "活泼元气", "知性优雅", "幽默风趣"]
)
st.divider()
# 清空对话
if st.button("🔄 开启新对话"):
st.session_state.messages = []
st.rerun()
st.caption("Powered by DeepSeek ❤️")
# ===== 对话历史展示 =====
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.write(msg["content"])
# ===== 用户输入 =====
if prompt := st.chat_input("和小甜甜聊聊天吧..."):
# 添加用户消息
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.write(prompt)
# 调用 AI
with st.chat_message("assistant"):
with st.spinner("小甜甜正在思考..."):
# 动态调整 System Prompt
system_prompt = SYSTEM_PROMPT + f"\n当前伴侣性格设定:{personality}"
response = st.session_state.client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": system_prompt},
*st.session_state.messages
],
temperature=0.8,
max_tokens=500,
)
reply = response.choices[0].message.content
st.write(reply)
st.session_state.messages.append({"role": "assistant", "content": reply})
六、会话记忆 —— 让 AI 记住你们的对话
6.1 核心问题
AI 大模型的交互本质是无状态的——每次请求都是全新的,它不记得上一轮说了什么。
用户AI❌ 没有记忆时12个苹果分给3个人每人4个那2个人呢?😕 什么2个人?请提供更多上下文用户AI
6.2 解决方案:会话历史滚雪球
用户AI✅ 滚雪球记忆[12个苹果分给3个人?]每人4个[12个苹果分给3个人?, AI:每人4个, 那2个人呢?]每人6个![完整历史..., 那4个人呢?]每人3个!用户AI
# 原理:每次请求都把历史消息一起发给 AI
def chat_with_memory(client, user_input, history):
"""带记忆的对话"""
messages = [
{"role": "system", "content": "你叫小甜甜,是可爱的AI伴侣"}
]
messages.extend(history) # 加入历史
messages.append({"role": "user", "content": user_input}) # 当前消息
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages
)
reply = response.choices[0].message.content
# 更新历史
history.append({"role": "user", "content": user_input})
history.append({"role": "assistant", "content": reply})
return reply
# 使用示例
history = []
print(chat_with_memory(client, "你好,我叫楠哥", history))
print(chat_with_memory(client, "我叫什么名字?", history))
# AI 能回答出"楠哥"!
七、会话持久化 —— 保存和加载对话
7.1 文件操作基础
# 三步走:打开 → 读写 → 关闭
# ❌ 传统方式(容易忘记关闭)
f = open("data.txt", "w", encoding="utf-8")
f.write("Hello")
f.close()
# ✅ 推荐方式(自动关闭)
with open("data.txt", "w", encoding="utf-8") as f:
f.write("Hello")
# 操作模式
# r - 只读(默认),文件必须存在
# w - 写入(覆盖),文件不存在则创建
# a - 追加(不覆盖),文件不存在则创建
7.2 JSON 读写
import json
import os
from datetime import datetime
# 保存会话
def save_session(session_id, messages, sessions_dir="sessions"):
os.makedirs(sessions_dir, exist_ok=True)
data = {
"current_session": session_id,
"messages": messages,
"personality": "温柔可爱",
"created_at": datetime.now().isoformat()
}
filepath = os.path.join(sessions_dir, f"{session_id}.json")
with open(filepath, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 加载会话
def load_session(session_id, sessions_dir="sessions"):
filepath = os.path.join(sessions_dir, f"{session_id}.json")
if not os.path.exists(filepath):
return None
with open(filepath, "r", encoding="utf-8") as f:
return json.load(f)
# 列出所有会话
def list_sessions(sessions_dir="sessions"):
if not os.path.exists(sessions_dir):
return []
files = sorted(os.listdir(sessions_dir), reverse=True)
return [f.replace(".json", "") for f in files if f.endswith(".json")]
# 删除会话
def delete_session(session_id, sessions_dir="sessions"):
filepath = os.path.join(sessions_dir, f"{session_id}.json")
if os.path.exists(filepath):
os.remove(filepath)
return True
return False
7.3 带会话管理的 Streamlit 应用
# ai_companion_v2.py —— 支持会话管理的版本
import streamlit as st
from openai import OpenAI
import json, os
from datetime import datetime
SESSIONS_DIR = "sessions"
# ===== 初始化 =====
if "current_session" not in st.session_state:
st.session_state.current_session = None
# ===== 侧边栏:会话管理 =====
with st.sidebar:
st.title("💕 小甜甜")
if st.button("➕ 新建会话"):
session_id = datetime.now().strftime("%Y%m%d_%H%M%S")
st.session_state.current_session = session_id
st.session_state.messages = []
st.rerun()
st.divider()
st.subheader("📋 历史会话")
sessions = sorted(
[f.replace(".json", "") for f in os.listdir(SESSIONS_DIR)
if f.endswith(".json")],
reverse=True
) if os.path.exists(SESSIONS_DIR) else []
for sid in sessions:
col1, col2 = st.columns([4, 1])
with col1:
if st.button(sid, key=f"load_{sid}"):
with open(f"{SESSIONS_DIR}/{sid}.json") as f:
data = json.load(f)
st.session_state.current_session = sid
st.session_state.messages = data["messages"]
st.rerun()
with col2:
if st.button("✕", key=f"del_{sid}"):
os.remove(f"{SESSIONS_DIR}/{sid}.json")
if st.session_state.current_session == sid:
st.session_state.current_session = None
st.session_state.messages = []
st.rerun()
# ===== 主界面 =====
if st.session_state.current_session is None:
st.info("👈 点击「新建会话」开始聊天吧!")
else:
st.title(f"💕 会话:{st.session_state.current_session}")
for msg in st.session_state.get("messages", []):
with st.chat_message(msg["role"]):
st.write(msg["content"])
if prompt := st.chat_input("说点什么..."):
st.session_state.messages.append({"role": "user", "content": prompt})
# ... 调用 AI 获取回复 ...
# reply = get_ai_response(...)
# st.session_state.messages.append({"role": "assistant", "content": reply})
# 自动保存
os.makedirs(SESSIONS_DIR, exist_ok=True)
with open(f"{SESSIONS_DIR}/{st.session_state.current_session}.json", "w") as f:
json.dump({"current_session": st.session_state.current_session,
"messages": st.session_state.messages}, f, ensure_ascii=False)
八、小结
💡 核心心法:
AI 应用 = 前端界面(Streamlit)+ 后端逻辑(API 调用)+ 数据管理(文件/数据库)
会话记忆靠"滚雪球"——每次把历史消息一起发给 AI
Prompt 工程是让 AI 按你心意说话的艺术,角色设定 + 约束 + 格式 是关键
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)