📅 更新日期:2026-06-08
🧠 标签:AI应用 大模型部署 Ollama API调用 会话记忆


前言:AI、大模型与 AI 应用的概念

  • AI(人工智能) 是一个宏大的学科领域,目标是让机器能够像人一样思考、推理和解决问题。它涵盖了机器学习、深度学习、计算机视觉(CV)、自然语言处理(NLP)等众多子领域。
  • 大模型 是 AI 技术发展中的一个重要分支。通常指参数规模非常庞大的神经网络模型,通过海量数据训练后,表现出强大的理解、生成和推理能力。大模型最常见的形态是大语言模型(LLM),比如 OpenAI 的 GPT 系列、深度求索的DeepSeek、Google 的 Gemini、阿里的 Qwen、字节的豆包等,它们主要用于理解和生成文本。但大模型不局限于语言,也有像 Stable Diffusion 这样的视觉生成大模型,所以它既属于深度学习,又常见于 NLP 领域,但绝不仅限于 NLP。
  • AI 应用 则是把大模型的能力落到具体业务场景中,解决实际问题的产品或服务。比如购物网站的智能客服、AI 自动翻译、AI 搜索、文档摘要、代码辅助、视频生成等等。我们所做的“大模型部署”和“代码调用”,目的都是为了在自己的应用里集成大模型能力,从而打造 AI 应用。

0. 必备的计算机网络知识回顾

调用大模型 API 或本地部署模型时,所有交互都发生在网络上,本质是 HTTP 请求 / 响应。因此,回顾一下计算机网络基础知识,特别是 HTTP 协议,会让我们后续的部署和调用理解得更加透彻,这不得不翻出408学习时的笔记喽~

0.1 五层模型

我们教学中最常使用的是 TCP/IP 五层模型:应用层 → 运输层 → 网络层 → 数据链路层 → 物理层。

通俗理解来说:数据在发送端是一层层 “穿上马甲”(封装),经过中间设备(如路由器)会 “脱掉外层马甲看一眼,再穿上新的马甲”,到达接收端再一层层 “脱下所有马甲”(解封装)。

下图用箭头清晰展示了这个过程:
请添加图片描述

关键点:

  • 发送端:应用层报文 → 运输层加上 TCP 首部 → 网络层加上 IP 首部 → 数据链路层加上帧头帧尾 → 物理层变成比特流。
  • 路由器:收到帧后解封装到网络层,根据目的 IP 决定下一跳,然后重新封装成新帧发出。
  • 接收端:从物理层向上逐层解封装,最后应用层拿到原始数据。

0.2 HTTP 协议报文格式

HTTP 协议位于应用层,规定了浏览器与服务器之间“对话”的格式。我们调用大模型 API,就是构造一个 HTTP 请求发给模型服务端。

请求报文格式:
请添加图片描述

响应报文格式:
在这里插入图片描述

  • 请求行:方法(GET / POST)、资源路径、协议版本
  • 请求头:Key: Value 格式,例如 Content-Type: application/jsonAuthorization: Bearer xxx
  • 空行:分隔首部和主体
  • 请求体:在 POST 请求中存放要发送的数据(如 JSON 格式的对话消息)

响应报文格式:
在这里插入图片描述

  • 状态行:协议版本、状态码
  • 响应头:Key: Value 格式
  • 空行
  • 响应体:服务器返回的实际内容(如模型生成的回答)

状态码:程序员最喜欢看到 2xx,最头疼 4xx,5xx 就只能祈祷厂商别宕机了 😄(玩笑~。

0.3 访问一个网站的完整旅程

现在,我们以一个校园网访问 www.dilidili.com 的例子,将上述知识串联起来,这也是你调用 API 时数据包实际走过的路。
请添加图片描述

第一步:DNS 解析(域名 → IP)

浏览器检查本地 DNS 缓存,没有则向本地 DNS 服务器发请求。客户端知道 DNS 服务器 IP,但不知道其 MAC 地址,于是在局域网内广播 ARP 请求:“谁 IP 是 166.1.128.98?请告诉我你的 MAC”。拿到 MAC 后,封装帧通过交换机(查 MAC 地址表转发)到达本地 DNS 服务器。 本地 DNS 服务器可能迭代查询根域名服务器、.com 顶级域、dilidili.com的权威 DNS,最终返回 www.dilidili.com 的 IP 地址。

第二步:三次握手建立 TCP 连接
浏览器与查询到的目标 Web 服务器的 80 端口进行三次握手。由于客户端和服务器不在同一网段,数据包会经由默认网关层层路由。

第三步:在握手三中携带 HTTP 请求报文
浏览器构造 HTTP 请求报文(例如 GET /index.html HTTP/1.1),封装成 TCP 段 → IP 数据报 → 帧。沿途每个路由器解包到网络层查路由表,重新封装后转发,直到到达服务器所在网络的最后一个路由器,该路由器通过 ARP 找到 Web 服务器的 MAC,将帧送达。

第四步:服务器响应
Web 服务器解封装得到 HTTP 请求,处理后返回 HTTP 响应报文(状态码 200,携带 HTML 文件)。响应数据原路返回客户端。

第五步:浏览器解析与额外请求
如果 HTML 中包含图片、视频等外部对象,浏览器会再次发起 HTTP 请求,流程同上(可能复用 TCP 连接,取决于http的工作方式)。

比喻:数据就像一封信,每一层都套一个不同颜色的信封。你从最内层开始一层层套好,交给快递员(物理层)。中途转运中心(路由器)只撕开最外面的信封,看一眼城市名(IP),套上新信封继续送。最终收件人一层层拆开,拿到最里面的信纸。


1. 大模型部署的三种方式

根据“模型文件在哪”和“推理计算在哪”,我们可以把大模型部署分为三类:

类型 模型文件位置 推理计算位置 切换不同模型 典型代表
本地部署 你自己的电脑磁盘 你的 CPU / GPU 可以,下载多个模型后通过本地 API 切换 Ollama、llama.cpp
官方 API 模型厂商的服务器 厂商云端 GPU 只能切换同一厂商的不同模型 OpenAI API、Anthropic API
云集成 第三方平台(聚合) 平台云端 GPU 可以跨厂商切换,统一接口 OpenRouter、Together AI
  • 官方 API 和云集成的区别:前者只能调其自家模型,后者像一个模型超市,一个接口就能在多个厂商的模型之间切换,非常方便。
  • 本地切换模型:本质是在你自己的硬件上运行不同模型,所有数据不离本地,隐私安全拉满,但需要你有较好的硬件(尤其是显存)。
  • 云集成和官方API:计算都在云端,你只需要轻量级的客户端,前期成本低,但数据会传到第三方平台。
    在这里插入图片描述

选择哪种方式,取决于你的隐私需求、硬件条件、成本预算和灵活性要求。下面我们重点实践前两种。

1.1 官方 API 部署调用

因为模型推理和参数都在官方服务器,我们不需要任何部署,只需要学会如何构造 HTTP 请求去调用。

以 DeepSeek 官方 API 为例:

  1. 查看 API 文档:进入 DeepSeek 开放平台,查看 Base URL、API_KEY、可用模型列表等。

在这里插入图片描述

  1. 获取 API Key:它是你调用 API 的唯一身份凭证,务必妥善保管。很多平台 Key 创建后只显示一次,记得复制下来。

  2. 测试调用:官方通常提供 curl 示例。下面是一个请求示例(注意替换你的 Key):

在这里插入图片描述

curl https://api.deepseek.com/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${DEEPSEEK_API_KEY}" \
  -d '{
        "model": "deepseek-v4-pro",
        "messages": [
          {"role": "system", "content": "You are a helpful assistant."},
          {"role": "user", "content": "Hello!"}
        ],
        "thinking": {"type": "enabled"},
        "reasoning_effort": "high",
        "stream": false
      }'

参数解读

  • model:指定要使用的模型版本。
  • messages:对话列表,角色有三种:
    • system:设定 AI 的身份和行为准则(如“你是一个可爱的助手,名字叫小甜甜,回答要亲切可爱”)。
    • user:用户的实际提问。
    • assistant:模型的回复(在需要上下文时携带)。
  • streamfalse 表示一次性返回完整结果,true 则是像 ChatGPT 那样一个字一个字地蹦出来(流式输出)。
  • thinkingreasoning_effort:与模型思考过程相关的参数,不同厂商可能不同。
    在这里插入图片描述
    执行后,你会得到类似下面的 JSON 响应,模型回复藏在 choices[0].message.content 中。

我测试提问“什么是 HTTP 协议”,测试和回答效果如下:

在这里插入图片描述

1.2 本地部署:Ollama

Ollama 是一个让你在本地轻松运行、管理大模型的工具。官网:https://ollama.com/

基本使用流程

  1. 下载并安装 Ollama。
  2. 打开终端,运行 ollama pull <模型名> 下载你想要的模型(如 llama3qwen2 等),或者直接 ollama run <模型名>,如果本地没有该模型它会自动下载并启动。
  3. 模型启动后,你就可以在终端里直接和它对话。同时 Ollama 会在本地启动一个 API 服务,你可以像调用官方 API 那样,通过 HTTP 请求向本地模型发送消息。

本地大模型调用的请求格式和官方 API 高度相似,只是 URL 变了(Ollama 也兼容 OpenAI 的接口格式,这点后面代码部分会体现)。

优势:完全离线可用,数据零泄露。
缺点:吃硬件,大模型需要大显存,否则推理很慢。

1.3 会话记忆

用过大语言模型很多网页版,发现它能记得上一句话,甚至会根据上下文给出连贯回答。但大模型本身是无状态的,每一次 API 请求都是独立的,模型并不天然具备记忆。

那记忆是怎么实现的?答案是:历史消息滚雪球

在这里插入图片描述

在这里插入图片描述

简单说,每次我们向模型发送请求时,会把之前所有的对话历史(包括用户问题和模型回答)一起带上。模型看到完整的“聊天记录”,自然就能给出上下文相关的回答。

为什么在一个对话框里聊太多,效果会变差?
原因主要有两点:

  1. 上下文窗口有限:每个模型都有最大处理 token 数(比如 4K、8K、128K)。当历史消息累计超过这个长度,就不得不截断或遗忘最早的内容,导致模型“失忆”或理解断裂。
  2. 错误累积与漂移:早期的理解偏差、不精确的表述会一直留在历史中,像滚雪球一样越滚越大,最终带偏整个对话方向。
  3. 成本上升:每次请求都发送大量历史,消耗的 token 更多,API 调用费用也会飙升。

所以在实践中,我们要有策略地管理会话记忆,比如只保留最近几轮对话、定期总结摘要,或者利用向量数据库做长时记忆检索。


2. 用代码调用大模型

前面我们用的是 curl,方便测试但不够灵活。真正开发时通常会用 Python、JavaScript 等语言。下面以 Python 为例,展示如何用代码调用 DeepSeek 官方 API,以及本地 Ollama 模型。

2.1 Python + OpenAI 兼容接口

很多大模型厂商(DeepSeek、通义千问、Ollama 等)都选择兼容 OpenAI 的 API 格式。这样做的好处是,你可以直接使用 OpenAI 官方提供的 openai Python 库,只需修改 base_urlapi_key 即可切换到不同厂商。

openai 库是什么?
它是 OpenAI 公司发布的 Python SDK,封装了所有 API 细节,让你能用 client.chat.completions.create() 这样简洁的函数调用模型。因为兼容性,它成了事实上的大模型调用标准库。

在这里插入图片描述

示例代码(调用 DeepSeek):

# 请先安装:pip install openai
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ.get('DEEPSEEK_API_KEY'),  # 从环境变量读取,安全!
    base_url="https://api.deepseek.com"
)

response = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "Hello"},
    ],
    stream=False,
    reasoning_effort="high",
    extra_body={"thinking": {"type": "enabled"}}
)

print(response.choices[0].message.content)

安全实践:永远不要把 API Key 直接硬编码在代码里!更推荐将其配置到系统环境变量中(如上例用 os.environ.get),或者使用 .env 文件配合 python-dotenv 库加载。

参数解释

  • api_key:从环境变量读取,避免泄露。
  • base_url:指向厂商的 API 端点。
  • messages:和 curl 示例完全一致。
  • stream=False:等待完整结果再打印。如果需要打字机效果,可设为 True 并逐块处理。
  • extra_body:用于传递厂商特有的参数(如 DeepSeek 的 thinking)。

实现历史会话记忆
只需维护一个列表,每次把用户输入和模型回复追加进去,下次请求时传入完整的列表即可。

2.2 调用本地 Ollama 模型

当你用 ollama run qwen2 启动了本地模型后,Ollama 会提供一个兼容 OpenAI 的 API。用 openai 库调用本地模型同样简单类似:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",   # Ollama 的 OpenAI 兼容端点
    api_key="ollama"                         # Ollama 不需要真实的 key,但库要求必填,随便填即可
)

response = client.chat.completions.create(
    model="qwen2",                           # 与你 run 的模型名一致
    messages=[
        {"role": "system", "content": "你是一个知识渊博的助手。"},
        {"role": "user", "content": "解释一下什么是机器学习"}
    ],
    stream=False
)

print(response.choices[0].message.content)

注意:Ollama 默认监听的地址是 localhost,如果需要在局域网其他机器调用,需要设置环境变量 OLLAMA_HOST=0.0.0.0 并重启 Ollama。


以上为个人学习总结,旨在梳理个人理解。如有疏漏或不当之处,欢迎指正与交流。如果文章对你有帮助,别忘了点个赞、留个言,让更多的小伙伴看到~ 我们下篇再见!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐