Configuración Típica de Modelos LLM para Aplicaciones de IA en Oracle

Recientemente, he estado realizando pruebas de aplicaciones de IA basadas en Oracle, y las aplicaciones de IA requieren necesariamente la configuración de modelos LLM. Aunque son configuraciones simples, encontré algunos puntos críticos que documento para futuras referencias.

    1. Configuración del modelo de Embedding
    1. Sintaxis especial para pasar parámetros en formato JSON
    1. Prueba de la funcionalidad de Embedding
    1. Modificación de MAX_STRING_SIZE
    1. Configuración del LLM de DeepSeek
    1. Prueba de las funcionalidades Chat y Showsql

1. Configuración del modelo de Embedding

En el proyecto de código abierto Text2SQL RAG del colega Hysun, se proporcionan algunos métodos de configuración muy prácticos para facilitar su uso. En este artículo, usaré este proyecto de código abierto como ejemplo.

Para el modelo de Embedding, he seleccionado inicialmente el modelo BAAI/bge-large-zh-v1.5 proporcionado por la plataforma SiliconFlow:

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

Inicialmente, intenté poner directamente la clave API en p_credential, pero no funcionó. Sin embargo, al cambiar a SILICON_FLOW_CRED personalizado, al importarlo mediatne dbms_vector.create_credential, al principio pensé que se podían pasar parámetros en formato JSON directamente, pero resultó que no estaba permitido.

Además, preste atención al nombre de p_conf_id, ya que se usará más adelante. Al principio no me di cuenta, y solo después de consultar con un colega supe sobre esta correspondencia. Más tarde, para que todos lo entendieran mejor, mi colega modificó la documentación de ayuda e hizo una aclaración explícita.

2. Sintaxis especial para pasar parámetros en formato JSON

Revisando la documentación oficial, encontré esta sintaxis especial, diseñada específicamente para pasar parámetros en formato JSON.

--Sintaxis especial para pasar parámetros en formato JSON
declare
  jo json_object_t;
begin
  jo := json_object_t();
  jo.put('access_token', 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
  dbms_vector.create_credential(
    credential_name   => 'SILICON_FLOW_CRED',
    params            => json(jo.to_string));
end;
/

La clave API está anonimizada, reemplácela con su clave real.

Una vez configurado, puede consultar a través de esta tabla:

select * from CUSTOM_SELECT_AI_EMBEDDING_CONF;

3. Prueba de la funcionalidad de Embedding

Utilice los casos de prueba proporcionados para verificar la efectividad del Embedding:

--Interfaz EMBEDDING - texto a vector
select CUSTOM_SELECT_AI.EMBEDDING(
    p_text => 'Convertir texto en vector',
    p_embedding_conf => 'EMBEDDING_CONF'
);

Tanga en cuenta que este p_embedding_conf debe corresponder con el p_conf_id creado anteriormente. Esta correspondencia se mantiene en usos posteriores, así que preste especial atención.

La prueba devolvió un error:

ORA-06502: PL/SQL: error de valor o conversión : búfer de cadena demasiado pequeño
ORA-06512: en line 1

https://docs.oracle.com/error-help/db/ora-06502/06502. 00000 -  "PL/SQL: error de valor o conversión%s"
*Causa:    Se produjo un error aritmético, numérico, de cadena, de conversión o de restricción.
           Por ejemplo, este error ocurre si intenta
           asignar el valor NULL a una variable declarada NOT NULL, o si intenta
           asignar un entero mayor que 99 a una variable
           declarada NUMBER(2).
*Acción:   Para resolver el problema, cambie los datos, la forma en que se
           manipulan los datos, o la declaración de la variable de datos.
*Parámetros:   1) error_info
           ocurrido.

4. Modificación de MAX_STRING_SIZE

El error anterior es bastante evidente, y la documentación también menciona que es necesario establecer MAX_STRING_SIZE en EXTENDED. Pasos de referencia para la modificación (evalúe cuidadosamente la viabilidad en entornos de producción):

--1. Verificar el valor actual del parámetro
SHOW PARAMETER MAX_STRING_SIZE;

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

--3. Cerrar la base de datos
SHUTDOWN IMMEDIATE;

--4. Iniciar en modo upgrade y ejecutar el script
STARTUP UPGRADE;
@$ORACLE_HOME/rdbms/admin/utl32k.sql

--5. Reiniciar la base de datos
SHUTDOWN IMMEDIATE;
STARTUP;

--6. Consultar que el parámetro MAX_STRING_SIZE ha sido modificado
SHOW PARAMETER MAX_STRING_SIZE;

Ejecute nuevamente el caso de prueeba de Embedding, y esta vez devuelve resultados exitosos.

5. Configuración del LLM de DeepSeek

Se utilizan principalmente dos procedimientos: CUSTOM_SELECT_AI.CREATE_PROVIDER y CUSTOM_SELECT_AI.CREATE_PROFILE.

----- Crear proveedor de servicios, deepseek
BEGIN
  CUSTOM_SELECT_AI.CREATE_PROVIDER(
		p_provider    =>    'OpenAI_PROVIDER',
		p_endpoint    =>    'https://api.deepseek.com/chat/completions',
		p_auth        =>    'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
	);
END;
/

----- Crear perfil
BEGIN
	CUSTOM_SELECT_AI.CREATE_PROFILE(
      p_profile_name    =>'DEMO_ORACLE',
      p_description     => 'Demo de SelectAI para Oracle',
      p_attributes      => '{
          "provider": "OpenAI_PROVIDER",
          "model" : "deepseek-chat",
          "object_list": [{"owner": "ORACLE_DEMO", "name": "PROD_DEFECTOS"},
                          {"owner": "ORACLE_DEMO", "name": "PROD_CANTIDAD_SALIDA"}
                          ]
      }'
    );
END;
/

Una vez creados, puede consultarlos:

--Los PROVIDER y PROFILE creados se pueden consultar en las tablas:
select * from ORACLE_DEMO.CUSTOM_SELECT_AI_PROVIDERS;
select * from ORACLE_DEMO.CUSTOM_SELECT_AI_PROFILES;

Si hay un error de configuración o ya no son necesarios, se pueden eliminar de la siguiente manera:

--Eliminar PROVIDER y PROFILE que ya no son necesarios:
BEGIN
  CUSTOM_SELECT_AI.DROP_PROVIDER(
		p_provider    =>    'OpenAI_PROVIDER'
	);
END;
/

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

6. Prueba de las funcionalidades Chat y Showsql

Según las instrucciones de la documentación del proyecto de código abierto, pruebe las funcionalidades Chat y Showsql:

--Interfaz CHAT - chatear directamente con el LLM
select CUSTOM_SELECT_AI.CHAT(
    p_profile_name  => 'DEMO_ORACLE',
    p_user_text     => '¿Quién eres?',
    p_system_text   => 'Eres un asistente de inteligencia artificial positivo y lleno de energía positiva.'
);

Nota: Aquí, una vez configurado el Chat con el LLM, debería devolver resultados normales. Si se produce un error ORA-29273, es necesario permitir que el usuario de la base de datos tenga acceso externo específico o general:

BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',  -- O especificar un dominio concreto, como 'api.example.com'
        ace  => xs$ace_type(privilege_list => xs$name_list('connect'),
                            principal_name => 'ORACLE_DEMO', 
                            principal_type => xs_acl.ptype_db));
END;
/

Continúe probando la funcionalidad Showsql:

--Interfaz SHOWSQL - generación de SQL en lenguaje natural
select CUSTOM_SELECT_AI.SHOWSQL(
  	p_profile_name => 'DEMO_ORACLE',
    p_embedding_conf => 'EMBEDDING_CONF',
  	p_user_text => 'Consulta el porcentaje de cada nivel de YIELD pequeño que cumple las condiciones (es decir, suma de YIELD_QTY / suma de OUT_QTY), las condiciones son: nombre de empresa es COMPANY1, nombre de fábrica es FACTORYNAME1, nombre de producto es PRODUCT1. Muestra el porcentaje con porcentaje y ordena, devuelve con alias en chino.'
);

Para que SHOWSQL funcione correctamente, es necesario importar los datos de tabla según los requisitos del demo y vectorizarlos. Preste atención a que este p_embedding_conf debe tener el mismo nombre que el Embedding configurado anteriormente.

Etiquetas: Oracle LLM IA embedding DeepSeek

Publicado el 7-5 21:23