Skip to content

Latest commit

 

History

History
487 lines (381 loc) · 11 KB

File metadata and controls

487 lines (381 loc) · 11 KB

VITA 项目优化建议报告

生成时间:2026-03-10 审查范围:代码质量、性能、用户体验


一、已完成的优化

✅ 1. 密码配置统一

问题:项目中13个文件使用了不同版本的密码(sZ26、sZ31、sZ36)

解决方案

  • 已将所有文件统一更新为最新密码 sZ36!mTrBxH
  • 涉及文件:
    • .env
    • vita.py
    • app.py
    • run_vita.py
    • start_vita.bat
    • 以及其他8个工具脚本

建议:考虑使用环境变量或密钥管理服务,避免硬编码密码


二、紧急优化建议

🔴 1. 安全性问题

1.1 密码硬编码

严重程度:高

问题

  • 密码直接写在代码中,存在安全风险
  • 如果代码泄露,数据库将完全暴露

建议方案

# 方案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
# 加密存储敏感信息

1.2 SQL 注入风险

严重程度:中

问题位置

  • 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)

🟡 2. 性能优化

2.1 数据库连接池

问题:每次查询都创建新连接,效率低下

建议

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

2.2 FAISS 索引加载优化

问题:120KB+ 的 vita.py 文件,索引加载可能较慢

建议

# 添加加载进度提示
@st.cache_resource(show_spinner="正在加载知识库...")
def initialize_resources():
    # 现有代码
    pass

# 或使用内存映射加速
index = faiss.read_index(INDEX_FILE, faiss.IO_FLAG_MMAP)

2.3 查询结果缓存

建议

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)

🟢 3. 代码质量改进

3.1 重复代码消除

问题:多个文件中重复的数据库配置和初始化代码

建议:创建统一的配置模块

# 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

3.2 错误处理增强

问题:部分错误处理不够详细

建议

# 添加更详细的错误日志
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)}")

3.3 代码模块化

问题:vita.py 文件过大(120KB+),难以维护

建议结构

vita/
├── config.py           # 配置管理
├── database.py         # 数据库操作
├── llm_client.py       # LLM API 调用
├── embedding.py        # 向量检索
├── diagnosis.py        # 故障诊断逻辑
├── statistics.py       # 统计查询
├── responsibility.py   # 责任归属
└── app.py             # Streamlit 主界面

🔵 4. 用户体验优化

4.1 加载状态优化

建议

# 使用 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)

4.2 错误提示友好化

当前:显示技术错误信息 建议

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 "系统遇到问题,请稍后重试或联系技术支持"

4.3 响应速度视觉反馈

建议

# 显示实时耗时
import time

with st.spinner("正在处理..."):
    start_time = time.time()
    # 执行操作
    result = process_query()
    elapsed = time.time() - start_time

st.success(f"✅ 处理完成(耗时 {elapsed:.2f} 秒)")

三、RAG 优化实施计划

根据 VITA_RAG_Optimization_Plan.md,建议按以下顺序实施:

Phase 1:快速优化(1-2周)

  1. ✅ 激活现有 rerank 功能(代码已存在但未调用)
  2. 🔄 集成 BM25 稀疏检索
  3. 🔄 实现 RRF 融合
  4. 🔄 添加依赖包

预期收益:检索准确率提升 30-40%

Phase 2:架构升级(2-3周)

  1. 部署 Qdrant 向量数据库
  2. 实现元数据过滤
  3. 构建索引管线
  4. 支持增量更新

预期收益:查询速度提升 50%+,支持实时更新

Phase 3:检索增强(2-3周)

  1. Contextual Embedding
  2. Corrective RAG
  3. 答案溯源

预期收益:减少幻觉,提高可信度


四、监控和日志

4.1 性能监控

建议添加

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)

4.2 查询日志

建议

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")

五、测试建议

5.1 单元测试

建议添加

# 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  # 不应该执行注入

5.2 集成测试

# 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

六、部署优化

6.1 启动脚本优化

当前 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

6.2 健康检查

建议添加

# 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 "❌")

七、优先级排序

🔴 高优先级(立即处理)

  1. ✅ 密码配置统一(已完成)
  2. 🔄 SQL 注入防护
  3. 🔄 错误处理增强
  4. 🔄 密码安全存储

🟡 中优先级(1-2周内)

  1. 数据库连接池
  2. 查询结果缓存
  3. RAG Phase 1 实施
  4. 代码模块化

🟢 低优先级(长期优化)

  1. 完整的单元测试
  2. 性能监控系统
  3. RAG Phase 2-3
  4. 移动端适配

八、总结

VITA 项目整体架构合理,已经实现了较为完善的功能。主要优化方向:

  1. 安全性:密码管理、SQL 注入防护
  2. 性能:连接池、缓存、索引优化
  3. 可维护性:代码模块化、统一配置
  4. 用户体验:友好的错误提示、实时反馈
  5. RAG 优化:按照已有计划逐步实施

建议优先处理安全性问题,然后逐步实施性能和用户体验优化。