一个基于检索增强生成(RAG)技术的Java后端开发面试知识库问答系统。
- 📚 智能文档检索: 基于向量相似度和BM25的混合检索
- 🤖 智能问答: 使用Moonshot AI大语言模型生成专业回答
- 🔄 查询优化: 自动分析和重写模糊查询
- 📂 分类检索: 支持按技术分类进行精确搜索
- 💭 流式输出: 支持实时流式回答生成
- 🎯 面试导向: 专门针对Java后端开发面试场景优化
RAG系统
├── 数据准备模块 (data_preparation.py)
│ ├── Markdown文档加载
│ ├── 结构化分块处理
│ └── 元数据增强
├── 索引构建模块 (index_construction.py)
│ ├── BAAI/bge-small-zh-v1.5 嵌入
│ ├── FAISS向量索引
│ └── 索引持久化
├── 检索优化模块 (retrieval_optimization.py)
│ ├── 向量检索
│ ├── BM25关键词检索
│ └── RRF重排融合
├── 生成集成模块 (generation_integration.py)
│ ├── 查询重写优化
│ ├── 上下文构建
│ └── Moonshot AI回答生成
└── 主系统 (main.py)
├── 交互式CLI界面
├── 分类检索功能
└── 系统统计信息
- Python 3.8+
- Moonshot API密钥
- 8GB+ 内存推荐
cd code
pip install -r requirements.txt
Windows:
set MOONSHOT_API_KEY=your_moonshot_api_key_here
Linux/Mac:
export MOONSHOT_API_KEY='your_moonshot_api_key_here'
cd rag_modules
python run.py
启动后直接输入问题即可:
💭 请输入您的问题: Java中HashMap和ConcurrentHashMap的区别是什么?
🤔 正在思考您的问题: Java中HashMap和ConcurrentHashMap的区别是什么?
💡 回答:
HashMap和ConcurrentHashMap的主要区别在于线程安全性...
help
- 显示帮助信息stats
- 显示系统统计信息category <分类> <问题>
- 按分类搜索quit/exit
- 退出系统
💭 请输入您的问题: category Java基础 什么是面向对象编程?
🔍 在 'Java基础' 分类中搜索: 什么是面向对象编程?
💡 回答:
面向对象编程(OOP)是一种编程范式...
在 config.py
中可以自定义以下配置:
@dataclass
class RAGConfig:
# 路径配置
data_path: str = "../knowledge_base/docs"
index_save_path: str = "./vector_index"
# 模型配置
embedding_model: str = "BAAI/bge-small-zh-v1.5"
llm_model: str = "kimi-k2-0711-preview"
# 检索配置
top_k: int = 5
chunk_size: int = 1000
chunk_overlap: int = 200
# 生成配置
temperature: float = 0.1
max_tokens: int = 2048
# 系统配置
log_level: str = "INFO"
enable_query_rewrite: bool = True
知识库位于 knowledge_base/docs/
目录,包含以下技术分类:
java/
- Java核心知识database/
- 数据库相关distributed-system/
- 分布式系统high-performance/
- 高性能优化tools/
- 开发工具- ... 更多分类
运行测试脚本验证系统功能:
python test_system.py
也可以通过编程方式使用:
from main import ProgrammerHelperRAGSystem
from config import RAGConfig
# 创建系统实例
system = ProgrammerHelperRAGSystem()
# 初始化
system.initialize_system()
# 查询
answer = system.query("什么是Spring Boot?")
print(answer)
# 流式查询
for chunk in system.query_stream("JVM垃圾回收机制"):
print(chunk, end='')
# 分类查询
answer = system.search_by_category("MySQL索引原理", "数据库")
print(answer)
- 索引缓存: 首次构建后会保存向量索引,后续启动直接加载
- 混合检索: 结合语义检索和关键词检索提高准确性
- 查询重写: 自动优化模糊查询提升检索效果
- 分块策略: 基于Markdown结构的智能分块
欢迎提交Issue和Pull Request来完善这个项目!
MIT License
anthonyLee06@foxmail.com 24281009@bjtu.edu.cn
祝您面试顺利!🎉