找回密码
 立即注册
首页 业界区 业界 Oracle AI应用的LLM模型典型配置

Oracle AI应用的LLM模型典型配置

湛恶 7 天前
最近在做一些基于Oracle的一些AI应用测试工作,AI肯定离不开配置LLM相关,虽然是简单配置类,但实际还是遇到一些卡点,记录下来供今后参考。

  • 1.配置Embedding模型
  • 2.特殊语法传参JSON格式
  • 3.测试Embedding有效
  • 4.修改MAX_STRING_SIZE
  • 5.配置为DeepSeek的LLM
  • 6.测试Chat和Showsql有效
1.配置Embedding模型

在同事Hysun的Text2SQL RAG开源项目中,提供了一些非常实用的配置方法,方便大家使用,本文就以此开源项目为例。
我这里Embedding模型暂时选择的是 SiliconFlow 平台提供的 BAAI/bge-large-zh-v1.5 这个模型:
  1. --使用 SiliconFlow Embedding:
  2. BEGIN
  3.   CUSTOM_SELECT_AI.CREATE_EMBEDDING_CONF(
  4.         p_conf_id     =>    'EMBEDDING',
  5.                 p_provider    =>    'OpenAI',
  6.         p_model       =>    'BAAI/bge-large-zh-v1.5',
  7.                 p_endpoint    =>    'https://api.siliconflow.cn/v1/embeddings',
  8.                 p_credential  =>    'ALFRED_SILICON_FLOW'
  9.         );
  10. END;
  11. /
复制代码
起初我直接把API Key写到了p_credential中,发现不行,但是换成自定义的ALFRED_SILICON_FLOW后,通过dbms_vector.create_credential导入时,起初以为直接传JSON格式的参数,结果是不允许的。
另外,注意这里p_conf_id的名字,以后要用到,开始我没意识到,咨询同事后才知晓这个对应关系。后来同事为了大家更好理解,还修改了帮助文档,明确做了提示。
2.特殊语法传参JSON格式

翻阅官方文档,找到这种特殊的语法,专门用于传入JSON格式。
  1. --特殊的语法,传入JSON格式方法
  2. declare
  3.   jo json_object_t;
  4. begin
  5.   jo := json_object_t();
  6.   jo.put('access_token', 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
  7.   dbms_vector.create_credential(
  8.     credential_name   => 'ALFRED_SILICON_FLOW',
  9.     params            => json(jo.to_string));
  10. end;
  11. /
复制代码
API Key已脱敏,按照你的Key实际替换即可。
配置好之后,可以通过这张表查询到:
  1. select * from CUSTOM_SELECT_AI_EMBEDDING_CONF;
复制代码
3.测试Embedding有效

使用提供的测试用例来测试Embedding有效性:
  1. --EMBEDDING接口 - 文本转向量
  2. select CUSTOM_SELECT_AI.EMBEDDING(
  3.     p_text => '将文本转成向量',
  4.     p_embedding_conf => 'EMBEDDING'
  5. );
复制代码
注意这个p_embedding_conf需要和之前创建时的p_conf_id对应,后面使用都有这个对应关系,需要特别注意下。
测试返回报错:
  1. ORA-06502: PL/SQL:值或转换错误 :  字符串缓冲区太小
  2. ORA-06512: 在 line 1
  3. https://docs.oracle.com/error-help/db/ora-06502/06502. 00000 -  "PL/SQL: value or conversion error%s"
  4. *Cause:    An arithmetic, numeric, string, conversion, or constraint error
  5.            occurred. For example, this error occurs if you attempt to
  6.            assign the value NULL to a variable declared NOT NULL, or if you
  7.            attempt to assign an integer greater than 99 to a variable
  8.            declared NUMBER(2).
  9. *Action:   To resolve the issue, change the data, the way the data is
  10.            manipulated, or the data variable declaration.
  11. *Params:   1) error_info
  12.            occurred.
复制代码
4.修改MAX_STRING_SIZE

上面的报错很明显,文档中也有提到需要设置MAX_STRING_SIZE为EXTENDED才可以。
修改的参考步骤(生产环境请慎重评估可行性):
  1. --1.查看参数当前值
  2. SHOW PARAMETER MAX_STRING_SIZE;
  3. --2.设置MAX_STRING_SIZE=EXTENDED
  4. ALTER SYSTEM SET MAX_STRING_SIZE=EXTENDED SCOPE=SPFILE;
  5. --3.关闭数据库
  6. SHUTDOWN IMMEDIATE;
  7. --4.启动upgrade模式,执行脚本
  8. STARTUP UPGRADE;
  9. @$ORACLE_HOME/rdbms/admin/utl32k.sql
  10. --5.重启数据库
  11. SHUTDOWN IMMEDIATE;
  12. STARTUP;
  13. --6.查询MAX_STRING_SIZE参数已修改
  14. SHOW PARAMETER MAX_STRING_SIZE;
复制代码
再次运行Embedding测试用例,成功返回结果。
5.配置为DeepSeek的LLM

主要用到两个CUSTOM_SELECT_AI.CREATE_PROVIDER、CUSTOM_SELECT_AI.CREATE_PROFILE。
  1. ----- Create service provider,deepseek
  2. BEGIN
  3.   CUSTOM_SELECT_AI.CREATE_PROVIDER(
  4.                 p_provider    =>    'OpenAI',
  5.                 p_endpoint    =>    'https://api.deepseek.com/chat/completions',
  6.                 p_auth        =>    'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  7.         );
  8. END;
  9. /
  10. ----- Create profile
  11. BEGIN
  12.         CUSTOM_SELECT_AI.CREATE_PROFILE(
  13.       p_profile_name    =>'HKE_DEMO',
  14.       p_description     => 'SelectAI DEMO for HKE',
  15.       p_attributes      => '{
  16.           "provider": "OpenAI",
  17.           "model" : "deepseek-chat",
  18.           "object_list": [{"owner": "TPCH", "name": "HKE_PROD_DEFECT"},
  19.                           {"owner": "TPCH", "name": "HKE_PROD_OUT_YIELD_QTY"}
  20.                           ]
  21.       }'
  22.     );
  23. END;
  24. /
复制代码
创建好之后可以查询到:
  1. --创建好的PROVIDER和PROFILE可以查询表:
  2. select * from TPCH.CUSTOM_SELECT_AI_PROVIDERS;
  3. select * from TPCH.CUSTOM_SELECT_AI_PROFILES;
复制代码
配置错误或不再需要,可以这样删除掉:
  1. --删除不再需要的PROVIDER和PROFILE:
  2. BEGIN
  3.   CUSTOM_SELECT_AI.DROP_PROVIDER(
  4.                 p_provider    =>    'OpenAI'
  5.         );
  6. END;
  7. /
  8. BEGIN
  9.   CUSTOM_SELECT_AI.DROP_PROFILE(
  10.                  p_profile_name    =>'HKE_DEMO'
  11.         );
  12. END;
  13. /
复制代码
6.测试Chat和Showsql有效

按照开源项目文档中的说明,测试Chat和Showsql功能:
  1. --CHAT接口 - 直接与 LLM 聊天
  2. select CUSTOM_SELECT_AI.CHAT(
  3.     p_profile_name  => 'HKE_DEMO',
  4.     p_user_text     => '你是谁?',
  5.     p_system_text   => '你是一个积极的、充满正能量的人工智能助手。'
  6. );
复制代码
注意:这里Chat配置好LLM应该就可以正常返回,如果报错ORA-29273,如下图所示:

  • 4-sys.utl_http.png
就需要放开对应数据库用户对具体或所有外部的访问:
  1. BEGIN
  2.     DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
  3.         host => '*',  -- 或者指定具体的域名,如 'api.example.com'
  4.         ace  => xs$ace_type(privilege_list => xs$name_list('connect'),
  5.                             principal_name => 'TPCH',
  6.                             principal_type => xs_acl.ptype_db));
  7. END;
  8. /
复制代码
继续测试Showsql功能:
  1. --SHOWSQL接口 - 自然语言生成SQL
  2. select CUSTOM_SELECT_AI.SHOWSQL(
  3.           p_profile_name => 'HKE_DEMO',
  4.     p_embedding_conf => 'EMBEDDING',
  5.           p_user_text => '查询符合条件的各YIELD小等级占比(即YIELD_QTY之和/OUT_QTY之和),条件为:公司名称为COMPANY1,工厂名称为FACTORYNAME1,产品名称为PRODUCT1。占比用百分比表示并排序,用中文别名返回。'
  6. );
复制代码
SHOWSQL需要按Demo要求导入成功表数据并向量化才OK。这里的p_embedding_conf要注意和之前配置的Embedding名字一样。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册