adaptive_rag / KAGGLE_FIX_OLLAMA_CONNECTION.py
lanny xu
delete urls
c848868
raw
history blame
6.57 kB
#!/usr/bin/env python3
"""
Kaggle Ollama 连接问题诊断和修复脚本
解决 GraphRAG 异步处理时的连接错误
"""
import subprocess
import time
import requests
import os
def check_ollama_service():
"""检查 Ollama 服务状态"""
print("="*70)
print("🔍 Ollama 服务诊断")
print("="*70)
# 1. 检查进程
print("\n1️⃣ 检查 Ollama 进程...")
ps_check = subprocess.run(['pgrep', '-f', 'ollama serve'], capture_output=True)
if ps_check.returncode == 0:
print(" ✅ Ollama 进程正在运行")
pids = ps_check.stdout.decode().strip().split('\n')
print(f" 📊 进程 PID: {', '.join(pids)}")
else:
print(" ❌ Ollama 进程未运行")
return False
# 2. 检查端口
print("\n2️⃣ 检查端口 11434...")
port_check = subprocess.run(
['netstat', '-tuln'],
capture_output=True,
text=True
)
if '11434' in port_check.stdout:
print(" ✅ 端口 11434 已监听")
else:
print(" ❌ 端口 11434 未监听")
return False
# 3. 测试 API 连接
print("\n3️⃣ 测试 API 连接...")
try:
response = requests.get('http://localhost:11434/api/tags', timeout=5)
if response.status_code == 200:
print(" ✅ API 连接正常")
models = response.json().get('models', [])
print(f" 📦 可用模型: {len(models)}")
for model in models:
print(f" • {model.get('name', 'unknown')}")
return True
else:
print(f" ❌ API 返回错误: {response.status_code}")
return False
except Exception as e:
print(f" ❌ API 连接失败: {e}")
return False
def start_ollama_service():
"""启动 Ollama 服务"""
print("\n"+"="*70)
print("🚀 启动 Ollama 服务")
print("="*70)
# 先杀死可能存在的僵尸进程
print("\n1️⃣ 清理旧进程...")
subprocess.run(['pkill', '-9', 'ollama'], capture_output=True)
time.sleep(2)
# 启动服务
print("\n2️⃣ 启动新服务...")
process = subprocess.Popen(
['ollama', 'serve'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=os.environ.copy()
)
print(f" ✅ 服务进程已启动 (PID: {process.pid})")
# 等待服务就绪
print("\n3️⃣ 等待服务就绪...")
max_wait = 30
for i in range(max_wait):
try:
response = requests.get('http://localhost:11434/api/tags', timeout=2)
if response.status_code == 200:
print(f" ✅ 服务就绪!(耗时 {i+1} 秒)")
return True
except:
pass
if i < max_wait - 1:
print(f" ⏳ 等待中... ({i+1}/{max_wait})", end='\r')
time.sleep(1)
print(f"\n ⚠️ 服务启动超时,但可能仍在初始化中")
return False
def test_generation():
"""测试生成功能"""
print("\n"+"="*70)
print("🧪 测试文本生成")
print("="*70)
print("\n ℹ️ 首次调用会加载模型到内存,需要 30-60 秒...")
print(" ⏳ 请耐心等待...\n")
try:
response = requests.post(
'http://localhost:11434/api/generate',
json={
"model": "mistral",
"prompt": "Say 'Hello' in one word",
"stream": False
},
timeout=120 # 增加到 120 秒,首次加载模型需要时间
)
if response.status_code == 200:
result = response.json()
print(f" ✅ 生成成功")
print(f" 📝 响应: {result.get('response', '')[:100]}")
return True
else:
print(f" ❌ 生成失败: {response.status_code}")
return False
except requests.exceptions.Timeout:
print(f" ⚠️ 生成超时(但这可能是模型加载中)")
print(f" 💡 建议:再等待 30 秒后重试")
return False
except Exception as e:
print(f" ❌ 生成错误: {e}")
return False
def main():
"""主函数"""
print("\n" + "="*70)
print("🔧 Kaggle Ollama 连接问题修复工具")
print("="*70)
print("\n解决问题: Cannot connect to host localhost:11434")
print("场景: GraphRAG 异步批处理时")
# 检查服务
is_running = check_ollama_service()
if not is_running:
print("\n⚠️ Ollama 服务未正常运行,正在修复...")
start_ollama_service()
# 再次检查
print("\n"+"="*70)
print("🔍 验证修复结果")
print("="*70)
is_running = check_ollama_service()
# 测试生成
if is_running:
test_generation()
# 输出建议
print("\n"+"="*70)
print("💡 使用建议")
print("="*70)
if is_running:
if test_generation():
print("""
✅ Ollama 服务完全就绪!现在可以运行 GraphRAG 了
📝 在 Kaggle Notebook 中运行:
from document_processor import DocumentProcessor
from graph_indexer import GraphRAGIndexer
# 初始化
processor = DocumentProcessor()
vectorstore, retriever, doc_splits = processor.setup_knowledge_base(
enable_graphrag=True
)
# GraphRAG 索引(异步处理)
indexer = GraphRAGIndexer(
enable_async=True, # 启用异步
async_batch_size=8 # 并发处理 8 个文档
)
graph = indexer.index_documents(doc_splits)
""")
else:
print("""
⚠️ Ollama 服务运行中,但模型可能还在加载
💡 解决方案:
1. 等待 30-60 秒让模型完全加载
2. 再次运行此脚本验证
3. 或者直接运行一次简单测试:
!curl http://localhost:11434/api/generate -d '{
"model": "mistral",
"prompt": "Hello",
"stream": false
}'
4. 如果上述测试成功,就可以运行 GraphRAG 了
""")
else:
print("""
❌ Ollama 服务仍然异常
🔧 手动修复步骤:
1. 在 Kaggle Notebook 新单元格运行:
!pkill -9 ollama
!ollama serve &
2. 等待 15 秒后,运行:
!curl http://localhost:11434/api/tags
3. 如果成功,重新运行此脚本验证
4. 如果失败,检查 Ollama 是否正确安装:
!which ollama
!ollama --version
""")
print("="*70)
if __name__ == "__main__":
main()