# 特征搜索API服务

## 概述

这是一个FastAPI服务，复用阶段3-7的完整流程，提供搜索和评估功能。

## 安装依赖

```bash
pip install -r requirements.txt
```

## 配置环境变量

```bash
export OPENROUTER_API_KEY='your-api-key'
export API_HOST='0.0.0.0'  # 可选，默认0.0.0.0
export API_PORT='8000'     # 可选，默认8000
```

## 启动服务

```bash
python api/main.py
```

或者使用uvicorn直接启动：

```bash
uvicorn api.search_service:app --host 0.0.0.0 --port 8000
```

## API文档

启动服务后，访问以下地址查看自动生成的API文档：

- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc

## API端点

### POST /what/search

执行搜索和评估

**请求体：**

```json
{
  "original_target": "原始目标名称",
  "persona_features": [
    {
      "persona_feature_name": "人设特征名称1"
    },
    {
      "persona_feature_name": "人设特征名称2"
    },
    {
      "persona_feature_name": "人设特征名称3"
    }
  ],
  "candidate_words": ["候选词1", "候选词2", "候选词3"]
}
```

**响应：**

```json
{
  "original_target": "原始目标名称",
  "search_results": [
    {
      "search_word": "搜索词",
      "comprehensive_score": 0.85,
      "comprehensive_score_detail": {
        "N": 20,
        "M": 5,
        "total_contribution": 4.25,
        "P": 0.2125
      },
      "matched_notes": [
        {
          "note_id": "帖子ID",
          "note_title": "帖子标题",
          "evaluation_score": 0.9,
          "max_similarity": 0.95,
          "contribution": 0.855,
          "note_data": {
            // 完整的搜索结果信息
          }
        }
      ]
    }
  ]
}
```

**说明：**
- 只返回综合得分P > 0的搜索结果
- `matched_notes`包含完整的帖子信息（`note_data`字段）

### GET /health

健康检查端点

**响应：**

```json
{
  "status": "healthy",
  "pipeline_initialized": true
}
```

## 使用示例

### 使用curl

```bash
curl -X POST "http://localhost:8000/what/search" \
  -H "Content-Type: application/json" \
  -d '{
    "original_target": "墨镜",
    "persona_features": [
      {"persona_feature_name": "时尚达人"},
      {"persona_feature_name": "潮流穿搭"},
      {"persona_feature_name": "配饰搭配"}
    ],
    "candidate_words": ["太阳镜", "墨镜", "遮阳", "时尚", "潮流"]
  }'
```

### 使用Python

```python
import requests

url = "http://localhost:8000/search"
data = {
    "original_target": "墨镜",
    "persona_features": [
        {"persona_feature_name": "时尚达人"},
        {"persona_feature_name": "潮流穿搭"},
        {"persona_feature_name": "配饰搭配"}
    ],
    "candidate_words": ["太阳镜", "墨镜", "遮阳", "时尚", "潮流"]
}

response = requests.post(url, json=data)
result = response.json()
print(result)
```

## 注意事项

1. **不修改现有代码**：API服务独立实现，不修改`src/pipeline/feature_search_pipeline.py`中的阶段1-2
2. **本地测试不受影响**：现有的`main.py`和`run_full_pipeline`方法保持不变
3. **临时文件**：服务会在临时目录中创建文件，服务关闭时会自动清理
4. **综合得分P**：只返回综合得分P > 0的搜索结果

## 配置选项

可以通过环境变量配置以下选项：

- `OPENROUTER_API_KEY`: OpenRouter API密钥（必需）
- `API_HOST`: API服务主机地址（默认：0.0.0.0）
- `API_PORT`: API服务端口（默认：8000）
- `SEARCH_MAX_WORKERS`: 搜索并发数（默认：3）
- `EVALUATION_MAX_WORKERS`: 评估并发数（默认：10）
- `EVALUATION_MAX_NOTES_PER_QUERY`: 每个搜索词评估的最大帖子数（默认：20）
- `DEEP_ANALYSIS_MAX_WORKERS`: 深度解构并发数（默认：5）
- `DEEP_ANALYSIS_MIN_SCORE`: 深度解构最低分数阈值（默认：0.8）
- `SIMILARITY_WEIGHT_EMBEDDING`: 相似度分析向量模型权重（默认：0.5）
- `SIMILARITY_WEIGHT_SEMANTIC`: 相似度分析LLM模型权重（默认：0.5）
- `SIMILARITY_MAX_WORKERS`: 相似度分析并发数（默认：5）
- `MAX_CANDIDATES`: 参与组合的最大候选词数（默认：20）
- `MAX_COMBO_LENGTH`: 最大组合词数（默认：3）
- `QUERY_GENERATION_MAX_WORKERS`: Query生成并发数（默认：8）

## 错误处理

API会返回适当的HTTP状态码：

- `200`: 成功
- `400`: 请求参数错误
- `500`: 内部服务器错误
- `503`: 服务不可用（Pipeline未初始化）

## 日志

服务会输出详细的日志信息，包括：
- 请求处理过程
- 各阶段执行状态
- 错误信息

日志级别可以通过Python的logging模块配置。

