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

最近在做一些基于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 这个模型:

--使用 SiliconFlow Embedding:
BEGIN
  CUSTOM_SELECT_AI.CREATE_EMBEDDING_CONF(
        p_conf_id     =>    'EMBEDDING',
		p_provider    =>    'OpenAI',
        p_model       =>    'BAAI/bge-large-zh-v1.5',
		p_endpoint    =>    'https://api.siliconflow.cn/v1/embeddings',
		p_credential  =>    'ALFRED_SILICON_FLOW'
	);
END;
/

起初我直接把API Key写到了p_credential中,发现不行,但是换成自定义的ALFRED_SILICON_FLOW后,通过dbms_vector.create_credential导入时,起初以为直接传JSON格式的参数,结果是不允许的。

另外,注意这里p_conf_id的名字,以后要用到,开始我没意识到,咨询同事后才知晓这个对应关系。后来同事为了大家更好理解,还修改了帮助文档,明确做了提示。

2.特殊语法传参JSON格式

翻阅官方文档,找到这种特殊的语法,专门用于传入JSON格式。

--特殊的语法,传入JSON格式方法
declare
  jo json_object_t;
begin
  jo := json_object_t();
  jo.put('access_token', 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
  dbms_vector.create_credential(
    credential_name   => 'ALFRED_SILICON_FLOW',
    params            => json(jo.to_string));
end;
/

API Key已脱敏,按照你的Key实际替换即可。

配置好之后,可以通过这张表查询到:

select * from CUSTOM_SELECT_AI_EMBEDDING_CONF;

3.测试Embedding有效

使用提供的测试用例来测试Embedding有效性:

--EMBEDDING接口 - 文本转向量
select CUSTOM_SELECT_AI.EMBEDDING(
    p_text => '将文本转成向量',
    p_embedding_conf => 'EMBEDDING'
);

注意这个p_embedding_conf需要和之前创建时的p_conf_id对应,后面使用都有这个对应关系,需要特别注意下。

测试返回报错:

ORA-06502: PL/SQL:值或转换错误 :  字符串缓冲区太小
ORA-06512: 在 line 1

https://docs.oracle.com/error-help/db/ora-06502/06502. 00000 -  "PL/SQL: value or conversion error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if you attempt to
           assign the value NULL to a variable declared NOT NULL, or if you
           attempt to assign an integer greater than 99 to a variable
           declared NUMBER(2).
*Action:   To resolve the issue, change the data, the way the data is
           manipulated, or the data variable declaration.
*Params:   1) error_info
           occurred.

4.修改MAX_STRING_SIZE

上面的报错很明显,文档中也有提到需要设置MAX_STRING_SIZE为EXTENDED才可以。
修改的参考步骤(生产环境请慎重评估可行性):

--1.查看参数当前值
SHOW PARAMETER MAX_STRING_SIZE;

--2.设置MAX_STRING_SIZE=EXTENDED
ALTER SYSTEM SET MAX_STRING_SIZE=EXTENDED SCOPE=SPFILE;

--3.关闭数据库
SHUTDOWN IMMEDIATE;

--4.启动upgrade模式,执行脚本
STARTUP UPGRADE;
@$ORACLE_HOME/rdbms/admin/utl32k.sql

--5.重启数据库
SHUTDOWN IMMEDIATE;
STARTUP;

--6.查询MAX_STRING_SIZE参数已修改
SHOW PARAMETER MAX_STRING_SIZE;

再次运行Embedding测试用例,成功返回结果。

5.配置为DeepSeek的LLM

主要用到两个CUSTOM_SELECT_AI.CREATE_PROVIDER、CUSTOM_SELECT_AI.CREATE_PROFILE。

----- Create service provider,deepseek
BEGIN
  CUSTOM_SELECT_AI.CREATE_PROVIDER(
		p_provider    =>    'OpenAI',
		p_endpoint    =>    'https://api.deepseek.com/chat/completions',
		p_auth        =>    'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
	);
END;
/

----- Create profile
BEGIN
	CUSTOM_SELECT_AI.CREATE_PROFILE(
      p_profile_name    =>'HKE_DEMO',
      p_description     => 'SelectAI DEMO for HKE',
      p_attributes      => '{
          "provider": "OpenAI",
          "model" : "deepseek-chat",
          "object_list": [{"owner": "TPCH", "name": "HKE_PROD_DEFECT"},
                          {"owner": "TPCH", "name": "HKE_PROD_OUT_YIELD_QTY"}
                          ]
      }'
    );
END;
/

创建好之后可以查询到:

--创建好的PROVIDER和PROFILE可以查询表:
select * from TPCH.CUSTOM_SELECT_AI_PROVIDERS;
select * from TPCH.CUSTOM_SELECT_AI_PROFILES;

配置错误或不再需要,可以这样删除掉:

--删除不再需要的PROVIDER和PROFILE:
BEGIN
  CUSTOM_SELECT_AI.DROP_PROVIDER(
		p_provider    =>    'OpenAI'
	);
END;
/

BEGIN
  CUSTOM_SELECT_AI.DROP_PROFILE(
		 p_profile_name    =>'HKE_DEMO'
	);
END;
/

6.测试Chat和Showsql有效

按照开源项目文档中的说明,测试Chat和Showsql功能:

--CHAT接口 - 直接与 LLM 聊天
select CUSTOM_SELECT_AI.CHAT(
    p_profile_name  => 'HKE_DEMO',
    p_user_text     => '你是谁?',
    p_system_text   => '你是一个积极的、充满正能量的人工智能助手。'
);

注意:这里Chat配置好LLM应该就可以正常返回,如果报错ORA-29273,如下图所示:

  • 4-sys.utl_http.png

就需要放开对应数据库用户对具体或所有外部的访问:

BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',  -- 或者指定具体的域名,如 'api.example.com'
        ace  => xs$ace_type(privilege_list => xs$name_list('connect'),
                            principal_name => 'TPCH', 
                            principal_type => xs_acl.ptype_db));
END;
/

继续测试Showsql功能:

--SHOWSQL接口 - 自然语言生成SQL
select CUSTOM_SELECT_AI.SHOWSQL(
  	p_profile_name => 'HKE_DEMO',
    p_embedding_conf => 'EMBEDDING',
  	p_user_text => '查询符合条件的各YIELD小等级占比(即YIELD_QTY之和/OUT_QTY之和),条件为:公司名称为COMPANY1,工厂名称为FACTORYNAME1,产品名称为PRODUCT1。占比用百分比表示并排序,用中文别名返回。'
);

SHOWSQL需要按Demo要求导入成功表数据并向量化才OK。这里的p_embedding_conf要注意和之前配置的Embedding名字一样。

原创作者: jyzhao 转载于: https://www.cnblogs.com/jyzhao/p/18791288/oracle-ai-ying-yong-dellm-mo-xing-dian-xing-pei-zh
### 将大型语言模型 (LLM) 与 Oracle 数据库集成 为了使 LLM 能够有效地与 Oracle 数据库交互,通常采用中间件或框架作为桥梁。一种有效的方法是利用 Python 生态中的 `SQLAlchemy` 和 `LangChain` 库,特别是其中的 `SQLDatabaseChain` 功能[^2]。 #### 使用 SQLAlchemy 建立连接 首先,安装必要的依赖包: ```bash pip install sqlalchemy cx_Oracle langchain ``` 接着,在代码中配置数据库连接字符串,并创建会话对象以便后续操作: ```python from sqlalchemy import create_engine, MetaData import cx_Oracle dsn_tns = cx_Oracle.makedsn('host', 'port', service_name='service_name') engine = create_engine(f'oracle+cx_oracle://username:password@{dsn_tns}') metadata = MetaData(bind=engine) connection = engine.connect() ``` 这段代码初始化了一个指向特定 Oracle 实例的引擎实例,并建立了实际的网络链接[^1]。 #### 构建基于 LangChain 的 SQL 查询链路 有了上述的基础设置之后,就可以构建一个能够解析自然语言命令并将其转换成针对目标数据库的有效 SQL 请求的工作流了。这里的关键在于定义好 `SQLDatabaseChain` 对象及其参数: ```python from langchain.chains.sql_database.base import SQLDatabaseChain from langchain.llms.openai import OpenAI llm = OpenAI(model="text-davinci-003") # 或者其他支持的语言模型API接口 db_chain = SQLDatabaseChain.from_llm(llm=llm, database_url=f'oracle+cx_oracle://username:password@{dsn_tns}', metadata=metadata) ``` 此时已经准备好接收用户的自然语言指令,并自动执行相应的查询动作。 #### 执行查询请求 当一切准备就绪后,可以通过简单的函数调用来发起一次完整的对话过程: ```python result = db_chain.run("告诉我最近一周内销售额最高的产品是什么?") print(result) ``` 这行代码发送了一条关于销售业绩的问题给到由 LLM 驱动的服务端程序,后者负责解释这句话的意思并将它转化为合适的 SQL 表达式去检索所需的信息[^3]。 通过这种方式,不仅简化了开发人员编写复杂查询语句的过程,同时也提高了最终用户体验的质量——他们只需要说出自己想要知道的内容即可获得答案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值