# text_embedding 使用说明

## 这是什么？

`text_embedding.py` 是一个**文本语义分析工具**，做两件事：

1. **文本向量化** - 把文字变成数字向量
2. **相似度计算** - 判断两段文字有多相似

## 为什么需要它？

传统的文字比较只能看字面：
- "深度学习" vs "神经网络" → 完全不同 ❌

使用语义分析可以理解含义：
- "深度学习" vs "神经网络" → 相似度 0.85 ✅
- "深度学习" vs "今天吃饭" → 相似度 0.05 ✅

---

## 快速开始

### 安装依赖
```bash
pip install numpy
# agents 和 lib.client 需要在项目中配置
```

### 基础使用

```python
import asyncio
from lib.text_embedding import encode, similarity

async def main():
    # 1. 文本向量化
    vector = await encode("人工智能很有趣")
    print(vector.shape)  # (1536,) - 1536个数字

    # 2. 计算相似度
    result = await similarity("深度学习", "神经网络")
    print(result['similarity'])  # 0.85

asyncio.run(main())
```

---

## 三种使用方式

### 方式1: 直接调用函数（推荐）

**文件:** `examples/example_text_embedding_basic.py`

```python
from lib.text_embedding import encode, similarity

# 单个文本转向量
vector = await encode("你好世界", dim=128)

# 批量转换
vectors = await encode(["文本1", "文本2", "文本3"], dim=128)

# 计算相似度（AI直接判断，最准确）
result = await similarity("深度学习", "神经网络")
print(result['similarity'])  # 0.85
```

**运行:**
```bash
python examples/example_text_embedding_basic.py
```

---

### 方式2: 使用 SentenceModel 类

**文件:** `examples/example_text_embedding_model.py`

```python
from lib.text_embedding import SentenceModel

# 创建模型
model = SentenceModel(dim=128)

# 文本向量化
vector = await model.encode("机器学习")
vectors = await model.encode(["文本1", "文本2"])

# 计算相似度
score = await model.similarity("深度学习", "神经网络")
print(score)  # 0.85
```

**运行:**
```bash
python examples/example_text_embedding_model.py
```

---

### 方式3: 实际应用场景

**文件:** `examples/example_text_embedding_usecase.py`

包含三个实际应用：

#### 应用1: 语义搜索
从大量文档中找出与查询最相关的内容

```python
query = "什么是深度学习？"
documents = ["文档1", "文档2", ...]

# 找出最相关的文档
for doc in documents:
    score = await model.similarity(query, doc)
    # 按相似度排序
```

#### 应用2: 文本聚类
把意思相近的文本自动分组

```python
texts = ["AI很强大", "深度学习很好", "今天吃饭", "晚餐美味"]
# 自动找出相似的文本对（如："AI很强大" 和 "深度学习很好"）
```

#### 应用3: 重复检测
识别意思相同但表述不同的文本

```python
q1 = "如何学习Python？"
q2 = "怎样学好Python？"
# 检测相似度 > 0.7 的问题，视为重复
```

**运行:**
```bash
python examples/example_text_embedding_usecase.py
```

---

## API 接口说明

### 0. `compare_phrases()` - 兼容 semantic_similarity.py 的接口 ⭐

**返回格式与 `semantic_similarity.compare_phrases()` 完全一致**

```python
await compare_phrases(
    phrase_a,          # 第一个短语
    phrase_b,          # 第二个短语
    model_name='openai/gpt-4.1-mini',
    temperature=0.0,
    method="ai_direct",  # 计算方法
    use_cache=True
)
```

**返回格式:**
```python
{
    "说明": "简明扼要说明理由",
    "相似度": 0.85  # 0-1之间的分数
}
```

**例子:**
```python
# 与 semantic_similarity 完全兼容
result = await compare_phrases("深度学习", "神经网络")
print(result['相似度'])  # 0.85
print(result['说明'])     # "两者都是AI领域的核心概念..."

# 额外支持多种计算方法
result = await compare_phrases("文本1", "文本2", method="cosine")
```

**与 semantic_similarity 的区别:**
- ✅ 返回格式完全一致
- ✅ 支持 AI 直接判断（与 semantic_similarity 相同）
- ✨ 额外支持多种向量计算方法（cosine, euclidean 等）

---

### 1. `encode()` - 文本向量化

```python
await encode(
    text,              # 单个文本或文本列表
    dim=1536,          # 向量维度
    model_name='openai/gpt-4.1-mini',  # 模型
    use_cache=True,    # 是否使用缓存
    return_dict=False  # 是否返回完整信息
)
```

**返回:**
- `return_dict=False`: numpy 数组（默认）
- `return_dict=True`: 完整字典（含语义摘要）

**例子:**
```python
# 返回向量
vector = await encode("你好")  # numpy 数组 (1536,)

# 返回完整信息
result = await encode("你好", return_dict=True)
print(result['semantic_summary'])  # 语义摘要
print(result['embedding'])         # 向量
```

---

### 2. `similarity()` - 相似度计算

```python
await similarity(
    text_a,            # 第一个文本
    text_b,            # 第二个文本
    method="ai_direct",  # 计算方法
    model_name='openai/gpt-4.1-mini',
    use_cache=True
)
```

**计算方法:**
- `ai_direct`: AI 直接判断（最准确，推荐）
- `cosine`: 余弦相似度（基于向量）
- `euclidean`: 欧氏距离
- `manhattan`: 曼哈顿距离
- `dot_product`: 点积

**返回:**
```python
{
    "similarity": 0.85,          # 相似度分数 (0-1)
    "method": "ai_direct",       # 使用的方法
    "explanation": "两者高度相关..."  # 说明
}
```

---

### 3. `SentenceModel` - 模型类

```python
model = SentenceModel(
    model_name='openai/gpt-4.1-mini',
    dim=1536,
    use_cache=True
)

# 向量化
vector = await model.encode("文本")
vectors = await model.encode(["文本1", "文本2"])

# 相似度（直接返回分数）
score = await model.similarity("文本A", "文本B")
print(score)  # 0.85
```

---

## 参数说明

### 向量维度 `dim`
- 向量的长度（数字个数）
- 默认: `1536`（与 OpenAI embeddings 兼容）
- 建议: 测试时用 `128` 或 `256`，节省时间

### 模型 `model_name`
```python
'openai/gpt-4.1-mini'        # 默认，速度快
'anthropic/claude-sonnet-4.5' # 质量高
'google/gemini-2.5-pro'      # Google 模型
```

### 缓存 `use_cache`
- `True`: 相同输入会从缓存读取（速度快 10-100倍）
- `False`: 每次都调用 AI（用于测试）

---

## 与 text2vec 的对比

| 特性 | text2vec | text_embedding.py |
|------|----------|-------------------|
| 文本向量化 | ✅ BERT 模型 | ✅ AI Agent 生成 |
| 相似度计算 | ✅ 余弦距离 | ✅ AI 判断 + 多种方法 |
| 缓存机制 | ❌ 无 | ✅ 自动缓存 |
| 多模型支持 | ❌ 固定模型 | ✅ GPT/Claude/Gemini |
| API 风格 | `encode()`, `similarity()` | ✅ 完全兼容 + 扩展 |
| 中文支持 | ✅ | ✅ |

---

## 常见问题

### Q1: 为什么要用 `await` 和 `async`？
因为调用 AI 需要时间，使用异步可以提高效率。

```python
# 错误 ❌
result = similarity("A", "B")

# 正确 ✅
result = await similarity("A", "B")

# 必须在 async 函数中
async def main():
    result = await similarity("A", "B")

asyncio.run(main())
```

### Q2: 向量维度选多大？
- **测试**: 128 或 256（速度快）
- **生产**: 1536（质量高，与 OpenAI 兼容）

### Q3: 使用哪种相似度计算方法？
- **推荐**: `ai_direct`（最准确）
- **快速**: `cosine`（基于向量，速度快但需要生成向量）

### Q4: 缓存文件在哪？
在 `cache/text_embedding/` 目录下，可以手动删除。

---

## 完整示例运行

```bash
# 示例1: 基础用法
python examples/example_text_embedding_basic.py

# 示例2: SentenceModel 类
python examples/example_text_embedding_model.py

# 示例3: 实际应用场景
python examples/example_text_embedding_usecase.py

# 模块自带示例
python lib/text_embedding.py
```

---

## 总结

**简单来说:**
- **`encode()`** → 把文字变成数字
- **`similarity()`** → 判断两段文字有多像
- **`SentenceModel`** → 封装好的类，更方便使用

**什么时候用:**
- 语义搜索（在大量文档中找相关内容）
- 文本聚类（自动分组相似内容）
- 重复检测（找出意思相同的文本）
- 推荐系统（找相似的文章/商品）
