EnlyAI ← 返回首页
教程 LLM 2026 年 6 月 18 日 · 阅读约 12 分钟

如何搭建自己的AI聊天机器人:从零到上线

2026 年,大语言模型(LLM)已经从实验室走进生产环境。无论是做客服助手、知识问答,还是个人效率工具,搭建一个 AI 聊天机器人都不再是大型团队的专利。只要有一个可用的 LLM API,几小时就能跑通一个可对话的原型,再花一两天完善上下文管理和界面,就能上线服务真实用户。

这篇文章会带你完整走一遍流程:从技术选型、调用 LLM API,到管理多轮对话上下文、搭建 Web 界面,最后部署到公网。所有代码示例都可以直接复制运行,我们使用 OpenAI 兼容的接口格式,这样无论你最终用 GPT、Claude 还是 Gemini,代码几乎不用改。

一、为什么自己搭建,而不是用现成产品

市面上确实有不少开箱即用的 AI 对话产品,但自己搭建有几个明显优势:

二、技术选型:选一个统一的 LLM API

搭建聊天机器人的第一步,是拿到一个能用的 LLM API。这里有个现实问题:OpenAI、Anthropic、Google 三家的接口格式各不相同,如果你直接对接各家原生 API,代码会非常分散,后续切换模型成本很高。

更聪明的做法是使用一个兼容 OpenAI 格式的聚合接口。这样你只需要写一套对接 OpenAI 格式的代码,就能在 GPT、Claude、Gemini、DeepSeek 等模型之间自由切换。EnlyAI(https://enlyai.com)就是这样一个 LLM API 聚合平台,它的接口完全兼容 OpenAI 格式,base URL 是 https://enlyai.com/v1,你只需要一个 API Key 就能调用几十种模型。

本文所有示例都基于 OpenAI 兼容格式,你可以用 EnlyAI 的 Key 直接跑通,也可以替换成任何兼容此格式的服务。

三、环境准备

我们用 Python 来搭建后端,因为它有最成熟的 LLM 生态。先确认本地环境:

# 需要 Python 3.9+,推荐用虚拟环境
python3 -m venv venv
source venv/bin/activate

# 安装依赖
pip install openai flask python-dotenv

把你的 API Key 存到环境变量里,避免硬编码到代码中:

# .env 文件
OPENAI_API_KEY=sk-你的key
OPENAI_BASE_URL=https://enlyai.com/v1

注意 OPENAI_BASE_URL 指向 EnlyAI 的网关地址。如果你用的是官方 OpenAI,这个值可以不设(默认就是官方地址)。这就是聚合平台的好处——一行配置就能换源。

四、第一次调用:用 cURL 验证连通性

在写复杂代码前,先用最原始的 cURL 确认 API 能通。这是排错的第一步,能帮你区分"是网络/Key 的问题"还是"代码的问题"。

curl https://enlyai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [
      {"role": "user", "content": "你好,请用一句话介绍你自己"}
    ]
  }'

如果一切正常,你会收到类似这样的响应:

{
  "id": "chatcmpl-xxx",
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "你好!我是一个AI助手,可以帮你回答问题、写作和编程。"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 12, "completion_tokens": 20, "total_tokens": 32 }
}

看到 usage 字段了吗?它记录了本次调用的 token 消耗,这是计费和成本监控的关键数据,后面我们会用到。

五、用 Python 实现核心对话

cURL 验证通过后,我们来写真正的后端代码。先实现一个最简单的单轮对话函数:

import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()

client = OpenAI(
    api_key=os.getenv("OPENAI_API_KEY"),
    base_url=os.getenv("OPENAI_BASE_URL", "https://enlyai.com/v1"),
)

def chat(user_message: str, model: str = "gpt-4o-mini") -> str:
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": user_message}],
    )
    return response.choices[0].message.content

if __name__ == "__main__":
    print(chat("用三句话解释什么是向量数据库"))

运行这段代码,你就拥有了一个能对话的命令行机器人。但真实场景下,用户不会每次都从零开始问——他们需要多轮对话,机器人得记住前面说过的话。

六、管理多轮对话上下文

多轮对话的关键,是把历史消息一起发给模型。OpenAI 兼容接口的 messages 是一个数组,按 systemuserassistant 顺序排列。我们来实现一个带上下文管理的对话类:

from typing import List, Dict

class ChatSession:
    def __init__(self, system_prompt: str = "你是一个友好的AI助手。"):
        self.history: List[Dict] = [
            {"role": "system", "content": system_prompt}
        ]

    def ask(self, user_input: str, model: str = "gpt-4o-mini") -> str:
        self.history.append({"role": "user", "content": user_input})
        response = client.chat.completions.create(
            model=model,
            messages=self.history,
        )
        reply = response.choices[0].message.content
        self.history.append({"role": "assistant", "content": reply})
        return reply

# 使用示例
session = ChatSession("你是一个Python编程专家,回答简洁。")
print(session.ask("列表和元组有什么区别?"))
print(session.ask("那它们各自适合什么场景?"))  # 模型能记住上文

这里有几个工程上必须注意的点:

  1. 上下文会越来越长:每轮对话都把全部历史发出去,token 消耗会线性增长,成本也会上升。生产环境要做窗口截断,只保留最近 N 轮,或者用摘要压缩历史。
  2. system prompt 很重要:它决定了机器人的"人设"和行为边界。比如客服机器人要明确"只回答本公司产品问题,不讨论政治话题"。
  3. 会话隔离:每个用户一个 ChatSession 实例,用 session_id 区分。线上服务要把会话历史存到 Redis 或数据库,而不是内存里——否则进程重启就丢了。

七、流式输出:让响应更"像人"

用户等待 AI 回复时,逐字流式输出比等十几秒一次性返回体验好得多。OpenAI 兼容接口支持 stream=True,返回的是一个迭代器:

def chat_stream(user_input: str, model: str = "gpt-4o-mini"):
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": user_input}],
        stream=True,
    )
    for chunk in response:
        delta = chunk.choices[0].delta.content
        if delta:
            print(delta, end="", flush=True)

chat_stream("写一首关于春天的现代诗")

在 Web 端,流式输出通常配合 Server-Sent Events(SSE)实现,前端边收边渲染,用户几乎感觉不到等待。

八、搭建一个最小的 Web 界面

用 Flask 暴露一个 HTTP 接口,前端就能调用了。这里给出一个支持流式的最小后端:

from flask import Flask, request, Response, jsonify
import json

app = Flask(__name__)
sessions: Dict[str, ChatSession] = {}

@app.post("/chat")
def chat_endpoint():
    data = request.json
    session_id = data["session_id"]
    user_input = data["message"]

    if session_id not in sessions:
        sessions[session_id] = ChatSession(data.get("system_prompt", "你是AI助手。"))

    session = sessions[session_id]

    def generate():
        session.history.append({"role": "user", "content": user_input})
        stream = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=session.history,
            stream=True,
        )
        full_reply = ""
        for chunk in stream:
            delta = chunk.choices[0].delta.content or ""
            full_reply += delta
            yield f"data: {json.dumps({'delta': delta})}\n\n"
        session.history.append({"role": "assistant", "content": full_reply})

    return Response(generate(), mimetype="text/event-stream")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

前端用几行 JavaScript 就能消费这个 SSE 流,实现打字机效果。前端 UI 不是本文重点,你可以用任何喜欢的方式——原生 JS、React、Vue 都行。

九、部署上线

本地跑通后,部署到公网通常分三步:

  1. 用 Gunicorn 跑生产级 WSGI:Flask 自带的开发服务器不能用于生产。pip install gunicorn 后用 gunicorn -w 4 -b 0.0.0.0:5000 app:app 启动。
  2. 用 Nginx 做反向代理和 HTTPS:Nginx 接收 443 端口的 HTTPS 请求,转发到 Gunicorn 的 5000 端口。用 Let's Encrypt 免费申请 SSL 证书。
  3. 用 systemd 或 Docker 守护进程:保证服务崩溃后自动重启。Docker 化部署更推荐,方便迁移和扩容。

一个典型的 Nginx 配置片段:

server {
    listen 443 ssl http2;
    server_name chat.example.com;

    ssl_certificate     /etc/letsencrypt/live/chat.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chat.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        # SSE 流式需要关闭缓冲
        proxy_buffering off;
        proxy_read_timeout 300s;
    }
}

注意 proxy_buffering off 这一行——它是流式输出能正常工作的关键,否则 Nginx 会把整个响应攒齐才发给客户端,打字机效果就失效了。

十、上线后的优化建议

跑起来只是开始,真正稳定服务用户还需要做这些事:

提示:上下文窗口管理是成本控制的核心。一个简单有效的策略是——保留 system prompt + 最近 6 轮对话,超过的部分用便宜的小模型生成摘要替换。这样既保住了长程记忆,又控制了 token 增长。

十一、模型选择与成本权衡

不是所有问题都需要最贵的模型。一个实用的分层策略:

这也是用聚合平台的价值所在——你可以在同一个接口下,按场景动态切换模型,而不需要维护多套 SDK 和多份 Key。EnlyAI 这类平台还提供统一的用量看板,让你一眼看清每个模型花了多少钱。

总结

搭建一个 AI 聊天机器人,核心其实就三件事:调用 LLM API、管理对话上下文、做好流式输出与部署。技术门槛比大多数人想象的低得多——一个能跑的 MVP,一个下午就能完成。真正的难点在于把它做成稳定、可控、成本合理的产品,这需要在上文提到的限流、监控、降级、RAG 等工程环节持续打磨。

选对 API 入口能让你事半功倍。一个兼容 OpenAI 格式的聚合接口,意味着你的代码不会被某一家厂商锁定,未来模型迭代时也能平滑迁移。希望这篇文章能帮你少走弯路,尽快把想法变成能服务真实用户的产品。

想立刻动手试试?

EnlyAI 提供 OpenAI 兼容的统一 API,一个 Key 即可调用 GPT、Claude、Gemini 等数十种模型。本文所有代码示例只需替换 base URL 为 https://enlyai.com/v1 即可直接运行。

立即注册 EnlyAI,开始搭建 →