> ## Agent Instructions
>
> Base URL: https://api.anysite.io
> Authentication: send the `access-token` header. Do NOT use `Authorization: Bearer`.
> Full endpoint catalog: https://app.anysite.io/docs
# LLM 分析

使用 AI 模型对数据进行分类、摘要、增强和去重

## 概述

Anysite CLI 集成了多个 LLM 提供商，为数据集管道数据添加 AI 驱动的分析能力。提供 6 种操作：分类、摘要、
增强、生成、匹配和去重。每种操作都读取某个[数据集](/docs/cli/datasets/overview?lang=zh)数据源已采集的
Parquet 文件 — 没有可以传入任意 JSON 的 `--file` 输入方式。

> 
  需要 `llm` 可选依赖包：`pip install "anysite-cli[llm]"`

## 设置

```bash
# Interactive
anysite llm setup

# Non-interactive (CI/agents)
anysite llm setup --provider openai --api-key sk-... --no-test
anysite llm setup --provider anthropic --api-key-env ANTHROPIC_API_KEY
```

`--api-key` 直接接受密钥值；`--api-key-env` 则引用一个环境变量。`--model` 用于覆盖默认模型；
`--no-test` 跳过连接测试。

### 支持的提供商

| 提供商 | 默认模型 |
|----------|---------------|
| **OpenAI** | `gpt-4.1-mini` |
| **Anthropic** | `claude-sonnet-4-5-20250514` |

提供商设置保存在 `~/.anysite/config.yaml` 的 `llm.providers.<name>` 下。

## 操作

每种操作都共享这一组选项：`--provider`、`--model`、`--parallel`/`-j`（默认 `5`）、`--rate-limit`、
`--temperature`、`--max-tokens`、`--no-cache`、`--format`/`-f`、`--output`/`-o`、`--quiet`/`-q`、
`--prompt`、`--prompt-file`，以及 `--dry-run`（打印构建出的提示词而不调用 LLM）。

### 分类（Classify）

```bash
anysite llm classify dataset.yaml --source profiles \
  --categories "developer,recruiter,executive,other" \
  --fields "name,headline,summary"
```

如果省略 `--categories`/`-c`，LLM 会根据前 20 条记录自动检测 3-7 个类别。`--multi` 允许每条记录属于
多个类别。`--output-column`（默认 `category`）用于命名结果列。

### 摘要（Summarize）

```bash
anysite llm summarize dataset.yaml --source profiles \
  --fields "name,headline,summary,experience" \
  --max-length 50 \
  --output-column bio_summary
```

`--max-length`（默认 `100`）限制摘要长度（单位：词）。

### 增强（Enrich）

```bash
anysite llm enrich dataset.yaml --source profiles \
  --add "seniority:junior/mid/senior/lead" \
  --add "is_technical:boolean" \
  --add "years_experience:number" \
  --add "primary_skill:string"
```

`--add name:spec` 支持的属性类型：
- **枚举** — 以斜杠分隔的可选值：`"seniority:junior/mid/senior"`
- **布尔值** — `"is_technical:boolean"`
- **数字** — `"years_experience:number"`
- **整数区间** — 规格中包含连字符时，如 `"quality_score:1-10"`，会被视为整数
- **字符串** — 自由文本：`"primary_skill:string"`

### 生成（Generate）

```bash
anysite llm generate dataset.yaml --source profiles \
  --prompt "Write a 2-sentence professional intro for {name} who works as {headline}" \
  --temperature 0.7 \
  --output-column intro_text
```

必须提供 `--prompt` 或 `--prompt-file` 之一。`--output-column` 默认值为 `text`。如果未指定
`--temperature`，`generate` 默认使用 `0.7`；其他所有操作默认使用 `0.0`。

### 匹配（Match）

```bash
anysite llm match dataset.yaml \
  --source-a profiles \
  --source-b companies \
  --top-k 3
```

匹配操作使用 `--fields-a` 和 `--fields-b` 来选择字段（而不是共用的 `--fields`）。`--top-k`
（默认 `3`）限制每条 source-a 记录的匹配数量；`--threshold`（默认 `0.5`）是保留匹配所需的最低匹配分数。

### 去重（Deduplicate）

```bash
anysite llm deduplicate dataset.yaml --source profiles \
  --key name \
  --threshold 0.8
```

`--key`/`-k`（默认 `name`）用于在比较前对记录分块 — 只有该字段前三个字符（转小写后）相同的记录才会被
互相比较，以限制大数据源上的 LLM 调用次数。`--threshold`（默认 `0.8`）是判定为重复记录的最低置信度。

## 在数据集管道中使用 LLM

```yaml
sources:
  - id: profiles
    endpoint: /api/linkedin/user
    from_file: users.txt
    input_key: user

  - id: profiles_enriched
    type: llm
    dependency:
      from_source: profiles
      field: name
    llm:
      - type: classify
        categories: "developer,recruiter,executive,sales,other"
        output_column: role_type

      - type: enrich
        add:
          - "seniority:junior/mid/senior/lead"
          - "is_technical:boolean"

      - type: summarize
        max_length: 50
        output_column: bio_summary
```

单个 LLM 数据源内可以链式使用多个 LLM 步骤。它们会按顺序执行，每一步都为数据集添加新的列。

## 缓存

响应会缓存在 `~/.anysite/llm_cache.db` 中，以避免重复调用 API：

```bash
anysite llm cache-stats
anysite llm cache-clear
anysite llm classify dataset.yaml --source profiles \
  --categories "dev,recruiter,exec" --no-cache
```

## 选项参考

| 选项 | 描述 | 适用对象 |
|--------|-------------|------------|
| `--source`, `-s` | 要处理的数据源 | 除 match 外的所有操作（match 使用 `--source-a`/`--source-b`） |
| `--fields` | 包含在 LLM 提示词中的字段（逗号分隔） | classify、summarize、enrich、deduplicate、generate |
| `--fields-a` / `--fields-b` | 各数据源的字段 | match |
| `--categories`, `-c` | 逗号分隔的类别 | classify |
| `--multi` | 允许每条记录属于多个类别 | classify |
| `--add` | 属性规格 `name:type_or_values`（可重复使用） | enrich |
| `--prompt` / `--prompt-file` | 自定义或基于文件的提示词模板 | 全部 |
| `--temperature` | LLM 温度（0.0-1.0） | 全部 |
| `--max-tokens` | 最大响应令牌数 | 全部 |
| `--max-length` | 摘要的最大词数 | summarize |
| `--output-column` | 结果列的名称 | classify、summarize、generate |
| `--top-k` | 每条记录的匹配数量 | match |
| `--key`, `-k` | 用于分块/比较的字段 | deduplicate |
| `--threshold` | 匹配或重复的置信度阈值（0.0-1.0） | match、deduplicate |
| `--provider` / `--model` | 覆盖已配置的 LLM 提供商或模型 | 全部 |
| `--dry-run` | 打印构建出的提示词而不调用 LLM | 全部 |
| `--no-cache` | 跳过 LLM 缓存 | 全部 |

## 后续步骤

  
#### SQL Querying

    使用 DuckDB SQL 查询和分析增强后的数据
  
  
#### Examples

    查看完整的端到端工作流示例
