-
Notifications
You must be signed in to change notification settings - Fork 62
Expand file tree
/
Copy pathrun_backend.py
More file actions
executable file
·138 lines (109 loc) · 4.19 KB
/
run_backend.py
File metadata and controls
executable file
·138 lines (109 loc) · 4.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/env python3
"""
启动后端服务的脚本
自动构建本地知识库并启动服务
"""
import sys
import os
# 添加项目根目录到 Python 路径
project_root = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, project_root)
import uvicorn
import os
import asyncio
from pathlib import Path
# 获取项目根目录和backend目录
project_root = os.path.dirname(os.path.abspath(__file__))
backend_dir = os.path.join(project_root, "backend")
# 添加项目根目录到Python路径
sys.path.insert(0, project_root)
from config import Config
def setup_knowledge_base():
"""设置本地知识库"""
print("📚 正在初始化本地知识库...")
try:
# 导入RAG相关模块
from backend.modules.rag.core.knowledge_base import KnowledgeBaseManager, PsychologyKnowledgeLoader
# 初始化知识库管理器
kb_manager = KnowledgeBaseManager()
# 检查知识库是否已存在
stats = kb_manager.get_stats()
if stats.get('status') == '就绪' and stats.get('document_count', 0) > 0:
print("✓ 知识库已存在,跳过初始化")
return True
print("→ 加载内置示例知识...")
loader = PsychologyKnowledgeLoader(kb_manager)
loader.load_sample_knowledge()
# 尝试从知识库结构加载
print("→ 尝试从知识库结构加载...")
try:
loader.load_from_knowledge_base_structure()
print("✓ 知识库结构加载成功")
except Exception as e:
print(f"⚠️ 知识库结构加载失败: {e}")
print("继续使用内置示例知识")
# 验证知识库状态
final_stats = kb_manager.get_stats()
print(f"✓ 知识库初始化完成")
print(f" 文档数量: {final_stats.get('document_count', 0)}")
print(f" 存储位置: {final_stats.get('persist_directory')}")
return True
except Exception as e:
print(f"❌ 知识库初始化失败: {e}")
print("⚠️ 服务将启动,但RAG功能可能不可用")
return False
def check_dependencies():
"""检查必要的依赖"""
print("🔍 检查依赖...")
missing_deps = []
try:
import chromadb
except ImportError:
missing_deps.append("chromadb")
try:
import langchain
except ImportError:
missing_deps.append("langchain")
try:
import openai
except ImportError:
missing_deps.append("openai")
if missing_deps:
print(f"⚠️ 缺少依赖: {', '.join(missing_deps)}")
print("请运行: pip install -r requirements.txt")
return False
print("✓ 依赖检查通过")
return True
if __name__ == "__main__":
print("🚀 启动情感聊天机器人后端服务...")
print(f"📍 服务地址: http://{Config.HOST}:{Config.PORT}")
print("🔗 API文档: http://localhost:8000/docs")
print(f"📂 工作目录: {project_root}")
# 设置项目根目录的环境变量,供后续代码使用
os.environ['PROJECT_ROOT'] = project_root
# 禁用LangSmith追踪以避免403错误
os.environ['LANGCHAIN_TRACING_V2'] = 'false'
os.environ['LANGCHAIN_ENDPOINT'] = ''
# 检查依赖
if not check_dependencies():
print("⚠️ 依赖检查失败,但继续启动服务")
# 初始化知识库
kb_success = setup_knowledge_base()
if kb_success:
print("✅ 本地知识库构建完成")
else:
print("⚠️ 本地知识库构建失败,RAG功能可能不可用")
print("\n" + "="*60)
print("🎉 服务启动中...")
print("="*60)
# 保持在项目根目录,使用backend.app应用工厂
print(f"✓ 从项目根目录启动,使用backend.app应用工厂")
# 为了彻底解决 watchfiles 频繁检测问题,完全禁用热重载
print("🚀 启动模式:禁用热重载以避免文件监视问题")
uvicorn.run(
"backend.app:app",
host=Config.HOST,
port=Config.PORT,
reload=False, # 完全禁用热重载
log_level="info"
)