ChatGPT | Asistente Médico con OpenAI usando Blazor y Azure Speech

Este proyecto es una aplicación de ejemplo que usa OpenAI y Azure Speech para crear un «asistente médico» inteligente. Puede responder preguntas sobre el historial médico de un paciente en lenguaje natural, muy parecido a ChatGPT pero con su propia base de conocimiento.

ChatGPT Asistente Médico

Componentes

El proyecto tiene dos componentes principales. Una API: Azure_Functions_OpenAI y un proyecto web: Blazor Web App

OpenAI QnA API

El proyecto Azure_Functions_OpenAI es una Azure Functions API que usa el OpenAI Python SDK para enviar una petición al servicio de OpenAI y devolver la respuesta

Prerequisitos

Enviar una petición al servicio de OpenAI

Usamos OpenAI Python SDK para enviar una solicitud al servicio OpenAI.

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    try:
        req_body = req.get_json()
    except ValueError:
        pass
    else:
        kbText = req_body.get('KnowledgeBaseText')
        prompt = req_body.get('Prompt')

    if prompt:

        openai.api_key = os.environ["OPENAI_API_KEY"]

        start_sequence = "\nA:"
        restart_sequence = "\n\nQ: "
        prompt_formated = kbText + "\nQ: " + prompt + start_sequence

        response = openai.Completion.create(
         model="text-davinci-003",
         prompt=prompt_formated,
         temperature=0,
         max_tokens=300,
         top_p=1,
         frequency_penalty=0,
         presence_penalty=0,
         stop=["\n"]
        )

        #If the response code is 200, then the request was successful
        if response:
            #get the response as a json object
            response_json = {"Response": response.choices[0].text.strip()}

        return func.HttpResponse(json.dumps(response_json, ensure_ascii=False), status_code=200, mimetype="application/json", charset="utf-8", headers={"Access-Control-Allow-Origin": "*"})
    else:
        return func.HttpResponse(
             "This HTTP triggered function executed successfully. Pass a prompt in the query string or in the request body for a personalized response.",
             status_code=200
        )

Ejecutar el proyecto

abra el proyecto Azure_Functions_OpenAI en VS Code, edite el archivo local.settings.json y cambie la siguiente clave con su clave de suscripción de OpenAI.

"OPENAI_API_KEY": "{OpenAI KEY}"

Puede depurar el proyecto en VS Code o abrir una terminal para ejecutar el comando:

func start

La API se ejecuta en «http://localhost:7071/api/CallQnAApi»

Probar la API

Puede probar la API con los ejemplos en el archivo sample.http usando VS Code

POST http://localhost:7071/api/CallQnAApi
Content-Type: application/json

{
  "KnowledgeBaseText": "Historial del paciente:\nNo tiene alergias a ningún medicamento\nNo tiene ninguna cirugia previa\nNo bebe alcohol\nNo fuma\nNo consume drogas\nToma medicación para la depresión\nNació el 17 de octubre de 1984\nHombre\nmide 1.75 metros\npesa 61 kilos\nTuvo un sagrado digestivo por ulceras en julio del 2022\nTuvo anemia aguda como consecuencia del sagrado digestivo de julio 2022\nEstuvo hospitalizado 3 veces por el sangrado digestivo\nRecibió 8 pintas de sangre\nTuvo covid en diciembre de 2022\nEstuvo hospitalizado por consecuencia del Covid\n",
  "Prompt": "Tiene cirugías?"
}

Pro Tip

Si está desarrollando en una arquitectura Mac M1 o ARM, debe instalar Azure Functions SDK y los requisitos en la arquitectura x86_64.

arch -x86_64 .venv/bin/python -m pip install -r requirements.txt

Blazor Web App

El proyecto Blazor_QnA_OpenAI es una aplicación Blazor WASM que solicita al usuario una pregunta (en texto o voz), usa Azure Speech SDK para convertir la voz en texto, envía la pregunta a la Azure Functions API y muestra la respuesta.

Prerequisitos

Obtenga la pregunta del usuario y envíelo a la API de Azure Functions

El código para obtener la pregunta del usuario y enviarlo a la API de Azure Functions se encuentra en el archivo: Components/CQnAOpenAI.razor

@code {
    private static string InfoPatient = "Historial del paciente:\nNombre completo: JUAN PEREZ PEREZ\nCédula: 1234512345\nNo tiene alergias a ningún medicamento\nNo tiene ninguna cirugía previa\nNo bebe alcohol\nNo fuma\nNo consume drogas\nNo tiene diabetes\nToma Escitalopram para la depresión\nNació el 17 de octubre de 1984\nHombre\nmide 1.75 metros\npesa 61 kilos\nTuvo un sagrado digestivo por úlceras en julio del 2022\nEstuvo hospitalizado por 6 días como consecuencia del sangrado en julio del 2022\nTuvo anemia aguda como consecuencia del sagrado digestivo de julio 2022\nTuvo un segundo sangrado digestivo en Octubre 2022\nEstuvo hospitalizado 2 días en cuidados intensivos por el segundo sangrado digestivo\nRecibió 8 pintas de sangre\nTuvo covid-19 en diciembre de 2022 \nEstuvo hospitalizado 4 días por consecuencia del Covid-19\n";
    private static string QnAResponse = "Respuesta del QnA: ";
    private static string StrPrompt = "Tuvo Covid?";

    private static async Task<string> CallQnAApi()
    {
        Console.WriteLine("Inicio CallQnAApi " + StrPrompt);
        var qnaApiUril = "http://localhost:7071/api/CallQnAApi";
        var qnaApiClient = new HttpClient();
        
        var qnaApiRequest = new HttpRequestMessage(HttpMethod.Post, qnaApiUril);
        qnaApiRequest.Content = new StringContent(JsonConvert.SerializeObject(new { KnowledgeBaseText = InfoPatient, Prompt = StrPrompt }), Encoding.UTF8, "application/json");
        var qnaApiResponse = await qnaApiClient.SendAsync(qnaApiRequest);
        var qnaApiResult = await qnaApiResponse.Content.ReadAsStringAsync();
        QnAResponse = qnaApiResult;
        
        return qnaApiResult;
    }

Voz a texto con Azure Speech SDK

El código para convertir la pregunta de voz a texto usa el SDK de JavaScript de Azure Speech, ya que la comunicación con el micrófono del equipo local no se puede realizar con Blazor (WebAssembly o servidor). El código está en Components/CQnAOpenAI.razor.js

export async function SpeechToTextFromMic() {
    var subscriptionKey = "{Azure Speech Suscription Key}", serviceRegion = "{Azure Speech Region}";
    var SpeechSDK;
    var playbutton;
    var resultText;
    var phraseDiv;
    var resultadoDiv;
    var recognizer;

    playbutton = document.getElementById("playbutton");
    phraseDiv = document.getElementById("txtPrompt");
    resultadoDiv = document.getElementById("txtRespuestaPaciente");    

    if (!!window.SpeechSDK) {
        SpeechSDK = window.SpeechSDK;
        playbutton.disabled = false;

    }

    window.console.log('CLIC!!!');
    var speechConfig = SpeechSDK.SpeechConfig.fromSubscription(subscriptionKey, serviceRegion);

    speechConfig.speechRecognitionLanguage = "es-MX";
    
    var audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput();

    recognizer = new SpeechSDK.SpeechRecognizer(speechConfig, audioConfig);
    phraseDiv.value = "Escuchando...";
    playbutton.disabled = true;
    
    recognizer.recognizeOnceAsync(
        function (result) {
            playbutton.disabled = false;
            if (result.reason === SpeechSDK.ResultReason.RecognizedSpeech) {
                let translation = result.text;
                window.console.log(translation);
                phraseDiv.value = translation;
                resultText = translation;
            }
            DotNet.invokeMethodAsync('BlazorWAQnAOpenAI', 'ReturnPromptAsync', resultText)
                .then(data => {
                    console.log(data);
                    resultadoDiv.value = data;
                });
            recognizer.close();
            recognizer = undefined;
        },
        function (err) {
            playbutton.disabled = false;
            phraseDiv.value = err;
            window.console.log(err);

            recognizer.close();
            recognizer = undefined;
        });

    return resultText;
}

Ejecutar el proyecto

Abra el proyecto Blazor_QnA_OpenAI en VS Code, edite el archivo CQnAOpenAI.razor.js y cambie la siguiente línea con su clave de suscripción y región de Azure Speech.

var subscriptionKey = "{Azure Speech Suscription Key}", serviceRegion = "{Azure Speech Region}";

A continuación, abra una terminal para ejecutar el comando:

dotnet watch

El proyecto se ejecuta en «http://localhost:5082»

Puede cambiar el historial del paciente ficticio y hacer cualquier pregunta sobre el historial en texto o por voz. Al igual que ChatGPT, comprenderá el lenguaje natural y le dará una respuesta.

Artículos relacionados

Azure Functions SQL Binding con Python

Machine Learning | Clasificar imágenes usando ONNX Runtime y Blazor

Los comentarios están cerrados.

Blog de WordPress.com.

Subir ↑

A %d blogueros les gusta esto: