前言
随着大语言模型的快速发展,将ChatGPT API集成到企业应用中已成为趋势。本文将从零开始,手把手教你搭建一个完整的智能客服系统,涵盖API接入、Prompt工程、上下文管理、流式输出等核心技术点。
一、环境准备
1.1 注册OpenAI账号
首先访问 platform.openai.com 注册账号,获取API Key。注意保护好你的Key,不要提交到代码仓库。
1.2 安装依赖
# 创建虚拟环境
python -m venv venv
source venv/bin/activate
# 安装依赖
pip install openai fastapi uvicorn python-dotenv
1.3 配置环境变量
# .env 文件
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.openai.com/v1
二、基础API调用
2.1 最简单的对话
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL")
)
def chat(user_message: str) -> str:
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一个专业的客服助手。"},
{"role": "user", "content": user_message}
],
temperature=0.7,
max_tokens=1000
)
return response.choices[0].message.content
# 测试
print(chat("你好,请问你们的产品有哪些功能?"))
2.2 关键参数解释
model: 选择模型,gpt-3.5-turbo性价比最高,gpt-4效果最好messages: 对话历史,system设定角色,user是用户输入temperature: 创造性,0-1,客服场景建议0.3-0.7max_tokens: 最大输出长度,根据需求设置
三、Prompt工程
3.1 系统提示词设计
好的System Prompt是智能客服的关键。以下是经过实战验证的模板:
SYSTEM_PROMPT = """
你是一个专业的技术支持客服,隶属于17老师的技术团队。
## 你的职责:
1. 回答用户关于产品和技术的问题
2. 引导用户描述问题细节
3. 提供解决方案或转接人工
## 回答规范:
- 使用友好、专业的语气
- 回答简洁明了,避免冗长
- 如果不确定,诚实告知并建议联系人工
- 涉及敏感信息(密码、密钥)时提醒用户注意安全
## 产品信息:
- 我们提供Linux运维、网络安全、自动化运维等技术服务
- 服务时间:7x24小时
- 联系方式:j.d88888888@qq.com
"""
3.2 Few-shot学习
通过提供示例让AI学习回答风格:
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": "你们的服务多少钱?"},
{"role": "assistant", "content": "您好!我们的技术服务价格如下:\n- Linux服务器运维:¥500起/次\n- 网站搭建:¥800起/个\n- 安全加固:¥1000起/次\n- 自动化运维:¥1500起/项目\n\n具体价格需要根据您的需求评估,请告诉我您的具体需求,我来帮您估算。"},
{"role": "user", "content": user_message}
]
四、上下文管理
4.1 对话历史存储
智能客服需要记住对话上下文,使用Redis存储对话历史:
import redis
import json
from typing import List
r = redis.Redis(host='localhost', port=6379, db=0)
def get_history(session_id: str, max_turns: int = 10) -> List[dict]:
key = f"chat:{session_id}"
history = r.lrange(key, 0, -1)
messages = [json.loads(h) for h in history]
# 保留最近N轮对话
return messages[-max_turns*2:] if len(messages) > max_turns*2 else messages
def save_message(session_id: str, role: str, content: str):
key = f"chat:{session_id}"
r.rpush(key, json.dumps({"role": role, "content": content}))
r.expire(key, 3600) # 1小时过期
4.2 Token限制处理
当对话历史超过模型Token限制时,需要智能截断:
def trim_messages(messages: List[dict], max_tokens: int = 3000) -> List[dict]:
"""保留system prompt + 最近的对话,确保不超Token限制"""
system_msg = [m for m in messages if m["role"] == "system"]
other_msgs = [m for m in messages if m["role"] != "system"]
# 简单估算:中文约1.5 token/字,英文约0.75 token/word
total = sum(len(m["content"]) * 1.5 for m in other_msgs)
while total > max_tokens and len(other_msgs) > 2:
removed = other_msgs.pop(0)
total -= len(removed["content"]) * 1.5
return system_msg + other_msgs
五、流式输出
5.1 SSE流式响应
使用FastAPI实现流式输出,让用户体验更好:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
app = FastAPI()
@app.post("/api/chat")
async def chat_stream(session_id: str, message: str):
# 保存用户消息
save_message(session_id, "user", message)
# 获取对话历史
history = get_history(session_id)
messages = [{"role": "system", "content": SYSTEM_PROMPT}] + history
async def generate():
full_response = ""
stream = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=messages,
stream=True,
temperature=0.7
)
for chunk in stream:
if chunk.choices[0].delta.content:
text = chunk.choices[0].delta.content
full_response += text
yield f"data: {json.dumps({'text': text})}\n\n"
# 保存AI回复
save_message(session_id, "assistant", full_response)
yield f"data: {json.dumps({'done': True})}\n\n"
return StreamingResponse(generate(), media_type="text/event-stream")
六、前端集成
6.1 简单聊天界面
<div id="chat-container">
<div id="messages"></div>
<input id="user-input" placeholder="输入消息..." />
<button onclick="sendMessage()">发送</button>
</div>
<script>
let sessionId = crypto.randomUUID();
async function sendMessage() {
const input = document.getElementById('user-input');
const message = input.value.trim();
if (!message) return;
// 显示用户消息
appendMessage('user', message);
input.value = '';
// 流式接收AI回复
const response = await fetch(`/api/chat?session_id=${sessionId}&message=${encodeURIComponent(message)}`);
const reader = response.body.getReader();
const decoder = new TextDecoder();
let aiMessage = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
const text = decoder.decode(value);
const lines = text.split('\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = JSON.parse(line.slice(6));
if (data.text) {
aiMessage += data.text;
updateAIMessage(aiMessage);
}
}
}
}
}
function appendMessage(role, content) {
const div = document.createElement('div');
div.className = `message ${role}`;
div.textContent = content;
document.getElementById('messages').appendChild(div);
}
</script>
七、部署上线
7.1 Docker部署
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
7.2 生产环境建议
💡 生产环境Checklist:
- 使用环境变量管理API Key,不要硬编码
- 添加请求频率限制,防止滥用
- 实现对话内容审计和日志记录
- 设置超时和重试机制
- 添加敏感词过滤
总结
本文介绍了使用ChatGPT API搭建智能客服系统的完整流程,从基础API调用到Prompt工程、上下文管理、流式输出,再到前端集成和部署上线。掌握了这些核心技能,你就可以快速搭建自己的AI应用。
如果需要更复杂的AI应用开发或企业级部署,欢迎联系17老师获取专业支持。
关于17老师:AI应用·数字化管理·全栈开发·网络安全全栈专家。联系邮箱:j.d88888888@qq.com,微信:AFIST17