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)
相关推荐
打工仔折腾 AI1 小时前
Docker镜像分层与卷挂载到底怎么工作:一次文件系统层面的实测分析
运维·人工智能·后端·python·docker·容器·性能优化
老歌老听老掉牙1 小时前
麻花钻锥面后刀面数学模型的完整推导与数值求解
python·钻头·后刀面
denlaku1 小时前
JDK 10 新特性详解
java·开发语言
cfm_29141 小时前
Java常见加密算法全解
开发语言
墨染天姬2 小时前
【人工智能训练师】python语法二
开发语言·人工智能·python
木易 士心2 小时前
JavaScript 闭包原理和实践深度解析
开发语言·javascript·ecmascript
小羊没烦恼!2 小时前
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
java·开发语言·前端·数据库·算法·c#
Chase_______2 小时前
【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署
java·开发语言·jvm
Nebula_g2 小时前
JavaSE拓展:Arrays和Collections工具类
java·开发语言·算法·排序算法·工具类·javase·技术栈