# Ollama 集成使用指南

本指南介绍如何在项目中使用 Ollama 作为 LLM 和/或 Embedding 提供商。

## 概述

项目现在支持以下配置组合：

1. **全API模式**：API LLM + API Embedding
2. **全Ollama模式**：Ollama LLM + Ollama Embedding  
3. **混合模式1**：API LLM + Ollama Embedding
4. **混合模式2**：Ollama LLM + API Embedding

## 前置条件

### 安装和启动 Ollama

1. 从 [Ollama官网](https://ollama.ai) 下载并安装 Ollama
2. 启动 Ollama 服务：
   ```bash
   ollama serve
   ```
3. 拉取所需的模型：
   ```bash
   # LLM模型（选择其中一个）
   ollama pull qwen2.5:7b
   ollama pull deepseek-r1:7b
   ollama pull llama3:8b
   
   # Embedding模型
   ollama pull nomic-embed-text
   ```

## 配置说明

### 1. 基本配置参数

在 `app_config.py` 中设置以下参数：

```python
# 模型提供商类型
LLM_MODEL_TYPE = "ollama"        # "api" 或 "ollama"
EMBEDDING_MODEL_TYPE = "ollama"  # "api" 或 "ollama"

# API模式下的模型选择（Ollama模式下不使用）
API_LLM_MODEL = "qwen"           # "qwen" 或 "deepseek"

# 向量数据库类型
VECTOR_DB_TYPE = "pgvector"      # "chromadb" 或 "pgvector"
```

### 2. Ollama LLM 配置

```python
OLLAMA_LLM_CONFIG = {
    "base_url": "http://localhost:11434",  # Ollama服务地址
    "model": "qwen2.5:7b",                 # 模型名称
    "allow_llm_to_see_data": True,
    "temperature": 0.7,
    "n_results": 6,
    "language": "Chinese",
    "timeout": 60                          # 超时时间（秒）
}
```

### 3. Ollama Embedding 配置

```python
OLLAMA_EMBEDDING_CONFIG = {
    "model_name": "nomic-embed-text",      # Embedding模型名称
    "base_url": "http://localhost:11434",  # Ollama服务地址
    "embedding_dimension": 768             # 向量维度
}
```

## 使用示例

### 示例1：全Ollama模式

```python
# app_config.py
LLM_MODEL_TYPE = "ollama"
EMBEDDING_MODEL_TYPE = "ollama"
VECTOR_DB_TYPE = "chromadb"

OLLAMA_LLM_CONFIG = {
    "base_url": "http://localhost:11434",
    "model": "qwen2.5:7b",
    "temperature": 0.7,
    "timeout": 60
}

OLLAMA_EMBEDDING_CONFIG = {
    "model_name": "nomic-embed-text",
    "base_url": "http://localhost:11434",
    "embedding_dimension": 768
}
```

### 示例2：混合模式（API LLM + Ollama Embedding）

```python
# app_config.py
LLM_MODEL_TYPE = "api"
EMBEDDING_MODEL_TYPE = "ollama"
API_LLM_MODEL = "qwen"
VECTOR_DB_TYPE = "pgvector"

# 使用现有的 API_QWEN_CONFIG
# 使用 OLLAMA_EMBEDDING_CONFIG
```

### 示例3：混合模式（Ollama LLM + API Embedding）

```python
# app_config.py
LLM_MODEL_TYPE = "ollama"
EMBEDDING_MODEL_TYPE = "api"
VECTOR_DB_TYPE = "chromadb"

# 使用 OLLAMA_LLM_CONFIG
# 使用现有的 API_EMBEDDING_CONFIG
```

## 代码使用

### 1. 使用工具函数检查配置

```python
from common.utils import (
    is_using_ollama_llm,
    is_using_ollama_embedding,
    get_current_model_info,
    print_current_config
)

# 检查当前配置
print_current_config()

# 检查是否使用Ollama
if is_using_ollama_llm():
    print("当前使用Ollama LLM")

if is_using_ollama_embedding():
    print("当前使用Ollama Embedding")

# 获取模型信息
model_info = get_current_model_info()
print(model_info)
```

### 2. 创建Vanna实例

```python
from core.vanna_llm_factory import create_vanna_instance

# 根据配置自动创建合适的实例
vn = create_vanna_instance()

# 使用实例
sql = vn.generate_sql("查询所有用户的信息")
print(sql)
```

### 3. 直接使用Ollama组件

```python
# 直接使用Ollama LLM
from customollama.ollama_chat import OllamaChat

config = {
    "base_url": "http://localhost:11434",
    "model": "qwen2.5:7b",
    "temperature": 0.7
}

ollama_llm = OllamaChat(config=config)
response = ollama_llm.chat_with_llm("你好")

# 直接使用Ollama Embedding
from customollama.ollama_embedding import OllamaEmbeddingFunction

embedding_func = OllamaEmbeddingFunction(
    model_name="nomic-embed-text",
    base_url="http://localhost:11434",
    embedding_dimension=768
)

embeddings = embedding_func(["文本1", "文本2"])
```

## 测试和验证

### 1. 运行配置测试

```bash
python test_config_utils.py
```

### 2. 运行Ollama集成测试

```bash
python test_ollama_integration.py
```

### 3. 测试连接

```python
# 测试Ollama LLM连接
from customollama.ollama_chat import OllamaChat

config = {"base_url": "http://localhost:11434", "model": "qwen2.5:7b"}
ollama_llm = OllamaChat(config=config)
result = ollama_llm.test_connection()
print(result)

# 测试Ollama Embedding连接
from customollama.ollama_embedding import OllamaEmbeddingFunction

embedding_func = OllamaEmbeddingFunction(
    model_name="nomic-embed-text",
    base_url="http://localhost:11434",
    embedding_dimension=768
)
result = embedding_func.test_connection()
print(result)
```

## 常见问题

### 1. 连接失败

**问题**：`Ollama API调用失败: Connection refused`

**解决方案**：
- 确保Ollama服务正在运行：`ollama serve`
- 检查服务地址是否正确（默认：`http://localhost:11434`）
- 确保防火墙没有阻止连接

### 2. 模型不存在

**问题**：`model 'qwen2.5:7b' not found`

**解决方案**：
- 拉取所需模型：`ollama pull qwen2.5:7b`
- 检查可用模型：`ollama list`

### 3. 向量维度不匹配

**问题**：`向量维度不匹配: 期望 768, 实际 384`

**解决方案**：
- 更新配置中的 `embedding_dimension` 为实际维度
- 或者选择匹配的embedding模型

### 4. 超时错误

**问题**：`Ollama API调用超时`

**解决方案**：
- 增加 `timeout` 配置值
- 检查模型是否已完全加载
- 考虑使用更小的模型

## 性能优化建议

### 1. 模型选择

- **小型模型**：`qwen2.5:7b`, `llama3:8b` - 适合资源有限的环境
- **大型模型**：`qwen2.5:14b`, `deepseek-r1:32b` - 适合性能要求高的场景

### 2. 配置优化

```python
# 针对性能优化的配置
OLLAMA_LLM_CONFIG = {
    "base_url": "http://localhost:11434",
    "model": "qwen2.5:7b",
    "temperature": 0.1,  # 降低随机性，提高一致性
    "timeout": 120,      # 增加超时时间
}
```

### 3. 缓存策略

- 启用向量数据库缓存
- 使用会话感知缓存
- 合理设置缓存过期时间

## 部署注意事项

### 1. 生产环境

- 确保Ollama服务的稳定性和可用性
- 配置适当的资源限制（CPU、内存、GPU）
- 设置监控和日志记录

### 2. 安全考虑

- 限制Ollama服务的网络访问
- 使用防火墙保护服务端口
- 定期更新Ollama和模型

### 3. 备份和恢复

- 备份模型文件和配置
- 准备API服务作为备用方案
- 测试故障转移流程

## 架构说明

### 统一组合类管理

项目采用了统一的组合类管理方式，所有LLM与向量数据库的组合都在 `common/vanna_combinations.py` 中定义：

```python
# 可用的组合类
from common.vanna_combinations import (
    Vanna_Qwen_ChromaDB,
    Vanna_DeepSeek_ChromaDB,
    Vanna_Ollama_ChromaDB,
    Vanna_Qwen_PGVector,
    Vanna_DeepSeek_PGVector,
    Vanna_Ollama_PGVector,
    get_vanna_class,
    print_available_combinations
)

# 动态获取组合类
cls = get_vanna_class("ollama", "chromadb")  # 返回 Vanna_Ollama_ChromaDB

# 查看所有可用组合
print_available_combinations()
```

### 工厂模式

`vanna_llm_factory.py` 使用统一的组合类文件，自动根据配置选择合适的组合：

```python
from vanna_llm_factory import create_vanna_instance

# 根据 app_config.py 中的配置自动创建实例
vn = create_vanna_instance()
```

## 测试和验证

### 1. 运行配置测试

```bash
python test_config_utils.py
```

### 2. 运行Ollama集成测试

```bash
python test_ollama_integration.py
```

### 3. 运行组合类测试

```bash
python test_vanna_combinations.py
```

## 更多资源

- [Ollama官方文档](https://ollama.ai/docs)
- [支持的模型列表](https://ollama.ai/library)
- [API参考文档](https://github.com/ollama/ollama/blob/main/docs/api.md) 