Newsee 实体查找插件

Newsee 实体查找插件的完整文档,包括功能特点、技术架构、安装配置、使用示例和开发指南。

Newsee 实体查找插件

Author: delldi Version: 0.3.0 Type: tool License: MIT

✨ 功能特点

  • 多级匹配策略
  • 精确匹配:直接识别文本中的实体名称
  • 模糊匹配:基于编辑距离的模糊匹配,处理拼写错误
  • 向量检索:使用通义文本嵌入模型 v2 或 bge-small-zh 进行语义搜索
  • 多实体类型:支持项目(project)、组织(org)和指标(target)三种实体类型 + 数据库集成:直接从 MySQL 数据库加载和更新实体数据 + 可配置:灵活的阈值和开关配置 + 多语言支持:基于多语言模型,支持中英文实体识别

🏗️ 技术架构

系统组件

核心模块

  • provider/entity_finder_mysql.py: 实体查找器核心实现
  • EntityFinderMySQL 类:管理实体识别全流程
  • 支持多种匹配策略和结果合并
  • 提供数据库集成和向量检索功能
  • provider/database.py: 数据库连接管理
  • DatabaseConnection 类:处理数据库连接和查询
  • 基于 SQLAlchemy 和 PyMySQL 实现
  • main.py: 插件入口点 + provider/find_newsee_store.py: Dify 插件提供者实现 + tools/: 工具实现目录
  • find-project.py: 项目查找工具
  • find-org.py: 组织查找工具
  • find-target.py: 指标查找工具

🚀 快速开始

1. 安装依赖

2. 配置数据库

创建数据库(如果不存在):

3. 运行示例

⚙️ 配置选项

可以在 provider/entity_finder_mysql.py 中修改默认配置:

📊 数据格式

项目数据格式

组织数据格式

指标数据格式

🛠️ 开发指南

添加新功能

  • provider/entity_finder_mysql.py 中扩展 EntityFinderMySQL
  • 更新数据库查询和向量存储逻辑
  • 添加单元测试

添加新实体类型

  • entity_finder_mysql.py 中的 _load_entities 方法添加新的实体类型查询
  • collections 字典中添加新的集合
  • 创建对应的工具实现文件

测试

📝 使用示例

初始化sql测试文件

target_targetitem.sql

owner_house_precinct_info.sql

ns_system_organization.sql

在 Dify 平台中调用

查找项目

查找组织

查找指标

响应字段说明

字段名 类型 说明
success boolean 请求是否成功
query string 原始查询文本
entities array 匹配到的实体列表
- id string 实体 ID
- name string 实体名称
- type string 实体类型 (project/org/target)
- confidence float 置信度 (0-1)
- match_type string 匹配类型 (exact/fuzzy/vector)
message string 处理结果消息
mermaid14 行
graph TD
    A[用户输入文本] --> B[实体类型选择]
    B --> C{精确匹配?}
    C -->|是| D[返回精确匹配结果]
    C -->|否| E{启用模糊匹配?}
    E -->|是| F[基于编辑距离的模糊匹配]
    F --> G[过滤低分结果]
    G --> H{找到匹配?}
    E -->|否| H
    H -->|是| I[返回模糊匹配结果]
    H -->|否| J[ChromaDB 向量检索]
    J --> K[计算语义相似度]
    K --> L[过滤低分结果]
    L --> M[返回向量检索结果]
mermaid11 行
graph TD
    A[main.py - 插件入口] --> B[FindNewseeStoreProvider]
    B --> C[EntityFinderMySQL]
    C --> D[DatabaseConnection]
    C --> E[ChromaDB]
    B --> F1[find-project 工具]
    B --> F2[find-org 工具]
    B --> F3[find-target 工具]
    E --> G1[projects 集合]
    E --> G2[orgs 集合]
    E --> G3[targets 集合]
bash5 行
# 安装依赖
python -m venv venv
source venv/bin/activate

pip install -r requirements.txt
sql3 行
CREATE DATABASE IF NOT EXISTS `newsee-view`
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;
python31 行
import asyncio
from provider.entity_finder_mysql import EntityFinderMySQL

async def main():
    # 配置数据库连接
    db_config = {
        "host": "localhost",
        "port": 3306,
        "user": "your_username",
        "password": "your_password",
        "database": "newsee-view"
    }

    # 初始化查找器
    finder = EntityFinderMySQL()
    await finder.initialize(db_config)

    # 查找实体
    results = finder.search("星河湾", entity_type="project", top_k=3)
    print(results)

    # 查找组织
    results = finder.search("龙游", entity_type="org", top_k=3)
    print(results)

    # 查找指标
    results = finder.search("旧欠", entity_type="target", top_k=3)
    print(results)

if __name__ == "__main__":
    asyncio.run(main())
python9 行
DEFAULT_CONFIG = {
    "fuzzy_match_threshold": 0.6,  # 模糊匹配阈值 - 降低以捕获更多结果
    "vector_search_threshold": 0.3,  # 向量搜索阈值 - 降低以捕获更多结果
    "top_k": 3,  # 默认返回结果数量
    "enable_fuzzy": True,  # 是否启用模糊匹配
    "enable_vector_search": True,  # 是否启用向量搜索
    "default_top_k": 3,  # 默认返回结果数量
    "batch_size": 25,  # 批量大小
}
python4 行
{
    "id": "P001",  # 项目ID
    "name": "星河湾",  # 项目名称
}
python4 行
{
    "id": "O001",  # 组织ID
    "name": "星河湾1号楼",  # 组织名称
}
python5 行
{
    "id": "T001",  # 指标ID
    "name": "旧欠",  # 指标名称
    "unit": "元",  # 指标单位
}
bash2 行
# 运行测试脚本
python -m tests.test_plugin
plain17 行
查询示例: "星河湾"

响应:
{
  "success": true,
  "query": "星河湾",
  "entities": [
    {
      "id": "P001",
      "name": "星河湾",
      "type": "project",
      "confidence": 0.95,
      "match_type": "vector"
    }
  ],
  "message": "找到 1 个匹配实体"
}
plain17 行
查询示例: "龙游"

响应:
{
  "success": true,
  "query": "龙游",
  "entities": [
    {
      "id": "O001",
      "name": "龙游公司",
      "type": "org",
      "confidence": 0.92,
      "match_type": "vector"
    }
  ],
  "message": "找到 1 个匹配实体"
}
plain17 行
查询示例: "旧欠"

响应:
{
  "success": true,
  "query": "旧欠",
  "entities": [
    {
      "id": "T001",
      "name": "旧欠",
      "type": "target",
      "confidence": 1.0,
      "match_type": "exact"
    }
  ],
  "message": "找到 1 个匹配实体"
}