La IA generativa se refiere a modelos de aprendizaje profundo que pueden generar texto, imágenes y otros contenidos basados en los datos con los que fueron entrenados. Puede realizar creación asistida, resumen, recomendaciones, etc. También permite enriquecer las aplicaciones empresariales, por ejemplo, generando automáticamente un borrador de una oferta de trabajo o descripción de producto, o resumiendo de forma concisa un artículo para responder a una consulta de atención al cliente.
En este blog, analizaremos el uso de OCI Generative AI para desarrollar una aplicación con tecnología de modelo grande de lenguaje (LLM). Esta aplicación utiliza prompts dinámicos, que son entradas de datos de usuarios o programas a un LLM. A diferencia de los prompts codificados, los prompts dinámicos se generan sobre la marcha, incorporando entradas de datos de usuarios, orígenes no estáticos como llamadas a la API y una cadena de plantilla fija. Utilizaremos LangChain para prompts dinámicos. Langchain permite interacciones fluidas con modelos de lenguaje, admitiendo varias funciones como plantillas de prompts, cadenas de prompts, analizadores de salida de datos e integración de múltiples componentes y recursos, como API y bases de datos. Descubre otras funciones de Langchain para crear sólidas aplicaciones de LLM.Se debe tener en cuenta que OCI Generative AI se encuentra actualmente en su versión Beta.
Arquitectura
Consideremos un caso de uso práctico. Por ejemplo, crear una aplicación que genere descripciones de vacantes basadas en entradas dinámicas como competencias, cargos, años de experiencia y responsabilidades laborales. En el siguiente diagrama se muestra la arquitectura de referencia.
Esta arquitectura utiliza los siguientes componentes:
OCI Generative AI (versión beta) es un servicio totalmente gestionado que proporciona LLM personalizables. Puedes utilizar el playground para probar los modelos preentrenados listos para usar, o crear y alojar tus propios modelos personalizados ajustados según tus datos en clústeres de IA dedicados.
OCI Functions es una plataforma de funciones como servicio totalmente gestionada, multi-inquilino, altamente escalable y bajo demanda.
OCI API Gateway te permite publicar API con terminales privados a los que se puede acceder desde la red y que se pueden exponer con direcciones IP públicas si deseas que acepten tráfico de Internet.
Visual Builder es una herramienta de desarrollo de aplicaciones basada en exploradores que te permite crear e implementar interfaces web, móviles y progresivas.
Pasos
Ten en cuenta que debes agregar las políticas de Identity and Access Management (IAM) necesarias para que varios servicios de Oracle Cloud Infrastructure funcionen juntos.
1. OCI Generative AI proporciona un conjunto de modelos fundamentales previamente entrenados. Puedes seleccionar el modelo básico en playground para probar y acotar las peticiones de datos y los parámetros. Una vez ya estés satisfecho con los resultados, copia el código generado en el playground para incrustarlo en la aplicación. Puedes probar los prompts estáticos en el playground y cambiarlos más tarde a los prompts dinámicos en el código.
A continuación, se muestra una descripción del uso del playground para probar los prompts y obtener el código de muestra.
Para ilustrarlo, el playground de OCI Generative AI, como se muestra en la siguiente imagen, permite a los usuarios seleccionar un modelo y configurar parámetros para sus prompts. La opción ‘Ver código’ permite ver el código generado automáticamente para ejecutar el prompt mediante los SDK de OCI Generative AI.
2. El siguiente paso es crear una OCI Function que utiliza el código generado automáticamente por OCI Generative AI obtenido del playground.
Para empezar, crea una aplicación de OCI Function y define los parámetros de configuración de la aplicación, el punto final de servicio de OCI Generative AI y el OCID del compartimento Generative AI. Estos parámetros se utilizarán en el código de Function.
A continuación, crea una OCI Function de python,fn_genai_jobdescription.
func.yaml
Copy code snippet
Copied to Clipboard
Error: Could not Copy
Copied to Clipboard
Error: Could not Copy
schema_version: 20180708
name: fn_genai_jobdescription
version: 0.0.251
runtime: python
build_image: fnproject/python:3.8-dev
run_image: fnproject/python:3.8
entrypoint: /python/bin/fdk /function/func.py handler
memory: 2048
El contenido de func.py se muestra en las siguientes secciones.
Importar los módulos necesarios
Copy code snippet
Copied to Clipboard
Error: Could not Copy
Copied to Clipboard
Error: Could not Copy
import io
import json
import logging
import os
import oci.auth.signers
import oci.generative_ai
from langchain.prompts import PromptTemplate
from fdk import response
Lee el punto final de servicio y OCID de compartimento de OCI Generative AI de los parámetros de Function Application. Define las entidades de recurso de firmante y establece GenerativeAiClient.
Copy code snippet
Copied to Clipboard
Error: Could not Copy
Copied to Clipboard
Error: Could not Copy
try:
endpoint = os.getenv("SERVICE_ENDPOINT")
compartment_ocid = os.getenv("COMPARTMENT_OCID")
if not endpoint:
raise ValueError("ERROR: Missing configuration key SERVICE_ENDPOINT")
if not compartment_ocid:
raise ValueError("ERROR: Missing configuration key COMPARTMENT_OCID")
signer = oci.auth.signers.get_resource_principals_signer()
generative_ai_client = oci.generative_ai.GenerativeAiClient(config={}, service_endpoint=endpoint, signer=signer,
retry_strategy=oci.retry.NoneRetryStrategy())
except Exception as e:
logging.getLogger().error(e)
raise
Utiliza plantillas de prompts de Langchain para crear un prompt dinámico. Para simplificar las cosas, supongamos que el usuario introducirá todas las variables de los prompts. Las opciones para definir las variables dinámicas son varias, por ejemplo, la entrada puede ser una respuesta de la API de REST, una llamada de SQL de base de datos, etc.
Inicializar oci.generative_ai.models.GenerateTextDetails() con el prompt, los parámetros de LLM, etc. y llamar al método generate_text() para generar el texto de salida.
Las variables de entrada a la plantilla de prompt son competencias, cargo, experiencia y calificaciones.
Copy code snippet
Copied to Clipboard
Error: Could not Copy
Copied to Clipboard
Error: Could not Copy
def generate_job_description(skills, role, experience, qualifications,generative_ai_client):
prompt = PromptTemplate(
input_variables=["skills", "role", "experience","qualifications"],
template="Generate a job description with skills {skills} for a role {role} having experience of {experience}. The qualifications expected from the candidate are {qualifications}"
)
generate_text_detail = oci.generative_ai.models.GenerateTextDetails()
prompts = [prompt.format(skills=skills, role=role, experience=experience,qualifications=qualifications)]
generate_text_detail.prompts = prompts
generate_text_detail.serving_mode = oci.generative_ai.models.OnDemandServingMode(model_id="cohere.command")
generate_text_detail.compartment_id = compartment_ocid
generate_text_detail.max_tokens = 300
generate_text_detail.temperature = 0.7
generate_text_detail.frequency_penalty = 0
generate_text_detail.top_p = 0.75
try:
generate_text_response = generative_ai_client.generate_text(generate_text_detail)
text_response = json.loads(str(generate_text_response.data))
return text_response["generated_texts"][0][0]["text"]
except Exception as e:
logging.getLogger().error(e)
raise
Por último, define el método gestión de Function().
Copy code snippet
Copied to Clipboard
Error: Could not Copy
Copied to Clipboard
Error: Could not Copy
def handler(ctx, data: io.BytesIO = None):
try:
body = json.loads(data.getvalue())
skills = body["skills"]
role = body["role"]
experience = body["experience"]
job_description = generate_job_description(skills, role, experience, generative_ai_client)
return response.Response(ctx, response_data=job_description)
except Exception as handler_error:
logging.getLogger().error(handler_error)
return response.Response(
ctx,
status_code=500,
response_data="Processing failed due to " + str(handler_error)
)
Despliega la Function, mediante
Copy code snippet
Copied to Clipboard
Error: Could not Copy
Copied to Clipboard
Error: Could not Copy
fn -v deploy --app <function application="" name=""></function>
3. Expón la función utilizando API Gateway.
Crea un despliegue de API Gateway.
Crea una nueva ruta (Route). Introduce una ruta, un método como POST y selecciona un tipo de back-end como Function.
Selecciona la función fn_genai_jobdescription como la función que se debe invocar.
Anota la URL de despliegue. Se utilizará en la configuración de Service Connection dentro de Visual Builder.
La llamada de API de REST de muestra que utiliza la URL de despliegue de gateway de API tendrá el siguiente aspecto.
Copy code snippet
Copied to Clipboard
Error: Could not Copy
Copied to Clipboard
Error: Could not Copy
curl --location 'https://af...t3ea.apigateway.us-ashburn-1.oci.customer-oci.com/genai/generatejobdescription' --header 'Content-Type: application/json' --data '{"skills":"java,spring","experience":"3+ year","role":"developer","responsibilities":"Analyzing user requirements to inform application design.Developing and testing software."}'
Visual Builder
1. Crea una conexión de servicio al punto final de API Gateway tal como se muestra a continuación.
2. Crea una página con campos de entrada como competencias, cargo, años de experiencia, responsabilidades del puesto y un botón con una cadena de acción que invoque al punto final de conexión de servicio.
3. Al hacer clic en el botón Generar, se invocará a OCI Generative AI para generar una descripción del trabajo basada en los valores proporcionados en la entrada Competencias, Experiencia, Cargo y Responsabilidades.
Conclusión
Las aplicaciones que se pueden crear combinando OCI Generative AI, Langchain y otros servicios de OCI son ilimitadas: ¡suelta tu creatividad y explora las vastas posibilidades que tienes por delante!