生成时间:2026-03-10 审查范围:代码质量、性能、用户体验
问题:项目中13个文件使用了不同版本的密码(sZ26、sZ31、sZ36)
解决方案:
- 已将所有文件统一更新为最新密码
sZ36!mTrBxH - 涉及文件:
- .env
- vita.py
- app.py
- run_vita.py
- start_vita.bat
- 以及其他8个工具脚本
建议:考虑使用环境变量或密钥管理服务,避免硬编码密码
严重程度:高
问题:
- 密码直接写在代码中,存在安全风险
- 如果代码泄露,数据库将完全暴露
建议方案:
# 方案1:使用 .env 文件(已部分实现)
# 确保 .env 文件在 .gitignore 中
from dotenv import load_dotenv
load_dotenv()
DB_PASSWORD = os.getenv("VITA_DB_PASSWORD")
# 方案2:使用 Windows 凭据管理器
import keyring
DB_PASSWORD = keyring.get_password("vita_db", "maxsearch")
# 方案3:使用配置文件加密
from cryptography.fernet import Fernet
# 加密存储敏感信息严重程度:中
问题位置:
vita.py:1421- ticket_ids 直接拼接到 SQL- 多处使用字符串拼接构建 SQL
当前代码:
sql_placeholder = ", ".join([f"'{tid}'" for tid in ticket_ids])
sql = f"SELECT ... WHERE SR.TICKETID IN ({sql_placeholder})"建议修改:
# 使用参数化查询
placeholders = ", ".join([f":id{i}" for i in range(len(ticket_ids))])
params = {f"id{i}": tid for i, tid in enumerate(ticket_ids)}
sql = f"SELECT ... WHERE SR.TICKETID IN ({placeholders})"
df = pd.read_sql(sql, conn, params=params)问题:每次查询都创建新连接,效率低下
建议:
from oracledb import create_pool
# 在应用启动时创建连接池
@st.cache_resource
def get_connection_pool():
return create_pool(
user=DB_USER,
password=DB_PASSWORD,
dsn=DB_DSN,
min=2,
max=10,
increment=1
)
# 使用时
pool = get_connection_pool()
with pool.acquire() as conn:
# 执行查询
pass问题:120KB+ 的 vita.py 文件,索引加载可能较慢
建议:
# 添加加载进度提示
@st.cache_resource(show_spinner="正在加载知识库...")
def initialize_resources():
# 现有代码
pass
# 或使用内存映射加速
index = faiss.read_index(INDEX_FILE, faiss.IO_FLAG_MMAP)建议:
from functools import lru_cache
import hashlib
@lru_cache(maxsize=100)
def cached_query(query_hash, sql):
# 执行查询
pass
# 使用时
query_hash = hashlib.md5(sql.encode()).hexdigest()
result = cached_query(query_hash, sql)问题:多个文件中重复的数据库配置和初始化代码
建议:创建统一的配置模块
# config.py
import os
from dotenv import load_dotenv
load_dotenv()
class Config:
DB_USER = os.getenv("VITA_DB_USER", "maxsearch")
DB_PASSWORD = os.getenv("VITA_DB_PASSWORD")
DB_DSN = os.getenv("VITA_DB_DSN")
ORACLE_CLIENT_PATH = os.getenv("VITA_ORACLE_CLIENT")
LLM_API_URL = os.getenv("VITA_LLM_URL")
LLM_API_KEY = os.getenv("VITA_LLM_KEY")
# ... 其他配置
# 在其他文件中使用
from config import Config问题:部分错误处理不够详细
建议:
# 添加更详细的错误日志
import logging
logger = logging.getLogger('VITA')
try:
# 数据库操作
pass
except oracledb.DatabaseError as e:
logger.error(f"数据库错误: {e}", exc_info=True)
st.error("数据库连接失败,请检查网络或联系管理员")
except requests.Timeout:
logger.warning("API 请求超时")
st.warning("服务响应较慢,请稍后重试")
except Exception as e:
logger.exception("未预期的错误")
st.error(f"系统错误: {str(e)}")问题:vita.py 文件过大(120KB+),难以维护
建议结构:
vita/
├── config.py # 配置管理
├── database.py # 数据库操作
├── llm_client.py # LLM API 调用
├── embedding.py # 向量检索
├── diagnosis.py # 故障诊断逻辑
├── statistics.py # 统计查询
├── responsibility.py # 责任归属
└── app.py # Streamlit 主界面
建议:
# 使用 Streamlit 的进度条
progress_bar = st.progress(0)
status_text = st.empty()
status_text.text("正在连接数据库...")
progress_bar.progress(25)
status_text.text("正在检索知识库...")
progress_bar.progress(50)
status_text.text("正在生成诊断报告...")
progress_bar.progress(75)
status_text.text("完成!")
progress_bar.progress(100)当前:显示技术错误信息 建议:
ERROR_MESSAGES = {
"ORA-12170": "无法连接到数据库,请检查网络连接",
"ORA-01017": "用户名或密码错误",
"timeout": "请求超时,服务器响应较慢,请稍后重试",
"connection_refused": "服务暂时不可用,请联系管理员"
}
def friendly_error(error):
for key, msg in ERROR_MESSAGES.items():
if key in str(error).lower():
return msg
return "系统遇到问题,请稍后重试或联系技术支持"建议:
# 显示实时耗时
import time
with st.spinner("正在处理..."):
start_time = time.time()
# 执行操作
result = process_query()
elapsed = time.time() - start_time
st.success(f"✅ 处理完成(耗时 {elapsed:.2f} 秒)")根据 VITA_RAG_Optimization_Plan.md,建议按以下顺序实施:
- ✅ 激活现有 rerank 功能(代码已存在但未调用)
- 🔄 集成 BM25 稀疏检索
- 🔄 实现 RRF 融合
- 🔄 添加依赖包
预期收益:检索准确率提升 30-40%
- 部署 Qdrant 向量数据库
- 实现元数据过滤
- 构建索引管线
- 支持增量更新
预期收益:查询速度提升 50%+,支持实时更新
- Contextual Embedding
- Corrective RAG
- 答案溯源
预期收益:减少幻觉,提高可信度
建议添加:
import time
from collections import defaultdict
class PerformanceMonitor:
def __init__(self):
self.metrics = defaultdict(list)
def record(self, operation, duration):
self.metrics[operation].append(duration)
def get_stats(self, operation):
times = self.metrics[operation]
if not times:
return None
return {
"count": len(times),
"avg": sum(times) / len(times),
"min": min(times),
"max": max(times)
}
# 使用
monitor = PerformanceMonitor()
start = time.time()
# 执行数据库查询
monitor.record("db_query", time.time() - start)建议:
import json
from datetime import datetime
def log_query(user_query, intent, result_count, elapsed_time):
log_entry = {
"timestamp": datetime.now().isoformat(),
"query": user_query,
"intent": intent,
"result_count": result_count,
"elapsed_time": elapsed_time
}
with open("query_log.jsonl", "a", encoding="utf-8") as f:
f.write(json.dumps(log_entry, ensure_ascii=False) + "\n")建议添加:
# tests/test_database.py
import pytest
from database import execute_query
def test_query_with_valid_params():
result = execute_query("SELECT * FROM SR WHERE TICKETID = :id", {"id": "TEST001"})
assert result is not None
def test_query_with_sql_injection():
# 应该安全处理
result = execute_query("SELECT * FROM SR WHERE TICKETID = :id", {"id": "'; DROP TABLE SR; --"})
assert result is not None # 不应该执行注入# tests/test_diagnosis.py
def test_fault_diagnosis_flow():
query = "ISCS工作站黑屏"
result = diagnose_fault(query, faiss_index, id_map)
assert result is not None
assert "建议" in result当前 start_vita.bat 的问题:
- 硬编码路径
- 缺少错误处理
建议改进:
@echo off
chcp 65001 >nul
REM 检查 Python 是否存在
where python >nul 2>&1
if %ERRORLEVEL% NEQ 0 (
echo 错误:未找到 Python,请先安装 Python
pause
exit /b 1
)
REM 检查虚拟环境
if not exist ".venv\Scripts\activate.bat" (
echo 警告:虚拟环境不存在,正在创建...
python -m venv .venv
)
REM 激活虚拟环境
call .venv\Scripts\activate.bat
REM 检查依赖
pip show streamlit >nul 2>&1
if %ERRORLEVEL% NEQ 0 (
echo 正在安装依赖...
pip install -r requirements.txt
)
REM 启动应用
echo 正在启动 VITA...
streamlit run vita.py --server.port 3000 --server.address 0.0.0.0
pause建议添加:
# health_check.py
import requests
import oracledb
from config import Config
def check_database():
try:
with oracledb.connect(user=Config.DB_USER, password=Config.DB_PASSWORD, dsn=Config.DB_DSN) as conn:
cursor = conn.cursor()
cursor.execute("SELECT 1 FROM DUAL")
return True
except:
return False
def check_llm_api():
try:
response = requests.get(f"{Config.LLM_API_URL}/health", timeout=5)
return response.status_code == 200
except:
return False
if __name__ == "__main__":
print("数据库:", "✅" if check_database() else "❌")
print("LLM API:", "✅" if check_llm_api() else "❌")- ✅ 密码配置统一(已完成)
- 🔄 SQL 注入防护
- 🔄 错误处理增强
- 🔄 密码安全存储
- 数据库连接池
- 查询结果缓存
- RAG Phase 1 实施
- 代码模块化
- 完整的单元测试
- 性能监控系统
- RAG Phase 2-3
- 移动端适配
VITA 项目整体架构合理,已经实现了较为完善的功能。主要优化方向:
- 安全性:密码管理、SQL 注入防护
- 性能:连接池、缓存、索引优化
- 可维护性:代码模块化、统一配置
- 用户体验:友好的错误提示、实时反馈
- RAG 优化:按照已有计划逐步实施
建议优先处理安全性问题,然后逐步实施性能和用户体验优化。