一个基于大模型API的智能问答系统,支持用户对话历史记录、向量化知识存储、知识库构建和知识图谱功能。
- 🤖 智能问答: 基于大模型API的自然语言问答
- 💾 历史记录: 完整的用户对话历史保存
- 🔍 向量搜索: 问答对向量化存储,支持语义相似度搜索
- 📚 知识库: 自动从问答中提取和构建知识库
- 🕸️ 知识图谱: 实体关系提取,构建知识图谱
- 🗃️ 数据存储: 使用Supabase作为数据库
- 🎯 上下文感知: 基于对话历史和相关知识的智能回答
- 📊 统计分析: 详细的系统使用统计和知识分析
- 📤 数据导出: 支持对话和知识的多格式导出
- 🔮 智能推荐: 基于上下文的后续问题推荐
- 🏗️ 批量处理: 支持批量知识提取和索引构建
- Python 3.8+
- OpenAI API账号(或兼容的API服务)
- Supabase账号
git clone <repository-url>
cd QA-SYSpip install -r requirements.txt- 在 Supabase 创建新项目
- 在SQL编辑器中执行
database_schema.sql中的SQL语句 - 获取项目URL和API密钥
创建 .env 文件(参考 .env.example):
# Supabase配置
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_KEY=your-supabase-anon-key
# OpenAI配置
OPENAI_API_KEY=your-openai-api-key
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-3.5-turbo
EMBEDDING_MODEL=text-embedding-ada-002
# 本地向量化模型配置
USE_LOCAL_EMBEDDING=true
LOCAL_EMBEDDING_MODEL=BAAI/bge-m3
EMBEDDING_DEVICE=auto
EMBEDDING_DIMENSION=1024
# 可选配置
SIMILARITY_THRESHOLD=0.7
MAX_SEARCH_RESULTS=10
DEBUG=False- 克隆项目并安装依赖:
git clone <repository-url>
cd QA-SYS
pip install -r requirements.txt-
配置环境:
- 复制
.env.example到.env并填入API密钥 - 在Supabase中创建项目并执行
database_schema.sql
- 复制
-
启动系统:
Web界面(推荐):
python start_web.py
# 访问 http://localhost:8000命令行界面:
python cli_app.pyDocker部署:
docker-compose up -d系统默认使用本地BAAI/bge-m3模型进行文本向量化,相比OpenAI API有以下优势:
- ✅ 无API费用 - 完全本地运行,无需付费API
- ✅ 隐私保护 - 数据不离开本地环境
- ✅ 中文优化 - BGE-m3对中文支持更好
- ✅ 响应速度 - 无网络延迟,响应更快
- ✅ 离线使用 - 无需网络连接
USE_LOCAL_EMBEDDING=true # 启用本地embedding
LOCAL_EMBEDDING_MODEL=BAAI/bge-m3 # 模型名称
EMBEDDING_DEVICE=auto # auto/cpu/cuda/mps
EMBEDDING_DIMENSION=1024 # BGE-m3向量维度首次运行时会自动下载模型(约2GB),建议确保网络连接稳定:
# 测试本地embedding功能
python test_local_embedding.py
# 如果下载失败,可手动预下载
python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer('BAAI/bge-m3')"如需切换回OpenAI embedding:
USE_LOCAL_EMBEDDING=false
EMBEDDING_DIMENSION=1536 # OpenAI维度启动Web服务器:
python start_web.py或者直接使用uvicorn:
python web_app.py
# 或
uvicorn web_app:app --reload --host 0.0.0.0 --port 8000然后在浏览器中访问:
Web界面功能:
- 🤖 智能对话 - 实时问答交互
- 📚 知识搜索 - 搜索知识库和相似问题
- 🕸️ 知识图谱 - 实体关系查询和可视化
- 📊 系统统计 - 实时系统状态监控
- 💾 数据管理 - 对话导出和历史管理
启动交互式CLI:
python cli_app.py支持的命令:
ask <问题>- 提问search <查询>- 搜索知识库history- 查看对话历史summary- 生成对话摘要suggest- 获取推荐问题stats- 显示系统统计export- 导出对话help- 显示帮助
运行完整功能演示:
python example_usage.pyimport asyncio
from qa_system import create_qa_system
async def main():
# 创建问答系统
qa_system = create_qa_system(
openai_api_key="your-api-key"
)
# 创建用户
user = await qa_system.create_user("username")
# 开始对话
conversation = await qa_system.start_conversation(
user['id'], "AI学习讨论"
)
# 提问
result = await qa_system.ask_question(
user_id=user['id'],
conversation_id=conversation['id'],
question="什么是人工智能?"
)
print(f"答案: {result['answer']}")
# 运行
asyncio.run(main())QA-SYS/
├── model.py # OpenAI模型封装和增强功能
├── local_embedding.py # 本地向量化模型服务(BAAI/bge-m3)
├── database.py # Supabase数据库操作
├── vector_service.py # 向量化和相似度搜索
├── conversation_manager.py # 对话管理
├── knowledge_base.py # 知识库构建和查询
├── knowledge_graph.py # 知识图谱功能
├── qa_system.py # 主系统类
├── config.py # 配置管理
├── web_app.py # FastAPI Web服务器
├── start_web.py # Web服务启动脚本
├── static/ # 静态文件目录
│ ├── index.html # 主HTML页面
│ ├── css/
│ │ └── style.css # 样式文件
│ └── js/
│ └── app.js # JavaScript逻辑
├── database_schema.sql # 数据库表结构
├── requirements.txt # Python依赖
├── example_usage.py # 使用示例
├── cli_app.py # 命令行界面
├── setup.py # 自动化设置脚本
├── test_local_embedding.py # 本地embedding测试脚本
├── Dockerfile # Docker镜像配置
├── docker-compose.yml # Docker编排配置
└── README.md # 项目文档
OPENAI_API_KEY: OpenAI API密钥SUPABASE_URL: Supabase项目URLSUPABASE_KEY: Supabase API密钥
OPENAI_MODEL: 使用的聊天模型(默认:gpt-3.5-turbo)EMBEDDING_MODEL: OpenAI嵌入模型(默认:text-embedding-ada-002)OPENAI_BASE_URL: API基础URL(支持其他兼容服务)
USE_LOCAL_EMBEDDING: 是否使用本地embedding模型(默认:true)LOCAL_EMBEDDING_MODEL: 本地模型名称(默认:BAAI/bge-m3)EMBEDDING_DEVICE: 计算设备(auto/cpu/cuda/mps,默认:auto)EMBEDDING_DIMENSION: 向量维度(BGE-m3为1024,OpenAI为1536)
SIMILARITY_THRESHOLD: 相似度阈值(默认:0.7)MAX_SEARCH_RESULTS: 最大搜索结果数(默认:10)
KG_MIN_RELATION_WEIGHT: 最小关系权重(默认:0.5)KG_MAX_ENTITIES_PER_QA: 每个问答对的最大实体数(默认:5)
Web服务器提供RESTful API接口,可以通过HTTP请求使用系统功能:
POST /api/users- 创建用户POST /api/conversations- 创建对话
POST /api/ask- 提问GET /api/conversations/{id}/history- 获取对话历史GET /api/conversations/{id}/suggestions- 获取推荐问题
POST /api/search/knowledge- 搜索知识库POST /api/search/similar- 搜索相似问题POST /api/entities/relations- 查找实体关系
GET /api/system/stats- 获取系统统计GET /api/conversations/{id}/summary- 生成对话摘要GET /api/conversations/{id}/export- 导出对话POST /api/system/build-index- 构建知识索引GET /api/health- 健康检查
WS /ws/{user_id}- 实时问答通信
完整的API文档可以在运行Web服务器后访问 /docs 查看。
create_user(username, email=None)- 创建用户start_conversation(user_id, title=None)- 开始对话get_conversation_history(conversation_id)- 获取对话历史
ask_question(user_id, conversation_id, question, ...)- 提问search_similar_questions(query, user_id=None, limit=5)- 搜索相似问题
search_knowledge(query, category=None, limit=10)- 搜索知识库build_knowledge_index(user_id=None)- 构建知识索引
find_entity_relations(entity_name, max_depth=2)- 查找实体关系get_entity_path(source_entity, target_entity)- 获取实体路径
get_system_statistics()- 获取系统统计generate_conversation_summary(conversation_id)- 生成对话摘要suggest_follow_up_questions(conversation_id, limit=3)- 推荐问题export_conversation(conversation_id, format_type='json')- 导出对话
users- 用户信息conversations- 对话会话qa_pairs- 问答对embeddings- 向量存储knowledge_entities- 知识实体knowledge_relations- 知识关系
- 支持向量相似度搜索(pgvector扩展)
- 自动时间戳更新
- 级联删除保证数据一致性
- 使用ivfflat索引提高向量搜索性能
- 批量向量化减少API调用
- 智能相似度阈值过滤
- 异步并发处理知识提取
- 缓存知识图谱减少数据库查询
- 分批处理大量数据
- 合理的索引设计
- 连接池管理
- 查询优化
-
数据库连接失败
- 检查Supabase URL和密钥
- 确认网络连接
- 检查数据库表是否正确创建
-
OpenAI API错误
- 验证API密钥有效性
- 检查API配额
- 确认模型名称正确
-
向量搜索失败
- 确认pgvector扩展已启用
- 检查向量维度配置
- 验证嵌入模型可用性
-
知识提取问题
- 检查模型响应格式
- 调整置信度阈值
- 查看日志详细信息
启用调试模式:
DEBUG=True
LOG_LEVEL=DEBUG- 支持任何OpenAI兼容的API
- 可配置不同的嵌入模型
- 支持本地模型部署
- 系统设计支持多语言
- 可配置不同语言的嵌入模型
- 多语言知识库构建
使用Docker快速部署:
# 构建镜像
docker build -t qa-system .
# 运行容器
docker run -d \
--name qa-system \
-p 8000:8000 \
--env-file .env \
qa-system或使用Docker Compose:
# 一键启动
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down- 支持负载均衡
- 可集成到现有Web应用
- 支持微服务架构
- 支持容器编排(Kubernetes)
欢迎提交Issue和Pull Request!
MIT License
如有问题,请提交Issue或联系开发者。
注意: 请确保妥善保管API密钥等敏感信息,不要提交到版本控制系统。