File size: 6,720 Bytes
c844813
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
"""
Kaggle 快速启动脚本 - 避免重复下载大模型
使用优化的小模型配置,大幅减少启动时间

使用方法:
在 Kaggle Notebook 第一个单元格运行:
    exec(open('/kaggle/working/adaptive_RAG/KAGGLE_QUICK_START.py').read())
"""

import os
import subprocess
import sys
import time

print("🚀 Kaggle 快速启动(优化版)")
print("="*70)

# ==================== 配置区域 ====================
REPO_URL = "https://github.com/LannyCodes/adaptive_RAG.git"
PROJECT_DIR = "/kaggle/working/adaptive_RAG"

# 模型选择(根据需求修改)
# "phi"       - 1.6GB, 2-3分钟下载,质量好 ⭐⭐⭐⭐ (推荐)
# "tinyllama" - 600MB, 1分钟下载,质量中等 ⭐⭐⭐
# "qwen:0.5b" - 350MB, 30秒下载,质量较低 ⭐⭐
# "mistral"   - 4GB, 5-10分钟下载,质量最好 ⭐⭐⭐⭐⭐ (慢)

PREFERRED_MODEL = "phi"  # 👈 修改这里选择模型

print(f"\n📌 配置:")
print(f"   • 仓库: {REPO_URL}")
print(f"   • 模型: {PREFERRED_MODEL}")
print()

# ==================== 步骤 1: 克隆项目 ====================
print("📦 步骤 1/6: 克隆项目...")

os.chdir('/kaggle/working')

if os.path.exists(PROJECT_DIR):
    print("   ✅ 项目已存在")
else:
    result = subprocess.run(['git', 'clone', REPO_URL], capture_output=True, text=True)
    if result.returncode == 0:
        print("   ✅ 项目克隆成功")
    else:
        print(f"   ❌ 克隆失败: {result.stderr}")
        sys.exit(1)

os.chdir(PROJECT_DIR)

# ==================== 步骤 2: 修改配置使用小模型 ====================
print("\n⚙️ 步骤 2/6: 优化模型配置...")

config_file = 'config.py'

with open(config_file, 'r', encoding='utf-8') as f:
    content = f.read()

# 替换模型配置
if 'LOCAL_LLM = "mistral"' in content:
    content = content.replace(
        'LOCAL_LLM = "mistral"',
        f'LOCAL_LLM = "{PREFERRED_MODEL}"  # Kaggle优化: 使用更小的模型'
    )
    
    with open(config_file, 'w', encoding='utf-8') as f:
        f.write(content)
    
    print(f"   ✅ 已切换到 {PREFERRED_MODEL} 模型")
else:
    print(f"   ℹ️ 配置已是优化模式")

# ==================== 步骤 3: 检查并安装 Ollama ====================
print("\n🔧 步骤 3/6: 检查 Ollama...")

ollama_check = subprocess.run(['which', 'ollama'], capture_output=True)

if ollama_check.returncode == 0:
    print("   ✅ Ollama 已安装")
else:
    print("   📥 安装 Ollama...")
    subprocess.run('curl -fsSL https://ollama.com/install.sh | sh', shell=True)
    time.sleep(3)
    print("   ✅ Ollama 安装完成")

# 验证安装
version_result = subprocess.run(['ollama', '--version'], capture_output=True, text=True)
if version_result.returncode == 0:
    print(f"   📌 {version_result.stdout.strip()}")

# ==================== 步骤 4: 启动 Ollama 服务 ====================
print("\n🚀 步骤 4/6: 启动 Ollama 服务...")

# 检查是否已运行
ps_check = subprocess.run(['pgrep', '-f', 'ollama serve'], capture_output=True)

if ps_check.returncode == 0:
    print("   ✅ Ollama 服务已运行")
else:
    print("   🔄 启动服务...")
    subprocess.Popen(['ollama', 'serve'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    time.sleep(15)
    
    # 验证
    import requests
    try:
        response = requests.get('http://localhost:11434/api/tags', timeout=10)
        if response.status_code == 200:
            print("   ✅ 服务运行正常")
    except:
        print("   ⚠️ 服务验证失败,但可能仍在启动中...")

# ==================== 步骤 5: 下载优化的模型 ====================
print(f"\n📦 步骤 5/6: 下载 {PREFERRED_MODEL} 模型...")

# 检查模型是否已存在
list_result = subprocess.run(['ollama', 'list'], capture_output=True, text=True)

if PREFERRED_MODEL in list_result.stdout:
    print(f"   ✅ {PREFERRED_MODEL} 模型已存在")
else:
    # 显示预计时间
    time_estimates = {
        "qwen:0.5b": "约30秒",
        "tinyllama": "约1分钟",
        "phi": "约2-3分钟",
        "mistral": "约5-10分钟"
    }
    
    estimated_time = time_estimates.get(PREFERRED_MODEL, "未知")
    
    print(f"   📥 开始下载(预计时间: {estimated_time})...")
    print(f"   ⏳ 请稍候...")
    
    start_time = time.time()
    
    pull_result = subprocess.run(
        ['ollama', 'pull', PREFERRED_MODEL],
        capture_output=True,
        text=True
    )
    
    elapsed = time.time() - start_time
    
    if pull_result.returncode == 0:
        print(f"   ✅ 模型下载完成(耗时: {int(elapsed)}秒)")
    else:
        print(f"   ⚠️ 下载警告: {pull_result.stderr[:200]}")

# ==================== 步骤 6: 安装 Python 依赖 ====================
print("\n📦 步骤 6/6: 安装 Python 依赖...")

subprocess.run([sys.executable, '-m', 'pip', 'install', '-r', 'requirements_graphrag.txt', '-q'])
subprocess.run([sys.executable, '-m', 'pip', 'install', '-U', 
                'langchain', 'langchain-core', 'langchain-community', 
                'langchain-text-splitters', '-q'])

print("   ✅ 依赖安装完成")

# ==================== 设置 Python 路径 ====================
if PROJECT_DIR not in sys.path:
    sys.path.insert(0, PROJECT_DIR)

# ==================== 完成 ====================
print("\n" + "="*70)
print("✅ 环境准备完成!")
print("="*70)

print(f"\n📊 配置摘要:")
print(f"   • 工作目录: {os.getcwd()}")
print(f"   • 使用模型: {PREFERRED_MODEL}")
print(f"   • Python路径: 已添加")

# 显示模型对比
print(f"\n📌 模型选择说明:")
print("   • phi (当前) - 平衡速度和质量,推荐日常使用")
print("   • tinyllama - 最快下载,适合快速测试")
print("   • mistral - 质量最高,但下载慢(不推荐Kaggle)")

print(f"\n💡 下一步:")
print("   1. 开始 GraphRAG 索引:")
print("      from document_processor import DocumentProcessor")
print("      from graph_indexer import GraphRAGIndexer")
print("      ")
print("      doc_processor = DocumentProcessor()")
print("      vectorstore, retriever, doc_splits = doc_processor.setup_knowledge_base(enable_graphrag=True)")
print("      ")
print("      indexer = GraphRAGIndexer()")
print("      graph = indexer.index_documents(doc_splits, batch_size=3)")
print()
print("   2. 如需切换模型,修改脚本顶部的 PREFERRED_MODEL 变量")

print("\n⚠️ 提示:")
print(f"   • 当前使用 {PREFERRED_MODEL} 模型,比 Mistral 快 {2 if PREFERRED_MODEL == 'phi' else 5}x")
print("   • 会话结束后仍需重新下载(但速度已大幅提升)")
print("   • 如需最佳质量,本地开发时可用 Mistral")