目录

一、AI 大模型基础

1.1 什么是大模型?

1.2 大模型能做什么?

二、HTTP 协议速通

关键概念

三、接入 DeepSeek API

3.1 获取 API Key

3.2 安装 OpenAI SDK

3.3 第一次调用

3.4 Messages 结构详解

四、Prompt 工程 —— 让 AI 更好用的艺术

4.1 System Prompt 设计

4.2 关键参数

五、Streamlit —— 10分钟构建 AI 聊天界面

5.1 安装与入门

5.2 AI 智能伴侣完整代码

六、会话记忆 —— 让 AI 记住你们的对话

6.1 核心问题

6.2 解决方案:会话历史滚雪球

七、会话持久化 —— 保存和加载对话

7.1 文件操作基础

7.2 JSON 读写

7.3 带会话管理的 Streamlit 应用

八、小结


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

  1. 访问 https://platform.deepseek.com

  2. 注册/登录 → API Keys → 创建新的 API Key

  3. 保存好 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 按你心意说话的艺术,角色设定 + 约束 + 格式 是关键


下一篇预告:Python 项目实战之网络爬虫 —— 从零打造你的数据采集机器人

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐