python知识点整理02

第一部分:核心语法 - 异常处理

在调用 AI 接口时,网络波动或 API 错误非常常见,因此异常处理尤为重要。

  • 异常捕获 (try-except):防止程序因报错而崩溃。
  • 常见异常类型 :ConnectionError (网络断开), ValueError (数据格式错误), KeyError (字典键不存在)。
  • 资源释放 (finally):无论是否出错,都要执行的代码(如关闭文件)。
python 复制代码
# 模拟调用 AI 接口时的异常处理
def call_ai_api(prompt):
    try:
        # 假设这是调用接口的代码
        response = {"text": "你好"}
        if not response:
            raise ValueError("API 返回为空")
        return response['text']

    except ConnectionError as e:
        print(f"网络连接失败,请检查网络: {e}")
        return None
    except KeyError as e:
        print(f"数据解析错误,缺少字段: {e}")
        return None
    except Exception as e:
        print(f"发生未知错误: {e}")
    finally:
        print("本次调用结束")

# 测试
call_ai_api("Hello")

第二部分:AI 应用与大模型部署

这部分介绍了如何获取和使用大模型能力,分为"本地部署"和"云端 API"两种主流方案。

  • Ollama 本地部署:适合隐私要求高、无网环境或开发者调试。它允许你在本地电脑运行 Llama3、Qwen 等模型。
  • DeepSeek 官方 API:适合生产环境,无需高性能显卡,按 Token 付费,直接通过网络请求调用。
  • 网络基础:理解 IP、端口、DNS 以及 HTTP/HTTPS 协议是调用的前提。

第三部分:大模型调用与 HTTP 协议

这一板块深入讲解了如何与模型"对话"。本质上,调用大模型就是发送一个特定的 HTTP POST 请求。

  • HTTP 协议:客户端(你的代码)向服务器(AI 厂商)发送请求。
  • JSON 数据格式:目前主流的 API 交互格式。
  • Apifox/Postman 测试:在写代码前,先用工具测试接口是否通畅。
代码示例:构造标准的 API 请求体
python 复制代码
import requests
import json

# 定义请求头和数据格式
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_API_KEY"  # 身份验证
}

# 构造符合 DeepSeek/OpenAI 格式的请求数据
payload = {
    "model": "deepseek-chat",
    "messages": [
        {"role": "system", "content": "你是一个Python助手"},
        {"role": "user", "content": "写一个Hello World"}
    ],
    "stream": False  # 是否开启流式输出
}

# 发送 POST 请求
# response = requests.post("https://api.deepseek.com/v1/chat/completions", headers=headers, json=payload)
# print(response.json())

第四部分:高级调用与会话记忆

大模型本质是"无状态"的(它记不住上一句说了什么),要实现像人一样的聊天,需要人为维护"上下文"。

  • 会话记忆方案:将历史对话存入列表或数据库,每次提问时把历史记录一起发给模型。
  • 提示词工程:通过优化 Prompt(提示词)来引导模型输出更好的结果(例如:"请扮演一位资深程序员...")。
  • 流式输出:像打字机一样逐字显示,提升用户体验。
代码示例:简单的会话记忆逻辑
python 复制代码
# 维护一个消息列表作为"记忆"
chat_history = [
    {"role": "system", "content": "你是一个乐于助人的助手。"}
]

def chat_with_memory(user_input):
    # 1. 把用户新说的话加入记忆
    chat_history.append({"role": "user", "content": user_input})

    # 2. 将整个 history 发送给 API (伪代码)
    # ai_response = api_call(chat_history)

    # 3. 把 AI 的回复也加入记忆,以便下一轮对话能理解上下文
    # chat_history.append({"role": "assistant", "content": ai_response})

    return "模拟回复"

print(chat_with_memory("我叫小明"))
print(chat_with_memory("我叫什么名字?")) # 此时模型应该知道你是小明

第五部分:Streamlit 实战开发

这部分是将上述技术整合成一个可视化的 Web 应用。Streamlit 是 Python 生态中最流行的快速构建数据/AI 应用的框架。

1. 界面构建
  • 页面设置:设置网页标题、图标、宽屏模式。
  • 布局 :使用 st.sidebar (侧边栏) 放置配置项,主区域放置聊天窗口。
  • 消息展示 :使用 st.chat_message 区分用户和 AI 的气泡样式。
2. 会话管理与持久化

由于 Streamlit 每次交互都会重新运行整个脚本,变量会重置。因此需要使用 st.session_state 来保存聊天记录。

  • 新建/保存会话:将聊天记录保存为 JSON 文件,实现历史记录功能。
  • 资源释放:清理不再需要的临时文件。
代码示例:Streamlit 聊天应用核心逻辑
python 复制代码
import streamlit as st
import json

# 1. 初始化 Session State (相当于内存数据库)
if "messages" not in st.session_state:
    st.session_state.messages = []

# 2. 侧边栏设置
with st.sidebar:
    st.title("设置")
    if st.button("清空历史"):
        st.session_state.messages = [] # 清空内存
        st.rerun() # 刷新页面

# 3. 渲染历史消息
for msg in st.session_state.messages:
    with st.chat_message(msg["role"]):
        st.markdown(msg["content"])

# 4. 处理用户输入
if prompt := st.chat_input("请输入内容..."):
    # 显示用户消息
    with st.chat_message("user"):
        st.markdown(prompt)
    # 存入历史
    st.session_state.messages.append({"role": "user", "content": prompt})

    # 模拟 AI 思考并回复
    with st.chat_message("assistant"):
        response = f"我收到了你的消息:{prompt}"
        st.markdown(response)
    # 存入历史
    st.session_state.messages.append({"role": "assistant", "content": response})

    # 5. 保存到本地 JSON (持久化)
    with open("chat_history.json", "w", encoding="utf-8") as f:
        json.dump(st.session_state.messages, f, ensure_ascii=False)
相关推荐
codists14 分钟前
《crafting interpreters》阅读笔记:p45-p45
python
码匠许师傅18 分钟前
【C++三方组件】POCO:跨平台系统编程全家桶
开发语言·c++
bkspiderx1 小时前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信
小王C语言1 小时前
Qt常用控件:输入类控件,单行/多行输入框、下拉框、(日期)微调框、旋钮、滑动条
开发语言·qt
ESDWAN1 小时前
SD-WAN 主备切换为什么仍然会断网?从检测机制到会话恢复分析
开发语言·php
曲径海盗1 小时前
【Python 学习第 41 天】for 循环
python·学习笔记·编程入门
摇滚侠1 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
1001101_QIA1 小时前
.exe does not seem to be a Qt executable.
开发语言·qt
沧海一笑-dj2 小时前
【Python】Python学习笔记-模块与包
python·pip·模块·包·python包·python模块·包与模块
echome8882 小时前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧