From 2db000b15cc758ac71bc876a57b5a75337767664 Mon Sep 17 00:00:00 2001 From: Qu Date: Tue, 9 Jan 2024 20:15:03 +0800 Subject: [PATCH] docs: add component.md and adjust command.md (#19) Co-authored-by: Qu --- docs/tutorial/knext/command.md | 280 ++++++++++--------------------- docs/tutorial/knext/component.md | 146 ++++++++++++++++ docs/tutorial/knext/nn4k.md | 2 +- docs/tutorial/knext/operator.md | 2 +- 4 files changed, 235 insertions(+), 195 deletions(-) create mode 100644 docs/tutorial/knext/component.md diff --git a/docs/tutorial/knext/command.md b/docs/tutorial/knext/command.md index c64de8d..518060d 100644 --- a/docs/tutorial/knext/command.md +++ b/docs/tutorial/knext/command.md @@ -24,7 +24,7 @@ knext config set --global host_addr=http://127.0.0.1:8887 执行以下命令,创建一个项目,会在当前目录下生成示例项目文件夹,文件夹名为namespace的小写: ```bash -knext project create --prj_path 示例项目 --namespace Prj --desc 这是一个示例项目 +knext project create --name 示例项目 --namespace Demo --desc 这是一个示例项目 ``` ### 1.3 切换项目 @@ -32,79 +32,87 @@ knext project create --prj_path 示例项目 --namespace Prj --desc 这是一个 执行以下命令,进入项目目录,所有对于该项目的操作需要在项目目录内进行: ```bash -cd prj +cd demo ``` 项目内包含: -- 一个示例实体 `Prj.Demo`,声明在 `/schema/prj.schema`,用于创建项目schema: +- 一个示例实体 `Demo.Company`,声明在 `schema/demo.schema`,用于创建项目schema: ``` -namespace Prj +namespace Demo -Demo(示例实体): EntityType +Company(公司): EntityType properties: - demoProperty(示例属性): Text + address(地址): Text ``` -- 一个构建任务 `Demo`,定义在`builder/job/demo.py` ,用于导入 `Prj.Demo`实体: +- 一个加工任务 `Company`,定义在`builder/job/company.py` ,用于导入 `Demo.Company`实体: ```python # -*- coding: utf-8 -*- -from knext.api.component import ( - CSVReader, - KGWriter, -) -from knext.api.component import SPGTypeMapping from knext.client.model.builder_job import BuilderJob -from schema.prj_schema_helper import Prj +from knext.api.component import CSVReader, UserDefinedExtractor, SPGTypeMapping, KGWriter +try: + from schema.demo_schema_helper import Demo +except: + pass -class Demo(BuilderJob): +class Company(BuilderJob): def build(self): source = CSVReader( - local_path="./builder/job/data/Demo.csv", - columns=["id", 'prop'], + local_path="./builder/job/data/company.csv", + columns=["id", "name", "province", "city", "district"], start_row=2 ) - mapping = ( - SPGTypeMapping(spg_type_name=Prj.Demo) - .add_property_mapping("id", Prj.Demo.id) - .add_property_mapping("prop", Prj.Demo.demoProperty) - ) + from operator.address_extract_op import AddressExtractOp + extract = UserDefinedExtractor(extract_op=AddressExtractOp()) + + mapping = SPGTypeMapping( + spg_type_name=Demo.Company + ).add_mapping_field("id", Demo.Company.id) \ + .add_mapping_field("name", Demo.Company.name) \ + .add_mapping_field("address", Demo.Company.address) sink = KGWriter() - return source >> mapping >> sink + return source >> extract >> mapping >> sink ``` -- 一个抽取算子 `DemoExtractOp`,定义在 `builder/operator/demo_extract.py` : +- 一个抽取算子 `AddressExtractOp`,定义在 `builder/operator/address_extract_op.py` : ```python -# -*- coding: utf-8 -*- -import requests from typing import List, Dict -from knext.api.operator import ExtractOp -from knext.api.record import SPGRecord +from knext.api.record import SPGRecord +from knext.api.operator import ExtractOp +try: + from schema.demo2_schema_helper import Demo2 +except: + pass -class DemoExtractOp(ExtractOp): +class AddressExtractOp(ExtractOp): def __init__(self, params: Dict[str, str] = None): super().__init__(params) def invoke(self, record: Dict[str, str]) -> List[SPGRecord]: - # 实现user defined抽取逻辑 - return [SPGRecord()] + province = record.get("province", "") + city = record.get("city", "") + district = record.get("district", "") + + record.update({"address": province + city + district}) + return [SPGRecord(Demo.Company).upsert_properties(record)] ``` -- 一个DSL查询语句,声明在 `reasoner/demo.dsl`,用于查询所有 `Prj.Demo`实体: +- 一个DSL查询语句,声明在 `reasoner/company.dsl`,用于查询所有 `Demo.Company`实体: ``` -MATCH (s:Prj.Demo) -RETURN s.id, s.demoProperty +MATCH (s:Demo2.Company) +RETURN s.id, s.address ``` ### 1.4 创建schema @@ -113,31 +121,24 @@ RETURN s.id, s.demoProperty knext schema commit ``` -- 执行此命令后,会将`/schema/prj.schema`内的schema声明,提交到服务端。 - -### 1.5 发布算子 - -```bash -knext operator publish DemoExtractOp -``` +- 执行此命令后,会将`schema/demo.schema`内的schema声明,提交到SPG服务端。 -- 执行此命令后,会扫描 `builder/operator`下的所有算子,并将 `DemoExtractOp` 发布到服务端。 -### 1.6 知识加工 +### 1.5 知识加工 ```bash -knext builder execute Demo +knext builder execute Company ``` -- 执行此命令后,会扫描 `builder/job`下的所有加工任务(需要继承`BuilderJob`类),并将 `Demo`提交到服务端。 +- 执行此命令后,会扫描 `builder/job`下的所有加工任务(需要继承`BuilderJob`类),并执行 `Company`加工任务。 -### 1.7 dsl查询 +### 1.6 dsl查询 ```bash -knext reasoner execute --file reasoner/demo.dsl +knext reasoner execute --file reasoner/company.dsl ``` -- 执行此命令后,会将 `--file` 指定的文件中的dsl查询语句,提交到服务端进行查询,并同步返回查询结果。 +- 执行此命令后,会执行 `--file` 指定的文件中的dsl查询语句。 ## 2 命令行工具 @@ -153,7 +154,6 @@ Options: Commands: builder Builder client. config Knext config. - operator Operator client project Project client. reasoner Reasoner client. schema Schema client. @@ -252,30 +252,38 @@ knext project create [--help] 使用实例: ```bash -knext project create --name 示例项目 --namespace Prj --desc 这是一个示例项目 +knext project create --name 示例项目 --namespace Demo --desc 这是一个示例项目 ``` 结果: -执行成功后会在当前目录下创建出prj目录,执行`cd prj`进入示例项目。 +执行成功后会在当前目录下创建出demo目录,执行`cd demo`进入示例项目。 ``` -. -└── prj - ├── builder - │ ├── model - │ ├── operator - │ │ └── demo_extract_op.py - │ └── job - │ ├── data - │ │ └── Demo.csv - │ └── demo.py - ├── reasoner - │ └── demo.dsl - ├── schema - │ ├── prj.schema - └── README.md +demo +├── README.md +├── builder +│  ├── job +│  │  ├── company.py +│  │  └── data +│  │  └── company.csv +│  └── operator +│  └── address_extract_op.py +├── reasoner +│  └── company.dsl +└── schema + └── demo.schema ``` +使用实例: + +```bash +knext project create --prj_path demo +``` + +结果: +执行成功后会根据`demo/.knext.cfg`配置文件创建项目。 + + #### 2.2.2 展示所有项目 ```bash @@ -375,68 +383,8 @@ Defined belongTo rule for ... Concept rule is successfully registered. ``` -### 2.4 operator - -```bash -Usage: knext operator [OPTIONS] COMMAND [ARGS]... - - Operator client - -Options: - --help Show this message and exit. - -Commands: - list List all server-side operators. - publish Publish an operator to server. -``` - -#### 2.4.1 发布算子 - -```bash -knext operator publish [OP_NAMES] -``` - -- 【必填】OP_NAMES 发布的算子名,多个算子间用`,`分隔开。所有算子必须实现在 `builder/operator/`下,且需要继承`BaseOp` - 的子类,算子名默认为类名。 - -使用实例: -builder/operator/demo_extract_op.py - -```python -... - - -class DemoExtractOp(KnowledgeExtractOp): - - -... -``` - -执行命令: - -```bash -knext operator publish DemoExtractOp -``` - -结果: - -```bash -Operator [DemoExtractOp] has been successfully published. The latest version is 1. -``` -#### 2.4.2 展示所有算子 - -```bash -knext operator list [--help] -``` - -使用实例: - -```bash -knext operator list -``` - -### 2.5 builder +### 2.4 builder ```bash Usage: knext builder [OPTIONS] COMMAND [ARGS]... @@ -447,27 +395,26 @@ Options: --help Show this message and exit. Commands: - get Query submitted job status. execute Submit asynchronous builder jobs to server by providing job names. ``` -#### 2.5.1 提交构建任务 +#### 2.4.1 执行加工任务 ```bash knext builder execute [JOB_NAMES] ``` -- 【必填】JOB_NAMES 提交的构建任务名,多个任务间用`,`分隔开。所有任务必须实现在 `builder/job/`下,且需要继承`BuilderJob` +- 【必填】JOB_NAMES 提交的加工任务名,多个任务间用`,`分隔开。所有任务必须实现在 `builder/job/`下,且需要继承`BuilderJob` ,任务名默认为类名。 使用实例: -builder/job/demo.py +builder/job/company.py ```python ... -class Demo(BuilderJob): +class Company(BuilderJob): ... @@ -476,25 +423,11 @@ class Demo(BuilderJob): 执行命令: ```bash -knext builder execute Demo -``` - -结果: - -```bash -Operator [DemoExtractOp] has been successfully published. The latest version is 1. -``` - -#### 2.5.2 查询构建任务 - -```bash -knext builder get [--help] - [--id id] +knext builder execute Company ``` -- 【必填】--id 查询的任务id(成功提交任务后会返回),结果返回单个任务实例。 -### 2.6 reasoner +### 2.5 reasoner ```bash Usage: knext reasoner [OPTIONS] COMMAND [ARGS]... @@ -505,14 +438,10 @@ Options: --help Show this message and exit. Commands: - get Query submitted reasoner job status. execute Query dsl by providing a string or file. - submit Submit asynchronous reasoner jobs to server by providing DSL file or string. ``` -#### 2.6.1 DSL查询 - -提交DSL查询任务,结果同步返回,查询任务耗时超过3分钟会报错。 +#### 2.5.1 执行推理任务 ```bash knext reasoner execute [--help] @@ -527,8 +456,8 @@ knext reasoner execute [--help] reasoner/demo.dsl: ```bash -MATCH (s:Prj.Demo) -RETURN s.id, s.demoProperty +MATCH (s:Demo2.Company) +RETURN s.id, s.address ``` 执行命令: @@ -539,34 +468,11 @@ knext reasoner execute --file reasoner/demo.dsl 结果: -```bash -| s_id | s_demoProperty | -|--------|------------------| -| 00 | demo | +```csv +"s.id","s.address" +"00","浙江省杭州市西湖区" ``` -#### 2.6.2 提交DSL推理任务 - -提交查询任务,结果异步生成。 - -```bash -knext reasoner execute [--help] - [--file file] - [--dsl file] -``` - -- 【二选一】--file 查询的dsl文件。 -- 【二选一】--dsl 查询的dsl语法,用双引号括起来。 - -#### 2.6.3 查询推理任务 - -```bash -knext reasoner get [--help] - [--id id] -``` - -【必填】--id 查询的任务id(成功提交任务后会返回),结果返回单个任务实例。 - ## 3 默认项目结构 ``` @@ -584,17 +490,9 @@ knext reasoner get [--help] │ ├── data # 数据目录 │ │ ├── Demo1.csv │ │ ├── Demo2.csv - │ │ └── ... - │ └── error_record # 错误信息目录 - │ ├── spgbuilder_Demo1_1_errorRecord.csv - │ ├── spgbuilder_Demo1_2_errorRecord.csv │ └── ... ├── reasoner # 规则推理 - │ ├── demo.dsl - │ └── result - │ ├── spgreasoner_job_1_result.csv - │ ├── spgreasoner_job_2_result.csv - │ └── ... + │ └── demo.dsl ├── schema # schema定义 │ ├── riskmining.schema │ ├── riskmining_schema_helper.py @@ -618,11 +516,9 @@ schema_dir = schema schema_file = riskmining.schema builder_dir = builder builder_operator_dir = builder/operator -builder_record_dir = builder/error_record builder_job_dir = builder/job builder_model_dir = builder/model reasoner_dir = reasoner -reasoner_result_dir = reasoner/result ``` - `project_name` 项目名,新建项目时通过[--name]参数指定,不可修改。 @@ -634,11 +530,9 @@ reasoner_result_dir = reasoner/result - `schema_file` schema声明文件名,新建项目时默认为 `${namespace.lower()}.schema`。若文件重命名,需要修改此配置。 - `builder_dir` 加工任务目录,新建项目时默认为 `builder`。若目录变动,需要修改此配置。 - `builder_operator_dir` 算子目录,新建项目时默认为 `builder/operator`。若目录变动,需要修改此配置。 -- `builder_record_dir` 加工任务记录目录,新建项目时默认为 `builder/record`。若目录变动,需要修改此配置。 - `builder_job_dir` 算子目录,新建项目时默认为 `builder/job`。若目录变动,需要修改此配置。 - `builder_model_dir` 算法模型目录,新建项目时默认为 `builder/model`。若目录变动,需要修改此配置。 - `reasoner_dir` 规则推理目录,新建项目时默认为 `reasoner`。若目录变动,需要修改此配置。 -- `reasoner_result_dir` 规则推理结果目录,新建项目时默认为 `reasoner/result`。若目录变动,需要修改此配置。 - `builder` 目录用来保存所有知识加工任务以及依赖的源数据、自定义算子、算法模型、执行错误记录。 - `reasoner` 目录用来保存规则推理相关的DSL语法文件和执行结果。 - DSL语法文件以`.dsl`为结尾,用来保存DSL查询语句。 diff --git a/docs/tutorial/knext/component.md b/docs/tutorial/knext/component.md new file mode 100644 index 0000000..6ba2ca5 --- /dev/null +++ b/docs/tutorial/knext/component.md @@ -0,0 +1,146 @@ +--- +title: 组件介绍 +order: 2 +--- + +### SourceReader +> 所有知识加工任务的第一步,从数据源逐行读取数据,将数据转化成`Dict[str, str]`格式。 + +#### CSVReader +从本地csv文件读取数据。 +##### 参数 +| 名称 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **local_path** | str | 是 | './builder/job/data/App.csv' | 文件路径 | +| **columns** | list[str] | 否 | ['id', 'riskMark', 'useCert'] | 输入列 | +| **start_row** | int | 否 | 2 | 数据读取起始行数【若希望从csv第一行开始读取,则start_row=1】 | + +### SPGExtractor +> 在知识加工任务中,用于从非结构化数据中抽取出结构化知识。 + +#### UserDefinedExtractor +> 执行用户自定义的抽取算子。需要用户实现`ExtractOp`,并将算子设置在组件上。 + +##### 参数 +| 名称 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **extract_op** | ExtractOp | 是 | DiseaseExtractOp(params={"config": "test"}) | 抽取算子实例 | + +#### LLMBasedExtractor +> 调用大模型进行知识抽取。借助`NN4K`,设置用于进行抽取的llm模型。同时,需要用户实现`PromptOp`,自定义用于抽取的prompt模版,以及前置处理和后置处理逻辑。当前抽取组件会将前后置处理和调用模型一系列流程串联起来,将非结构化`Dict[str, str]`类型数据,转化为结构化`SPGRecord`类型数据。 +> +> 如果设置了多个`PromptOp`,会按照顺序依次执行。 + +##### 参数 +| 名称 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **llm** | NNInvoker | 是 | NNInvoker.from_config("./openai_infer.json") | 抽取模型 | +| **prompt_ops** | List[PromptOp] | 是 | [NERPromptOp("Medical.Disease")] | prompt算子 | + +### Mapping +#### SPGTypeMapping +> SPG映射节点由四个执行步骤组成: +> +> STEP1(**Mapping**):根据配置的字段映射关系,将非标准数据字段映射到subject类型的属性字段上。 +> +> STEP2(**Object Linking**):对于映射后的属性,若object类型上绑定或设置了**LinkOp**,则执行基于属性值生成object的链指流程。 +> +> STEP3(**Predicate Predicting**):对于映射后的属性,若属性值为空,且当前(subject,predicate,object)上绑定了**PredictOp**,则执行基于subject所有属性生成object的预测流程。 +> +> STEP4(**Subject Fusing**):若当前subject类型上绑定了**FuseOp**,则执行基于subject的融合流程。 + +##### 参数 +| 名称 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **spg_type_name** | str | 是 | DEFAULT.App | SPG类型名 | + +##### 接口 +**add_property_mapping** +> 添加从非标准数据字段到SPG属性之间的映射关系,并执行绑定到属性所属于的类型schema上的链指策略。 + +| 参数 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **source_name** | str | 是 | "useCert" | 源字段 | +| **target_name** | PropertyName | 是 | DEFAULT.App.useCert | SPG属性名 | +| **target_type** | SPGTypeName | 否 | DEFAULT.Cert | SPG属性类型。当前未支持属性多类型,暂不需要填。 | +| **link_strategy** | LinkingStrategy | 否 | CertLinkOp() | 链指策略。当前支持的链指策略: +1、`LinkingStrateEnum.IDEquals` +2、`LinkOp`类型算子 +若设置,会在当前任务覆盖schema上绑定的链指策略。 | + +**add_relation_mapping** +> 添加从非标准数据字段到SPG关系之间的映射关系,并执行绑定到关系所属于的类型schema上的链指策略。 + +| 参数 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **source_name** | str | 是 | "belongTo" | 源字段 | +| **target_name** | RelationName | 是 | DEFAULT.App.belongTo | SPG关系名 | +| **target_type** | SPGTypeName | 是 | DEFAULT.Company | SPG关系类型。关系映射上必填。 | +| **link_strategy** | LinkingStrategy | 否 | CertLinkOp() | 链指策略。当前支持的链指策略: +1、`LinkingStrateEnum.IDEquals` +2、`LinkOp`类型算子 +若设置,会在当前任务覆盖schema上绑定的链指策略。 | + +**add_predicting_property** +> 添加需要预测的SPG属性字段,并执行绑定到spo三元组上的预测策略。 + +| 参数 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **target_name** | PropertyName | 是 | DEFAULT.App.useCert | SPG属性名 | +| **target_type** | SPGTypeName | 否 | DEFAULT.Cert | SPG属性类型。当前未支持属性多类型,暂不需要填。 | +| **predicting_strategy** | PredictingStrategy | 否 | CertPredictOp() | 预测策略。当前支持的预测策略: +1、`PredictOp`类型算子 +若设置,会在当前任务覆盖schema上绑定的预测策略。 | + +**add_predicting_relation** +> 添加需要预测的SPG关系字段,并执行绑定到spo三元组上的预测策略。 + +| 参数 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **target_name** | RelationName | 是 | DEFAULT.App.belongTo | SPG属性名 | +| **target_type** | SPGTypeName | 是 | DEFAULT.Company | SPG关系类型。关系映射上必填。 | +| **predicting_strategy** | PredictingStrategy | 否 | CertPredictOp() | 预测策略。当前支持的预测策略: +1、`PredictOp`类型算子 +若设置,会在当前任务覆盖schema上绑定的预测策略。 | + +**add_filter** +> 添加字段筛选条件,数据满足`column_name=column_value`条件的会执行映射。若不设置筛选条件,则全部数据会执行映射。 + +| 参数 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **column_name** | str | 是 | "type" | 筛选字段 | +| **column_value** | str | 是 | "App" | 筛选值 | + +#### RelationMapping +> 用于将数据映射到SPG关系以及关系上的子属性。 + +##### 参数 +| 名称 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **subject_name** | SPGTypeName | 是 | DEFAULT.App | SPG类型名 | +| **predicate_name** | RelationName | 是 | DEFAULT.App.belongTo | SPG关系名 | +| **object_name** | SPGTypeName | 是 | DEFAULT.Company | SPG类型名 | + +##### 接口 +**add_sub_property_mapping** +> 添加从源数据字段到SPG关系子属性之间的映射关系。 + +| 参数 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **source_name** | str | 是 | "confidence" | 源字段 | +| **target_name** | SubPropertyName | 是 | DEFAULT.App.belongTo.confidence | SPG关系子属性 | + +**add_filter** +> 添加字段筛选条件,数据满足`column_name=column_value`条件的会执行映射。若不设置筛选条件,则全部数据会执行映射。 + +| 参数 | 类型 | 是否必填 | 示例值 | 描述 | +| --- | --- | --- | --- | --- | +| **column_name** | str | 是 | "type" | 筛选字段 | +| **column_value** | str | 是 | "App" | 筛选值 | + +### SinkWriter +> 所有知识加工任务的最后一步,将数据导入到目标存储中 + +#### KGWriter +##### 参数 +无 diff --git a/docs/tutorial/knext/nn4k.md b/docs/tutorial/knext/nn4k.md index 1cffc01..d698f84 100644 --- a/docs/tutorial/knext/nn4k.md +++ b/docs/tutorial/knext/nn4k.md @@ -1,6 +1,6 @@ --- title: NN4K介绍 -order: 3 +order: 4 --- NN4K(Neural Network for Knowledge Graph)是一个神经网络模型的开发、管理、服务框架,为OpenSPG提供简单易用、模式统一的大模型服务。 diff --git a/docs/tutorial/knext/operator.md b/docs/tutorial/knext/operator.md index 7134d1d..ab880a3 100644 --- a/docs/tutorial/knext/operator.md +++ b/docs/tutorial/knext/operator.md @@ -1,6 +1,6 @@ --- title: 算子介绍 -order: 2 +order: 3 --- 如下表所示,knext提供共5类算子接口,用户可以通过继承对应基类,实现算子接口,来自定义算子执行逻辑。所有算子必须依赖组件执行,依赖关系参考