这是一个基于 Oracle 23ai 数据库 与 第三方或自部署大语言模型做的一个Demo,不是一个开箱即用的成品,此Demo属于个人作品,非官方提供的产品组件。作者及Oracle公司不负责Demo代码的质量保障。如果使用此Demo或其中一部分造成任何损失,后果自负。
下载此Demo应用代表您接受以上免责声明。
AiReport Project。此项目主要使用自己部署的大语言模型、Oracle数据库(包括向量、JSON、关系)实现文生SQL(text2sql),以及采用 RAG 的方式来解决 SQL 生成的正确率问题,通过RAG来达到持续训练持续提升准确率的效果。Text2SQL 及 RAG 引擎部分采用 PLSQL 实现,中间逻辑控制部分采用 Python 实现,前端页面采用 Oracle APEX 低代码实现。
RAG知识库采用持续收集、持续学习的思想,让 Text2SQL 越用越准确。
运行该程序需要 Python 3.12。例如,可以使用 conda 或 poetry 创建一个 python 虚拟环境:
conda create -n aireport python=3.12
安装顺序如下(./engine 目录下):
- 执行 CUSTOM_SELECT_AI_TABLES.sql
- 执行 CUSTOM_SELECT_AI.pkg.sql
- 执行 CUSTOM_SELECT_AI.pkb.sql
执行完以上三步,就代表安装完成,完成如下的配置后,就可以直接使用了。
下例配置了使用通义千问的云服务。也可以使用其它厂商的或自己部署的LLM。要求是配置OpenAI兼容的接口。
以下以自己部署的大模型为例。
关于安装 vLLM,不再赘述。
部署 Qwen2.5-Coder-14B-Instruct-AWQ 模型到 A10(单台就可以部署起来)
nohup python -u -m vllm.entrypoints.openai.api_server --port 8098 --model Qwen/Qwen2.5-Coder-14B-Instruct-AWQ --served-model-name Qwen2.5-Coder-14B-Instruct-AWQ --device=cuda --dtype auto --max-model-len=8192 > vllm.out 2>&1 &
允许数据库访问 LLM 服务器(简单起见,这里直接给了 *,代表所有地址都允许访问)
BEGIN
-- allow connecting to outside hosts
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => 'HYSPOC',
principal_type => xs_acl.ptype_db));
END;
/
部署完成后,测试一下的接口的连通性:
curl http://132.145.95.18:8098/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen2.5-Coder-14B-Instruct-AWQ",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Tell me something about large language models."}
]
}'
BEGIN
CUSTOM_SELECT_AI.CREATE_PROVIDER(
p_provider => 'qwen',
p_endpoint => 'http://132.145.95.18:8098/v1/chat/completions',
p_auth => 'EMPTY'
);
END;
/
Profile指定了使用哪个模型,以及Text2SQL时需要用到的数据库对象(表或视图)。
BEGIN
CUSTOM_SELECT_AI.CREATE_PROFILE(
p_profile_name =>'HKE_DEMO',
p_description => 'SelectAI DEMO for HKE',
p_attributes => '{
"provider": "qwen",
"model" : "Qwen2.5-Coder-14B-Instruct-AWQ",
"object_list": [{"owner": "POCUSER", "name": "HKE_PROD_DEFECT"},
{"owner": "POCUSER", "name": "HKE_PROD_OUT_YIELD_QTY"}
]
}'
);
END;
/
RAG的向量化过程需要用到。可以是兼容OpenAI消息格式的任何模型,包括自己部署的本地Embedding模型 或 云服务都可以。如果SHOWSQL不指定,则使用这里配置的 ID 为 DEFAULT 的 Embedding 配置。
BEGIN
CUSTOM_SELECT_AI.CREATE_EMBEDDING_CONF(
p_conf_id => 'DEFAULT',
p_provider => 'OCIGenAI',
p_model => 'cohere.embed-multilingual-v3.0',
p_endpoint => 'https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText',
p_credential => 'VECTOR_OCI_GENAI_CRED'
);
END;
/
注意:上面的 p_credential,需要使用 dbms_vector.create_credential 创建。具体请参阅 Oracle 的官方文档【https://docs.oracle.com/en/database/oracle/oracle-database/23/arpls/dbms_vector1.html】。
以上是用 Oracle OCI 的 Embedding 模型,也可以是其它的模型,比如用 千问(QWen) Embedding 或者是 自己部署的 Embedding 模型。如下是使用 千问(QWen) Embedding 的例子:
BEGIN
CUSTOM_SELECT_AI.CREATE_EMBEDDING_CONF(
p_conf_id => 'qwen_embedding',
p_provider => 'OpenAI',
p_model => 'text-embedding-v3',
p_endpoint => 'https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings',
p_credential => 'HYSUN_ALIYUN_CRED'
);
END;
/
select CUSTOM_SELECT_AI.CHAT(
p_profile_name => 'HKE_DEMO',
p_user_text => '你好',
p_system_text => '你是一个积极的、充满正能量的人工智能助手。'
);
select CUSTOM_SELECT_AI.EMBEDDING(
p_text => '将文本转成向量',
p_embedding_conf => 'DEFAULT'
);
注意:数据库字符串默认长度为4000,请把MAX_STRING_SIZE设置成EXTENDED(支持长度为32767),否则向量会出现长度溢出的现象。
此方法将自然语言生成对应的SQL语句
select CUSTOM_SELECT_AI.SHOWSQL(
p_profile_name => 'HKE_DEMO',
p_embedding_conf => 'DEFAULT',
p_user_text => '查询符合条件的各YIELD小等级占比(即YIELD_QTY之和/OUT_QTY之和),条件为:公司名称为COMPANY1,工厂名称为FACTORYNAME1,产品名称为PRODUCT1。占比用百分比表示并排序,用中文别名返回。'
);
Demo应用是AI Report的一个参考实现,其使用了上述 SHOWSQL 接口及 CHAT 接口等,前端 UI 采用 Oracle 低代码平台 APEX 实现,后端服务采用 Python 实现。Demo应用本身不复杂,因此不作详细描述,读者可自己参阅源代码。
pip install -r requirements.txt
服务启动时,会从文件 app.env 中读取环境变量信息。
脚本位于目录apex/下:
- 执行 demo_tables_init.sql(可以直接将内容拷贝出来执行)
- 导入 hke_prod_defect.xml(导入时表名同文件名;导入后会自动在表中创建一个ID字段,这是不需要的,删除掉它)。(通过SQL Workshop -> Utilities -> Data Workshop导入)
- 导入 hke_prod_out_yield_qty.xml(导入时表名同文件名;导入后会自动在表中创建一个ID字段,这是不需要的,删除掉它)。(通过SQL Workshop -> Utilities -> Data Workshop导入)
- 导入 APEX 应用 ApexAPP_Chat.sql,并修改API调用的URL指向实际的地址(Shared Components -> Application Settings -> API_SERVER_BASEURL)
- 导入 APEX 应用 APEXAPP_SelectAI_RAG_Store.sql。
- 可以修改第4步中APEX应用的导航菜单项 “模型训练” 的 URL 指向第5步中的应用地址。
start.sh: 启动或重启(start.sh 会自动杀掉正在运行的进程,再启动新的进程)。
系统自动记录用户每次数据查询时生成的SQL语句,通过将正确的SQL语句持续不断的加入到知识库中,达到持续训练的目的,因此,系统会越用越准确。
----- Create service provider
BEGIN
CUSTOM_SELECT_AI.CREATE_PROVIDER(
p_provider => 'qwen',
p_endpoint => 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions',
p_auth => 'sk-75229e7exxxxxxxxxxxxxxxxxxxxxxxx'
);
END;
/
----- Create profile
BEGIN
CUSTOM_SELECT_AI.CREATE_PROFILE(
p_profile_name =>'HKE_DEMO',
p_description => 'SelectAI DEMO for HKE',
p_attributes => '{
"provider": "qwen",
"model" : "qwen-max-2025-01-25",
"object_list": [{"owner": "POCUSER", "name": "HKE_PROD_DEFECT"},
{"owner": "POCUSER", "name": "HKE_PROD_OUT_YIELD_QTY"}
]
}'
);
END;
/
利用样例数据,列出两个演示/测试场景:
对话流程:
- 输入 “显示不良排名”
- 继续输入 “只显示company1公司的”
- 继续输入 “只显示product1的”
- 继续输入 “只显示product2的”
对话流程:
- 输入 “查询company1公司生产的product1产品各YIELD小等级占比”
- 请提供您需要查询的工厂名称?===> 输入“factoryname1”
- 继续输入 “company2公司生产的product2呢”
- 完成对话。