elasticrag


Nameelasticrag JSON
Version 0.3.2 PyPI version JSON
download
home_pageNone
SummaryElasticsearch-based RAG system with ingest pipeline processing
upload_time2025-07-27 08:33:52
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords elasticsearch embedding nlp rag vector-search
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ElasticRAG

ElasticRAG 是一个基于 Elasticsearch 的 RAG(Retrieval-Augmented Generation)系统,充分利用 Elasticsearch 的 ingest pipeline 功能来处理整个 RAG 工作流。

## 特性

- 🔍 基于 Elasticsearch 的向量搜索和文本搜索
- 🛠️ 使用 ingest pipeline 进行文档处理和向量化
- 👥 多用户支持和认证
- 🧠 多模型支持(OpenAI、HuggingFace 等)
- 📚 知识库(Collection)管理
- 🔄 混合搜索和 RRF(Reciprocal Rank Fusion)算法
- 📄 支持多种文档格式的文本分割
- ⚙️ 支持环境变量配置和命令行参数
- 🌐 可选的 Web 管理界面
- ✨ **新增**: 通过知识图谱和术语库进行增强检索

## 增强检索:结合知识图谱与术语库

ElasticRAG 支持通过集成知识图谱实体和术语库来增强用户查询,从而实现更高级的检索策略。这种混合方法结合了词法搜索、语义搜索和结构化知识,以获得更准确、更相关的结果。

### 工作原理

`Collection` 类中的 `query` 方法可以通过以下可选参数进行增强:

-   `k_hop_entities`: 一个列表的列表,表示从用户查询中提取的实体的 k-hop 邻居。例如:`[['实体_A1', '实体_A2'], ['实体_B1']]`,其中第一个列表包含 1-hop 邻居,第二个列表包含 2-hop 邻居。
-   `terminology`: 与查询相关的术语或同义词列表。

这些参数用于构建一个增强查询,该查询通过两种方式运作:

1.  **文本搜索增强**:
    *   **术语库**: 使用 `match_phrase_prefix` 查询查找包含相关术语的文档。这对于同义词和技术术语非常有用。
    *   **实体**: 使用 `terms` 查询匹配其文本块包含所提供 k-hop 实体的文档。相关性得分(`boost`)会随着跳数的增加而衰减,从而给予更近的实体更高的权重。

2.  **向量搜索增强**:
    *   术语和实体与原始查询文本一起被格式化为一个结构化的提示(Prompt)。
    *   这个增强的提示随后被转换为用于 KNN 搜索的嵌入向量。这丰富了查询的语义上下文,从而实现更好的相似度匹配。

### 灵活的权重配置

术语和实体对文本搜索得分的影响可以通过 `query` 方法中的 `boost_config` 参数进行自定义。该字典可以包含:

-   `terminology_boost`: 术语匹配的权重(默认值:`0.6`)。
-   `entity_base_boost`: 1-hop 实体匹配的基础权重(默认值:`0.4`)。
-   `entity_decay_factor`: 后续跳数的衰减因子(默认值:`0.6`)。

### 数据准备

要利用基于实体的检索,您必须在数据摄入过程中从文档中提取实体,并将它们存储在每个文本块的 `metadata.entities` 字段中。这通常需要在调用 `collection.add()` 之前使用命名实体识别(NER)模型来完成。

## 安装

### 基础安装

仅安装核心功能(CLI 命令行工具):

```bash
uv add elasticrag
```

### 完整安装

包含 Web 管理界面:

```bash
uv add 'elasticrag[web]'
```

### 开发安装

包含开发工具:

```bash
uv add 'elasticrag[dev]'
```

### 全部安装

包含所有功能:

```bash
uv add 'elasticrag[all]'
```

### 从源码安装

```bash
git clone <repository-url>
cd elasticrag
uv sync
# 或安装包含 web 界面
uv sync --extra web
```

## 配置

### 环境变量配置

创建 `.env` 文件(从 `.env.example` 复制):

```bash
cp .env.example .env
```

编辑 `.env` 文件:

```bash
# Elasticsearch Configuration
ELASTICSEARCH_HOST=http://localhost:9200

# Authentication
ELASTICRAG_USERNAME=your_username
ELASTICRAG_API_KEY=your_api_key

# Text Embedding Service
TEXT_EMBEDDING_URL=http://your-embedding-service:8080/embed
TEXT_EMBEDDING_API_KEY=your_embedding_api_key
```

### 命令行参数

你也可以通过命令行参数覆盖环境变量:

```bash
elasticrag --host localhost:9200 -u admin -k secret setup
```

## 快速开始

### 1. 初始化系统

```bash
elasticrag setup
```

### 2. 启动 Web 管理界面(可选)

⚠️ **注意**: Web 界面需要额外安装 gradio 依赖:

```bash
# 安装 web 依赖
uv add 'elasticrag[web]'

# 启动 web 界面
elasticrag server --port 7860
```

然后访问 http://localhost:7860 进入管理界面。

默认管理员账户:
- 用户名: admin
- 密码: admin123

### 3. 使用命令行工具

```bash
# 列出可用模型
elasticrag list-models

# 添加文档
elasticrag add document.pdf -c my_collection -m my_model

# 搜索文档
elasticrag search "your query" -c my_collection -m my_model -s 10
```

你也可以在搜索时加入知识图谱和术语库参数(注意:CLI当前不支持复杂数据结构,此功能主要通过API使用):

```python
# API 调用示例
results = await collection.query(
    query_text="什么是机器学习?",
    terminology=["AI", "人工智能"],
    k_hop_entities=[
        ["深度学习", "神经网络"],  # 1-hop
        ["TensorFlow", "PyTorch"]              # 2-hop
    ],
    boost_config={
        "terminology_boost": 0.7,
        "entity_base_boost": 0.5,
        "entity_decay_factor": 0.5
    }
)
```

## CLI 命令参考

### 全局选项

- `--host`: Elasticsearch 主机地址
- `-u, --username`: 用户名
- `-k, --api-key`: API 密钥
- `-v, --verbose`: 启用详细日志

### 命令

- `setup`: 初始化系统
- `server`: 启动 Gradio Web 管理界面 **(需要安装 web 依赖)**
- `list-models`: 列出可用模型
- `list-users`: 列出所有用户
- `list-collections`: 列出所有集合
- `list-documents [collection] [model]`: 列出文档
- `add <file_path> [-c collection] [-m model]`: 添加文档
- `search <query> [-c collection] [-m model] [-s size]`: 搜索文档

#### server 命令选项

⚠️ **注意**: server 命令需要安装额外依赖:

```bash
uv add 'elasticrag[web]'
```

然后可以使用:

```bash
elasticrag server [选项]

选项:
  --port PORT           Web界面端口 (默认: 7860)
  --host HOST           Web界面主机 (默认: 0.0.0.0)
  --share               通过 Gradio 创建公共链接
  --admin-username USER 管理员用户名
  --admin-password PASS 管理员密码
```

## 依赖说明

### 核心依赖

- `elasticsearch>=8.0.0`: Elasticsearch 客户端
- `python-dotenv>=1.0.0`: 环境变量管理
- `aiohttp>=3.10.11`: 异步 HTTP 客户端

### 可选依赖

#### Web 界面 (`elasticrag[web]`)

- `gradio>=4.0.0`: Web 界面框架
- `pandas>=1.3.0`: 数据处理

#### 开发工具 (`elasticrag[dev]`)

- `pytest>=7.0.0`: 测试框架
- `pytest-asyncio>=0.21.0`: 异步测试支持
- `black>=23.0.0`: 代码格式化
- `isort>=5.12.0`: 导入排序

## Web 管理界面

### 安装 Web 依赖

```bash
uv add 'elasticrag[web]'
```

### 管理员功能

使用管理员账户登录后可以:

- **用户管理**: 查看、添加、删除用户
- **模型管理**: 查看、添加模型配置
- **系统监控**: 查看系统状态和资源使用

### 用户功能

使用普通用户账户登录后可以:

- **集合管理**: 查看自己的文档集合
- **文档管理**: 添加、删除、查看文档
- **搜索调试**: 在集合中搜索文档并查看结果

### 环境变量配置

Web 界面相关的环境变量:

```bash
# 管理员账户配置
ELASTICRAG_ADMIN_USERNAME=admin
ELASTICRAG_ADMIN_PASSWORD=admin123
```

## API 使用

```python
from elasticrag import Client

# 创建客户端
client = Client('http://localhost:9200')

# 认证用户
user = client.authenticate('username', 'api_key')

# 获取集合
collection = client.get_collection('my_collection', 'my_model')

# 添加文档
collection.add('doc_id', 'Document Name', text_content='Your content here')

# 搜索
results = await collection.query('your query')

# 使用知识图谱和术语库进行增强搜索
kg_results = await collection.query(
    query_text='your query',
    terminology=['term1', 'term2'],
    k_hop_entities=[['entity1'], ['entity2']],
    boost_config={'terminology_boost': 0.8}
)
```

## 开发

```bash
# 安装开发依赖
uv sync --extra dev

# 安装所有依赖(包括 web)
uv sync --extra all

# 运行测试
uv run pytest

# 运行异步测试(使用 anyio)
uv run pytest tests/ -v

# 代码格式化
uv run black .
uv run isort .
```

### 测试框架

项目使用 `pytest-asyncio` 进行异步测试。这允许 `pytest` 直接运行 `async def` 测试函数。

- **事件循环管理**: `pytest-asyncio` 为每个测试函数创建并管理独立的事件循环,确保测试之间的隔离。
- **异步 Fixtures**: 支持 `async def` fixtures,可以方便地设置和清理异步资源。

测试命令:

```bash
# 运行所有测试
uv run pytest tests/ -v

# 运行特定的异步测试
uv run pytest tests/test_enhanced_query.py::TestQueryExecution::test_query_basic -v

# 启用详细输出
uv run pytest tests/ -v -s
```

## 许可证

MIT License

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "elasticrag",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "elasticsearch, embedding, nlp, rag, vector-search",
    "author": null,
    "author_email": "Lloyd Zhou <lloydzhou@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/e5/09/9e817338912f2843df5e99e49df86588c04a8b1d85763a14a2ae8014648e/elasticrag-0.3.2.tar.gz",
    "platform": null,
    "description": "# ElasticRAG\n\nElasticRAG \u662f\u4e00\u4e2a\u57fa\u4e8e Elasticsearch \u7684 RAG\uff08Retrieval-Augmented Generation\uff09\u7cfb\u7edf\uff0c\u5145\u5206\u5229\u7528 Elasticsearch \u7684 ingest pipeline \u529f\u80fd\u6765\u5904\u7406\u6574\u4e2a RAG \u5de5\u4f5c\u6d41\u3002\n\n## \u7279\u6027\n\n- \ud83d\udd0d \u57fa\u4e8e Elasticsearch \u7684\u5411\u91cf\u641c\u7d22\u548c\u6587\u672c\u641c\u7d22\n- \ud83d\udee0\ufe0f \u4f7f\u7528 ingest pipeline \u8fdb\u884c\u6587\u6863\u5904\u7406\u548c\u5411\u91cf\u5316\n- \ud83d\udc65 \u591a\u7528\u6237\u652f\u6301\u548c\u8ba4\u8bc1\n- \ud83e\udde0 \u591a\u6a21\u578b\u652f\u6301\uff08OpenAI\u3001HuggingFace \u7b49\uff09\n- \ud83d\udcda \u77e5\u8bc6\u5e93\uff08Collection\uff09\u7ba1\u7406\n- \ud83d\udd04 \u6df7\u5408\u641c\u7d22\u548c RRF\uff08Reciprocal Rank Fusion\uff09\u7b97\u6cd5\n- \ud83d\udcc4 \u652f\u6301\u591a\u79cd\u6587\u6863\u683c\u5f0f\u7684\u6587\u672c\u5206\u5272\n- \u2699\ufe0f \u652f\u6301\u73af\u5883\u53d8\u91cf\u914d\u7f6e\u548c\u547d\u4ee4\u884c\u53c2\u6570\n- \ud83c\udf10 \u53ef\u9009\u7684 Web \u7ba1\u7406\u754c\u9762\n- \u2728 **\u65b0\u589e**: \u901a\u8fc7\u77e5\u8bc6\u56fe\u8c31\u548c\u672f\u8bed\u5e93\u8fdb\u884c\u589e\u5f3a\u68c0\u7d22\n\n## \u589e\u5f3a\u68c0\u7d22\uff1a\u7ed3\u5408\u77e5\u8bc6\u56fe\u8c31\u4e0e\u672f\u8bed\u5e93\n\nElasticRAG \u652f\u6301\u901a\u8fc7\u96c6\u6210\u77e5\u8bc6\u56fe\u8c31\u5b9e\u4f53\u548c\u672f\u8bed\u5e93\u6765\u589e\u5f3a\u7528\u6237\u67e5\u8be2\uff0c\u4ece\u800c\u5b9e\u73b0\u66f4\u9ad8\u7ea7\u7684\u68c0\u7d22\u7b56\u7565\u3002\u8fd9\u79cd\u6df7\u5408\u65b9\u6cd5\u7ed3\u5408\u4e86\u8bcd\u6cd5\u641c\u7d22\u3001\u8bed\u4e49\u641c\u7d22\u548c\u7ed3\u6784\u5316\u77e5\u8bc6\uff0c\u4ee5\u83b7\u5f97\u66f4\u51c6\u786e\u3001\u66f4\u76f8\u5173\u7684\u7ed3\u679c\u3002\n\n### \u5de5\u4f5c\u539f\u7406\n\n`Collection` \u7c7b\u4e2d\u7684 `query` \u65b9\u6cd5\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u53ef\u9009\u53c2\u6570\u8fdb\u884c\u589e\u5f3a\uff1a\n\n-   `k_hop_entities`: \u4e00\u4e2a\u5217\u8868\u7684\u5217\u8868\uff0c\u8868\u793a\u4ece\u7528\u6237\u67e5\u8be2\u4e2d\u63d0\u53d6\u7684\u5b9e\u4f53\u7684 k-hop \u90bb\u5c45\u3002\u4f8b\u5982\uff1a`[['\u5b9e\u4f53_A1', '\u5b9e\u4f53_A2'], ['\u5b9e\u4f53_B1']]`\uff0c\u5176\u4e2d\u7b2c\u4e00\u4e2a\u5217\u8868\u5305\u542b 1-hop \u90bb\u5c45\uff0c\u7b2c\u4e8c\u4e2a\u5217\u8868\u5305\u542b 2-hop \u90bb\u5c45\u3002\n-   `terminology`: \u4e0e\u67e5\u8be2\u76f8\u5173\u7684\u672f\u8bed\u6216\u540c\u4e49\u8bcd\u5217\u8868\u3002\n\n\u8fd9\u4e9b\u53c2\u6570\u7528\u4e8e\u6784\u5efa\u4e00\u4e2a\u589e\u5f3a\u67e5\u8be2\uff0c\u8be5\u67e5\u8be2\u901a\u8fc7\u4e24\u79cd\u65b9\u5f0f\u8fd0\u4f5c\uff1a\n\n1.  **\u6587\u672c\u641c\u7d22\u589e\u5f3a**:\n    *   **\u672f\u8bed\u5e93**: \u4f7f\u7528 `match_phrase_prefix` \u67e5\u8be2\u67e5\u627e\u5305\u542b\u76f8\u5173\u672f\u8bed\u7684\u6587\u6863\u3002\u8fd9\u5bf9\u4e8e\u540c\u4e49\u8bcd\u548c\u6280\u672f\u672f\u8bed\u975e\u5e38\u6709\u7528\u3002\n    *   **\u5b9e\u4f53**: \u4f7f\u7528 `terms` \u67e5\u8be2\u5339\u914d\u5176\u6587\u672c\u5757\u5305\u542b\u6240\u63d0\u4f9b k-hop \u5b9e\u4f53\u7684\u6587\u6863\u3002\u76f8\u5173\u6027\u5f97\u5206\uff08`boost`\uff09\u4f1a\u968f\u7740\u8df3\u6570\u7684\u589e\u52a0\u800c\u8870\u51cf\uff0c\u4ece\u800c\u7ed9\u4e88\u66f4\u8fd1\u7684\u5b9e\u4f53\u66f4\u9ad8\u7684\u6743\u91cd\u3002\n\n2.  **\u5411\u91cf\u641c\u7d22\u589e\u5f3a**:\n    *   \u672f\u8bed\u548c\u5b9e\u4f53\u4e0e\u539f\u59cb\u67e5\u8be2\u6587\u672c\u4e00\u8d77\u88ab\u683c\u5f0f\u5316\u4e3a\u4e00\u4e2a\u7ed3\u6784\u5316\u7684\u63d0\u793a\uff08Prompt\uff09\u3002\n    *   \u8fd9\u4e2a\u589e\u5f3a\u7684\u63d0\u793a\u968f\u540e\u88ab\u8f6c\u6362\u4e3a\u7528\u4e8e KNN \u641c\u7d22\u7684\u5d4c\u5165\u5411\u91cf\u3002\u8fd9\u4e30\u5bcc\u4e86\u67e5\u8be2\u7684\u8bed\u4e49\u4e0a\u4e0b\u6587\uff0c\u4ece\u800c\u5b9e\u73b0\u66f4\u597d\u7684\u76f8\u4f3c\u5ea6\u5339\u914d\u3002\n\n### \u7075\u6d3b\u7684\u6743\u91cd\u914d\u7f6e\n\n\u672f\u8bed\u548c\u5b9e\u4f53\u5bf9\u6587\u672c\u641c\u7d22\u5f97\u5206\u7684\u5f71\u54cd\u53ef\u4ee5\u901a\u8fc7 `query` \u65b9\u6cd5\u4e2d\u7684 `boost_config` \u53c2\u6570\u8fdb\u884c\u81ea\u5b9a\u4e49\u3002\u8be5\u5b57\u5178\u53ef\u4ee5\u5305\u542b\uff1a\n\n-   `terminology_boost`: \u672f\u8bed\u5339\u914d\u7684\u6743\u91cd\uff08\u9ed8\u8ba4\u503c\uff1a`0.6`\uff09\u3002\n-   `entity_base_boost`: 1-hop \u5b9e\u4f53\u5339\u914d\u7684\u57fa\u7840\u6743\u91cd\uff08\u9ed8\u8ba4\u503c\uff1a`0.4`\uff09\u3002\n-   `entity_decay_factor`: \u540e\u7eed\u8df3\u6570\u7684\u8870\u51cf\u56e0\u5b50\uff08\u9ed8\u8ba4\u503c\uff1a`0.6`\uff09\u3002\n\n### \u6570\u636e\u51c6\u5907\n\n\u8981\u5229\u7528\u57fa\u4e8e\u5b9e\u4f53\u7684\u68c0\u7d22\uff0c\u60a8\u5fc5\u987b\u5728\u6570\u636e\u6444\u5165\u8fc7\u7a0b\u4e2d\u4ece\u6587\u6863\u4e2d\u63d0\u53d6\u5b9e\u4f53\uff0c\u5e76\u5c06\u5b83\u4eec\u5b58\u50a8\u5728\u6bcf\u4e2a\u6587\u672c\u5757\u7684 `metadata.entities` \u5b57\u6bb5\u4e2d\u3002\u8fd9\u901a\u5e38\u9700\u8981\u5728\u8c03\u7528 `collection.add()` \u4e4b\u524d\u4f7f\u7528\u547d\u540d\u5b9e\u4f53\u8bc6\u522b\uff08NER\uff09\u6a21\u578b\u6765\u5b8c\u6210\u3002\n\n## \u5b89\u88c5\n\n### \u57fa\u7840\u5b89\u88c5\n\n\u4ec5\u5b89\u88c5\u6838\u5fc3\u529f\u80fd\uff08CLI \u547d\u4ee4\u884c\u5de5\u5177\uff09\uff1a\n\n```bash\nuv add elasticrag\n```\n\n### \u5b8c\u6574\u5b89\u88c5\n\n\u5305\u542b Web \u7ba1\u7406\u754c\u9762\uff1a\n\n```bash\nuv add 'elasticrag[web]'\n```\n\n### \u5f00\u53d1\u5b89\u88c5\n\n\u5305\u542b\u5f00\u53d1\u5de5\u5177\uff1a\n\n```bash\nuv add 'elasticrag[dev]'\n```\n\n### \u5168\u90e8\u5b89\u88c5\n\n\u5305\u542b\u6240\u6709\u529f\u80fd\uff1a\n\n```bash\nuv add 'elasticrag[all]'\n```\n\n### \u4ece\u6e90\u7801\u5b89\u88c5\n\n```bash\ngit clone <repository-url>\ncd elasticrag\nuv sync\n# \u6216\u5b89\u88c5\u5305\u542b web \u754c\u9762\nuv sync --extra web\n```\n\n## \u914d\u7f6e\n\n### \u73af\u5883\u53d8\u91cf\u914d\u7f6e\n\n\u521b\u5efa `.env` \u6587\u4ef6\uff08\u4ece `.env.example` \u590d\u5236\uff09\uff1a\n\n```bash\ncp .env.example .env\n```\n\n\u7f16\u8f91 `.env` \u6587\u4ef6\uff1a\n\n```bash\n# Elasticsearch Configuration\nELASTICSEARCH_HOST=http://localhost:9200\n\n# Authentication\nELASTICRAG_USERNAME=your_username\nELASTICRAG_API_KEY=your_api_key\n\n# Text Embedding Service\nTEXT_EMBEDDING_URL=http://your-embedding-service:8080/embed\nTEXT_EMBEDDING_API_KEY=your_embedding_api_key\n```\n\n### \u547d\u4ee4\u884c\u53c2\u6570\n\n\u4f60\u4e5f\u53ef\u4ee5\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8986\u76d6\u73af\u5883\u53d8\u91cf\uff1a\n\n```bash\nelasticrag --host localhost:9200 -u admin -k secret setup\n```\n\n## \u5feb\u901f\u5f00\u59cb\n\n### 1. \u521d\u59cb\u5316\u7cfb\u7edf\n\n```bash\nelasticrag setup\n```\n\n### 2. \u542f\u52a8 Web \u7ba1\u7406\u754c\u9762\uff08\u53ef\u9009\uff09\n\n\u26a0\ufe0f **\u6ce8\u610f**: Web \u754c\u9762\u9700\u8981\u989d\u5916\u5b89\u88c5 gradio \u4f9d\u8d56\uff1a\n\n```bash\n# \u5b89\u88c5 web \u4f9d\u8d56\nuv add 'elasticrag[web]'\n\n# \u542f\u52a8 web \u754c\u9762\nelasticrag server --port 7860\n```\n\n\u7136\u540e\u8bbf\u95ee http://localhost:7860 \u8fdb\u5165\u7ba1\u7406\u754c\u9762\u3002\n\n\u9ed8\u8ba4\u7ba1\u7406\u5458\u8d26\u6237\uff1a\n- \u7528\u6237\u540d: admin\n- \u5bc6\u7801: admin123\n\n### 3. \u4f7f\u7528\u547d\u4ee4\u884c\u5de5\u5177\n\n```bash\n# \u5217\u51fa\u53ef\u7528\u6a21\u578b\nelasticrag list-models\n\n# \u6dfb\u52a0\u6587\u6863\nelasticrag add document.pdf -c my_collection -m my_model\n\n# \u641c\u7d22\u6587\u6863\nelasticrag search \"your query\" -c my_collection -m my_model -s 10\n```\n\n\u4f60\u4e5f\u53ef\u4ee5\u5728\u641c\u7d22\u65f6\u52a0\u5165\u77e5\u8bc6\u56fe\u8c31\u548c\u672f\u8bed\u5e93\u53c2\u6570\uff08\u6ce8\u610f\uff1aCLI\u5f53\u524d\u4e0d\u652f\u6301\u590d\u6742\u6570\u636e\u7ed3\u6784\uff0c\u6b64\u529f\u80fd\u4e3b\u8981\u901a\u8fc7API\u4f7f\u7528\uff09\uff1a\n\n```python\n# API \u8c03\u7528\u793a\u4f8b\nresults = await collection.query(\n    query_text=\"\u4ec0\u4e48\u662f\u673a\u5668\u5b66\u4e60\uff1f\",\n    terminology=[\"AI\", \"\u4eba\u5de5\u667a\u80fd\"],\n    k_hop_entities=[\n        [\"\u6df1\u5ea6\u5b66\u4e60\", \"\u795e\u7ecf\u7f51\u7edc\"],  # 1-hop\n        [\"TensorFlow\", \"PyTorch\"]              # 2-hop\n    ],\n    boost_config={\n        \"terminology_boost\": 0.7,\n        \"entity_base_boost\": 0.5,\n        \"entity_decay_factor\": 0.5\n    }\n)\n```\n\n## CLI \u547d\u4ee4\u53c2\u8003\n\n### \u5168\u5c40\u9009\u9879\n\n- `--host`: Elasticsearch \u4e3b\u673a\u5730\u5740\n- `-u, --username`: \u7528\u6237\u540d\n- `-k, --api-key`: API \u5bc6\u94a5\n- `-v, --verbose`: \u542f\u7528\u8be6\u7ec6\u65e5\u5fd7\n\n### \u547d\u4ee4\n\n- `setup`: \u521d\u59cb\u5316\u7cfb\u7edf\n- `server`: \u542f\u52a8 Gradio Web \u7ba1\u7406\u754c\u9762 **\uff08\u9700\u8981\u5b89\u88c5 web \u4f9d\u8d56\uff09**\n- `list-models`: \u5217\u51fa\u53ef\u7528\u6a21\u578b\n- `list-users`: \u5217\u51fa\u6240\u6709\u7528\u6237\n- `list-collections`: \u5217\u51fa\u6240\u6709\u96c6\u5408\n- `list-documents [collection] [model]`: \u5217\u51fa\u6587\u6863\n- `add <file_path> [-c collection] [-m model]`: \u6dfb\u52a0\u6587\u6863\n- `search <query> [-c collection] [-m model] [-s size]`: \u641c\u7d22\u6587\u6863\n\n#### server \u547d\u4ee4\u9009\u9879\n\n\u26a0\ufe0f **\u6ce8\u610f**: server \u547d\u4ee4\u9700\u8981\u5b89\u88c5\u989d\u5916\u4f9d\u8d56\uff1a\n\n```bash\nuv add 'elasticrag[web]'\n```\n\n\u7136\u540e\u53ef\u4ee5\u4f7f\u7528\uff1a\n\n```bash\nelasticrag server [\u9009\u9879]\n\n\u9009\u9879:\n  --port PORT           Web\u754c\u9762\u7aef\u53e3 (\u9ed8\u8ba4: 7860)\n  --host HOST           Web\u754c\u9762\u4e3b\u673a (\u9ed8\u8ba4: 0.0.0.0)\n  --share               \u901a\u8fc7 Gradio \u521b\u5efa\u516c\u5171\u94fe\u63a5\n  --admin-username USER \u7ba1\u7406\u5458\u7528\u6237\u540d\n  --admin-password PASS \u7ba1\u7406\u5458\u5bc6\u7801\n```\n\n## \u4f9d\u8d56\u8bf4\u660e\n\n### \u6838\u5fc3\u4f9d\u8d56\n\n- `elasticsearch>=8.0.0`: Elasticsearch \u5ba2\u6237\u7aef\n- `python-dotenv>=1.0.0`: \u73af\u5883\u53d8\u91cf\u7ba1\u7406\n- `aiohttp>=3.10.11`: \u5f02\u6b65 HTTP \u5ba2\u6237\u7aef\n\n### \u53ef\u9009\u4f9d\u8d56\n\n#### Web \u754c\u9762 (`elasticrag[web]`)\n\n- `gradio>=4.0.0`: Web \u754c\u9762\u6846\u67b6\n- `pandas>=1.3.0`: \u6570\u636e\u5904\u7406\n\n#### \u5f00\u53d1\u5de5\u5177 (`elasticrag[dev]`)\n\n- `pytest>=7.0.0`: \u6d4b\u8bd5\u6846\u67b6\n- `pytest-asyncio>=0.21.0`: \u5f02\u6b65\u6d4b\u8bd5\u652f\u6301\n- `black>=23.0.0`: \u4ee3\u7801\u683c\u5f0f\u5316\n- `isort>=5.12.0`: \u5bfc\u5165\u6392\u5e8f\n\n## Web \u7ba1\u7406\u754c\u9762\n\n### \u5b89\u88c5 Web \u4f9d\u8d56\n\n```bash\nuv add 'elasticrag[web]'\n```\n\n### \u7ba1\u7406\u5458\u529f\u80fd\n\n\u4f7f\u7528\u7ba1\u7406\u5458\u8d26\u6237\u767b\u5f55\u540e\u53ef\u4ee5\uff1a\n\n- **\u7528\u6237\u7ba1\u7406**: \u67e5\u770b\u3001\u6dfb\u52a0\u3001\u5220\u9664\u7528\u6237\n- **\u6a21\u578b\u7ba1\u7406**: \u67e5\u770b\u3001\u6dfb\u52a0\u6a21\u578b\u914d\u7f6e\n- **\u7cfb\u7edf\u76d1\u63a7**: \u67e5\u770b\u7cfb\u7edf\u72b6\u6001\u548c\u8d44\u6e90\u4f7f\u7528\n\n### \u7528\u6237\u529f\u80fd\n\n\u4f7f\u7528\u666e\u901a\u7528\u6237\u8d26\u6237\u767b\u5f55\u540e\u53ef\u4ee5\uff1a\n\n- **\u96c6\u5408\u7ba1\u7406**: \u67e5\u770b\u81ea\u5df1\u7684\u6587\u6863\u96c6\u5408\n- **\u6587\u6863\u7ba1\u7406**: \u6dfb\u52a0\u3001\u5220\u9664\u3001\u67e5\u770b\u6587\u6863\n- **\u641c\u7d22\u8c03\u8bd5**: \u5728\u96c6\u5408\u4e2d\u641c\u7d22\u6587\u6863\u5e76\u67e5\u770b\u7ed3\u679c\n\n### \u73af\u5883\u53d8\u91cf\u914d\u7f6e\n\nWeb \u754c\u9762\u76f8\u5173\u7684\u73af\u5883\u53d8\u91cf\uff1a\n\n```bash\n# \u7ba1\u7406\u5458\u8d26\u6237\u914d\u7f6e\nELASTICRAG_ADMIN_USERNAME=admin\nELASTICRAG_ADMIN_PASSWORD=admin123\n```\n\n## API \u4f7f\u7528\n\n```python\nfrom elasticrag import Client\n\n# \u521b\u5efa\u5ba2\u6237\u7aef\nclient = Client('http://localhost:9200')\n\n# \u8ba4\u8bc1\u7528\u6237\nuser = client.authenticate('username', 'api_key')\n\n# \u83b7\u53d6\u96c6\u5408\ncollection = client.get_collection('my_collection', 'my_model')\n\n# \u6dfb\u52a0\u6587\u6863\ncollection.add('doc_id', 'Document Name', text_content='Your content here')\n\n# \u641c\u7d22\nresults = await collection.query('your query')\n\n# \u4f7f\u7528\u77e5\u8bc6\u56fe\u8c31\u548c\u672f\u8bed\u5e93\u8fdb\u884c\u589e\u5f3a\u641c\u7d22\nkg_results = await collection.query(\n    query_text='your query',\n    terminology=['term1', 'term2'],\n    k_hop_entities=[['entity1'], ['entity2']],\n    boost_config={'terminology_boost': 0.8}\n)\n```\n\n## \u5f00\u53d1\n\n```bash\n# \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\nuv sync --extra dev\n\n# \u5b89\u88c5\u6240\u6709\u4f9d\u8d56\uff08\u5305\u62ec web\uff09\nuv sync --extra all\n\n# \u8fd0\u884c\u6d4b\u8bd5\nuv run pytest\n\n# \u8fd0\u884c\u5f02\u6b65\u6d4b\u8bd5\uff08\u4f7f\u7528 anyio\uff09\nuv run pytest tests/ -v\n\n# \u4ee3\u7801\u683c\u5f0f\u5316\nuv run black .\nuv run isort .\n```\n\n### \u6d4b\u8bd5\u6846\u67b6\n\n\u9879\u76ee\u4f7f\u7528 `pytest-asyncio` \u8fdb\u884c\u5f02\u6b65\u6d4b\u8bd5\u3002\u8fd9\u5141\u8bb8 `pytest` \u76f4\u63a5\u8fd0\u884c `async def` \u6d4b\u8bd5\u51fd\u6570\u3002\n\n- **\u4e8b\u4ef6\u5faa\u73af\u7ba1\u7406**: `pytest-asyncio` \u4e3a\u6bcf\u4e2a\u6d4b\u8bd5\u51fd\u6570\u521b\u5efa\u5e76\u7ba1\u7406\u72ec\u7acb\u7684\u4e8b\u4ef6\u5faa\u73af\uff0c\u786e\u4fdd\u6d4b\u8bd5\u4e4b\u95f4\u7684\u9694\u79bb\u3002\n- **\u5f02\u6b65 Fixtures**: \u652f\u6301 `async def` fixtures\uff0c\u53ef\u4ee5\u65b9\u4fbf\u5730\u8bbe\u7f6e\u548c\u6e05\u7406\u5f02\u6b65\u8d44\u6e90\u3002\n\n\u6d4b\u8bd5\u547d\u4ee4\uff1a\n\n```bash\n# \u8fd0\u884c\u6240\u6709\u6d4b\u8bd5\nuv run pytest tests/ -v\n\n# \u8fd0\u884c\u7279\u5b9a\u7684\u5f02\u6b65\u6d4b\u8bd5\nuv run pytest tests/test_enhanced_query.py::TestQueryExecution::test_query_basic -v\n\n# \u542f\u7528\u8be6\u7ec6\u8f93\u51fa\nuv run pytest tests/ -v -s\n```\n\n## \u8bb8\u53ef\u8bc1\n\nMIT License\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Elasticsearch-based RAG system with ingest pipeline processing",
    "version": "0.3.2",
    "project_urls": {
        "Documentation": "https://github.com/lloydzhou/elasticrag#readme",
        "Homepage": "https://github.com/lloydzhou/elasticrag",
        "Issues": "https://github.com/lloydzhou/elasticrag/issues",
        "Repository": "https://github.com/lloydzhou/elasticrag"
    },
    "split_keywords": [
        "elasticsearch",
        " embedding",
        " nlp",
        " rag",
        " vector-search"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "01473d72064d82372e57ac82520caa4f666677057b268b960c3e00be7c9569f0",
                "md5": "02b88391603a2a1118377888e8cc0492",
                "sha256": "28dd3fc8bcf4fc84fbc2859926188b8f74fa0deebf71fc92c9b3ad2d430cfa69"
            },
            "downloads": -1,
            "filename": "elasticrag-0.3.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "02b88391603a2a1118377888e8cc0492",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 32947,
            "upload_time": "2025-07-27T08:33:50",
            "upload_time_iso_8601": "2025-07-27T08:33:50.358161Z",
            "url": "https://files.pythonhosted.org/packages/01/47/3d72064d82372e57ac82520caa4f666677057b268b960c3e00be7c9569f0/elasticrag-0.3.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e5099e817338912f2843df5e99e49df86588c04a8b1d85763a14a2ae8014648e",
                "md5": "b2e648240962e181469e867b5cf2f35f",
                "sha256": "ce4c5995fe08e7c4b9443f03c0b72cebe258c9f72ee4f0191220eeaccfc4a94b"
            },
            "downloads": -1,
            "filename": "elasticrag-0.3.2.tar.gz",
            "has_sig": false,
            "md5_digest": "b2e648240962e181469e867b5cf2f35f",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 29748,
            "upload_time": "2025-07-27T08:33:52",
            "upload_time_iso_8601": "2025-07-27T08:33:52.041210Z",
            "url": "https://files.pythonhosted.org/packages/e5/09/9e817338912f2843df5e99e49df86588c04a8b1d85763a14a2ae8014648e/elasticrag-0.3.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-27 08:33:52",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "lloydzhou",
    "github_project": "elasticrag#readme",
    "github_not_found": true,
    "lcname": "elasticrag"
}
        
Elapsed time: 0.44008s