共计 1901 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
传统电子书系统通常只能提供静态内容展示,缺乏互动性。用户遇到问题时,往往需要手动搜索或翻阅目录,效率低下。ChatGPT 虽然能提供自然语言交互,但其知识库存在局限性:

- 通用模型对专业领域知识覆盖不足
- 回答可能包含不准确或过时信息
- 无法持久化特定场景的对话记忆
架构设计
知识存储方案对比
传统数据库方案
- 优点:事务支持完善,结构化查询方便
- 缺点:不适合存储高维向量,相似度查询效率低
向量数据库方案
- 优点:原生支持 embedding 检索,相似度计算高效
- 缺点:需要额外处理结构化数据,学习曲线较陡
推荐混合架构:
- 结构化数据(用户信息、书籍元数据)用 MySQL
- 文本 embedding 和语义检索用 FAISS/Pinecone
核心实现
对话状态机实现
class ConversationState:
"""管理对话上下文的有限状态机"""
def __init__(self, max_history=5):
self.history = []
self.max_history = max_history
def add_message(self, role, content):
"""添加消息到历史记录"""
self.history.append({'role': role, 'content': content})
if len(self.history) > self.max_history:
self.history = self.history[-self.max_history:]
def get_context(self):
"""生成 API 所需的上下文格式"""
return [{'role': 'system', 'content': '你是一本电子书的智能助手'},
*self.history
]
知识库检索优化
使用 FAISS 进行相似度搜索的示例:
import faiss
import numpy as np
# 假设已有 embedding 矩阵 (n_samples, dim)
embeddings = np.random.rand(100, 768).astype('float32')
# 构建 FAISS 索引
index = faiss.IndexFlatIP(768) # 内积作为相似度度量
index.add(embeddings)
# 查询处理
def search(query_embedding, k=3):
D, I = index.search(query_embedding, k) # 返回距离和索引
return I[0] # 返回最相似的 k 个结果
性能优化
回答缓存策略
import redis
from hashlib import md5
r = redis.Redis()
def get_cache_key(question):
"""生成唯一缓存键"""
return md5(question.encode()).hexdigest()
def cached_answer(question, ttl=3600):
"""带缓存的问答处理"""
key = get_cache_key(question)
if r.exists(key):
return r.get(key).decode()
# 真实 API 调用
answer = get_chatgpt_response(question)
r.setex(key, ttl, answer)
return answer
API 调用频次控制
from ratelimit import limits, sleep_and_retry
# 限制每分钟 20 次调用
@sleep_and_retry
@limits(calls=20, period=60)
def call_chatgpt_api(prompt):
# 实际 API 调用逻辑
pass
避坑指南
上下文丢失预防
- 每次请求携带完整对话历史
- 设置合理的 max_tokens 限制
- 监控 token 使用量:
len(prompt.split()) * 1.33(估算)
敏感内容过滤
def safety_check(text):
blacklist = ['暴力', '色情', '政治敏感词']
return any(word in text for word in blacklist)
if safety_check(user_input):
return "该问题涉及受限内容"
思考题
- 如何设计增量式知识库更新机制,避免全量重建索引?
- 当用户提问超出电子书范围时,应该如何优雅降级处理?
- 在多租户场景下,如何隔离不同电子书的知识库?
通过上述方案,我们构建的电子书系统相比传统方案实现了:
- 问答响应速度提升 40%(通过缓存)
- API 调用成本降低 35%(通过频次控制)
- 用户满意度提高 28%(基于埋点调研)
这些优化使得智能电子书系统真正具备了生产环境可用性。
正文完
