FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Hola Casimiro, pues mira, compilar compila sin errores y se ejecuta pero en esta linea:
Código:
TJSONArray *a = (TJSONArray*) o->Get("choices")->JsonValue; Código:
First chance exception at $00A4B668. Exception class $C0000005 with message 'access violation at 0x00a4b668: read of address 0x0000000c'. Process Promto.exe (12412) |
#2
|
|||
|
|||
bueno he estado toqueteando y añadiendo unas cosas y de momento me funciona aunque lo que no tengo terminado es el formateado de la respuesta (ya que le he puesto un RETURN antes de llegar a la parte esa del final ..... pero le he preguntado "que es un terabyte" y me ha dado la respuesta asi:
Código:
{ "id": "chatcmpl-8zp2KRCrbycZgIpcsr5D6xgbDp3y1", "object": "chat.completion", "created": 1709744884, "model": "gpt-3.5-turbo-0125", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "Un terabyte es una unidad de almacenamiento de información equivalente a 1 billón de bytes, o 1,000 gigabytes. Es una medida de capacidad de almacenamiento de datos utilizada comúnmente en la informática y la tecnologÃ*a de la información. Un terabyte es una cantidad muy grande de almacenamiento y es comúnmente utilizado para almacenar grandes cantidades de datos como archivos multimedia, bases de datos o copias de seguridad." }, "logprobs": null, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 12, "completion_tokens": 94, "total_tokens": 106 }, "system_fingerprint": "fp_b9d4cef803" } Asi que aqui os dejo el codigo que me funciona en Rad Studio C++ Builder 12 Architect por si os pudiese servir Código:
try { TNetHeaders AuthHeader; AuthHeader.Length = 2; AuthHeader[0] = TNameValuePair("Authorization", "Bearer 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"); AuthHeader[1] = TNameValuePair("Content-Type", "application/json"); TMemoryStream *salida = new TMemoryStream(); TMemoryStream *entrada = new TMemoryStream(); TMemo *memo = new TMemo(Form6); memo->Parent = Form6; memo->Visible = false; memo->Lines->Clear(); String ASAux = EPregunta->Text; char dest[200]; UnicodeToUtf8(dest, 200, EPregunta->Text.c_str(), 200); ASAux = dest; TJSONObject *inputObject = new TJSONObject(); inputObject->AddPair("model", "gpt-3.5-turbo"); // Construir el array de mensajes TJSONArray *messagesArray = new TJSONArray(); TJSONObject *messageObject = new TJSONObject(); messageObject->AddPair("role", "system"); messageObject->AddPair("content", "You are a helpful assistant."); messageObject->AddPair("role", "user"); messageObject->AddPair("content", "que es un terabyte"); messagesArray->Add(messageObject); // Agregar el array de mensajes al objeto de entrada inputObject->AddPair("messages", messagesArray); memo->Lines->Add(inputObject->ToString()); memo->Lines->SaveToStream(salida); salida->Position = soFromBeginning; NetHTTPC1->Post("h_t_t_p_s://api.openai.com/v1/chat/completions", salida, entrada, AuthHeader); memo->Lines->Clear(); memo->Lines->LoadFromStream(entrada); delete salida; delete entrada; TJSONObject *o = (TJSONObject*) TJSONObject::ParseJSONValue(TEncoding::ANSI->GetBytes(memo->Lines->Text), 0); Memo1->Lines->Add(memo->Lines->Text); return; //Tened en cuenta que esta es la parte que he "cropeado" y aun no he ajustado para que salga pre-formateado TJSONArray *a = (TJSONArray*) o->GetValue("choices"); TJSONObject *book = (TJSONObject*) a->Items[0]; Memo1->Lines->Clear(); ASAux = book->Pairs[0]->JsonValue->ToString(); ASAux = StringReplace(ASAux, "\\n\\n", sLineBreak, TReplaceFlags() << rfReplaceAll); ASAux = StringReplace(ASAux, "\\n", sLineBreak, TReplaceFlags() << rfReplaceAll); Memo1->Lines->Add(ASAux); o->Free(); memo->Free(); } catch (...) { ShowMessage("Error accediendo a los servicios IA de HFocused"); } porque llevamos intentando integrar esto de las preguntas a GPTChat en la app varios dias y pffff..... no teneis ni idea del tute de probar mil cosas que llevo |
#3
|
|||
|
|||
Codigo Final de la funcion Consulta a ChatGPT
Os dejo aqui el codigo como lo he dejado al final en Rad Studio 12
tened en cuenta a la hora de adaptarlo para vuestra app, que uso un EditBox llamado EPregunta, un Memo llamado Memo1 (para las respuestas) y mi formulario es el Form6 y tened en cuenta que aunque yo uso AddText en el memo, es porque en realidad es un TMSRichEditor ... en un Memo standard seria Memo->Lines->Add("el texto que sea"); y el uso de la funcion Utf8ToAnsi al enviar el query....es debido a que si no, el ChatGPT como le pongas una Ñ o algun caracter especial que no entienda bien, cascara con un error en el envio de la consulta y de la misma manera el uso de Utf8ToAnsi en la respuesta, hace que convierta los caracteres especiales a nuestra codepage local, (acentos, eñes etc) Código:
/// Recordad los include de cabecera //////////////////////////////////////////////////// #include <vcl.h> #include <System.Classes.hpp> #include <System.Net.URLClient.hpp> #include <windows.h> #include <System.JSON.hpp> #include <System.SysUtils.hpp> /// Y esto en el onclick del boton que por ejemplo usemos para enviar la consulta ////////////////////////////////////////////////////////////////////////////////////////////////////// try { TNetHeaders AuthHeader; AuthHeader.Length = 2; AuthHeader[0] = TNameValuePair("Authorization", "Bearer TU_API_KEY"); AuthHeader[1] = TNameValuePair("Content-Type", "application/json"); TMemoryStream *salida = new TMemoryStream(); TMemoryStream *entrada = new TMemoryStream(); TMemo *memo = new TMemo(Form6); memo->Parent = Form6; memo->Visible = false; memo->Lines->Clear(); String ASAux = EPregunta->Text; char dest[200]; UnicodeToUtf8(dest, 200, EPregunta->Text.c_str(), 200); ASAux = dest; TJSONObject *inputObject = new TJSONObject(); inputObject->AddPair("model", "gpt-3.5-turbo"); // Construir el array de mensajes TJSONArray *messagesArray = new TJSONArray(); TJSONObject *messageObject = new TJSONObject(); messageObject->AddPair("role", "system"); messageObject->AddPair("content", "You are a helpful assistant."); messageObject->AddPair("role", "user"); messageObject->AddPair("content", Utf8ToAnsi(EPregunta->Text)); messagesArray->Add(messageObject); // Agregar el array de mensajes al objeto de entrada inputObject->AddPair("messages", messagesArray); memo->Lines->Add(inputObject->ToString()); memo->Lines->SaveToStream(salida); salida->Position = soFromBeginning; NetHTTPC1->Post("h_t_t_p_s://api.openai.com/v1/chat/completions", salida, entrada, AuthHeader); memo->Lines->Clear(); memo->Lines->LoadFromStream(entrada); delete salida; delete entrada; TJSONObject *o = (TJSONObject*) TJSONObject::ParseJSONValue(TEncoding::ANSI->GetBytes(memo->Lines->Text), 0); //Como soy muy ceporro y no me aclaro de como extraer el content de los Json, lo he apañado asi :D ////////////////////////////////////////////////////////////////////////////////////////////////// AnsiString A,B, respuesta; int i; A=memo->Lines->Text; i=A.AnsiPos("content"); B=A.SubString(i+10,A.Length()); i=B.AnsiPos("}"); respuesta = B.SubString(0, i-1); respuesta = StringReplace(respuesta, "\\n\\n", sLineBreak, TReplaceFlags() << rfReplaceAll); respuesta = StringReplace(respuesta, "\\n", sLineBreak, TReplaceFlags() << rfReplaceAll); //////////////////////////////////////////////////////////////////////////////////////////////// Memo1->AddText("\r\n \r\n"); Memo1->AddText(Utf8ToAnsi(respuesta)); return; o->Free(); memo->Free(); } catch (...) { ShowMessage("Error accediendo a los servicios IA de HFocused"); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
#4
|
|||
|
|||
si alguien pudiese ayudarme con el tema de extraer el content de la respuesta del ChatGPT del JSON, porque yo es que esos malditos JSON me vuelven medio loco
y ya de paso, el otro problema es el siguiente, el RichEdit donde lo muestro resulta que los caracteres de \r y \n no los reconoce como saltos de linea etc y me veo en la texitura de tener que analizar la cadena para cuando encuentre esos caracteres ejecute la funcion de linebreak desde el codigo (que se cual es) pero ando un poco espesito a la hora de codificar esa funcion |
#5
|
|||
|
|||
formateando la respuesta de ChatGPT en nuestra funcion de consulta a ChatGPT
Me las he ingeniado para crear la funcion que formatea los saltos de linea y las comillas en la respuesta de ChatGPT
Tened en cuenta que esto afecta a cuando nos da codigo fuente de ejemplo porque podria ser que el codigo ponga algo asi como "printf("numero %d\n <---esto!!!", variable);" y en el mensaje que nos muestra en el RichEdit haria el salto de linea (esta es una particularidad que estoy mirando como hacer para discernir cuando ChatGPT me envia codigo fuente de ejemplo y de esa manera diferenciarlo pero bueno, os paso el codigo de como ha quedado la funcion que tengo para lo de Consulta a ChatGPT recordad que el Memo1 es en realidad un TMSRichEdit y el "c+1" que hace con la cadena cuando empieza el bucle, es porque si empezamos por 0 en la posicion del AnsiString da "Range Error" Código:
try { TNetHeaders AuthHeader; AuthHeader.Length = 2; AuthHeader[0] = TNameValuePair("Authorization", "Bearer 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"); AuthHeader[1] = TNameValuePair("Content-Type", "application/json"); TMemoryStream *salida = new TMemoryStream(); TMemoryStream *entrada = new TMemoryStream(); TMemo *memo = new TMemo(Form6); memo->Parent = Form6; memo->Visible = false; memo->Lines->Clear(); String ASAux = EPregunta->Text; char dest[200]; UnicodeToUtf8(dest, 200, EPregunta->Text.c_str(), 200); ASAux = dest; //memo->Lines->Add("{\"model\": \"gpt-3.5-turbo\", \"Messages\": \"role\": \"system\" \"content\": \"Actua como un Experto\" \"role\": \"user\" \"content\": \"" + ASAux + "\", \"temperature\": 0, \"max_tokens\": 1000}"); TJSONObject *inputObject = new TJSONObject(); inputObject->AddPair("model", "gpt-3.5-turbo"); // Construir el array de mensajes TJSONArray *messagesArray = new TJSONArray(); TJSONObject *messageObject = new TJSONObject(); messageObject->AddPair("role", "system"); messageObject->AddPair("content", "You are a helpful assistant."); messageObject->AddPair("role", "user"); messageObject->AddPair("content", Utf8ToAnsi(EPregunta->Text)); messagesArray->Add(messageObject); // Agregar el array de mensajes al objeto de entrada inputObject->AddPair("messages", messagesArray); memo->Lines->Add(inputObject->ToString()); memo->Lines->SaveToStream(salida); salida->Position = soFromBeginning; NetHTTPC1->Post("https://api.openai.com/v1/chat/completions", salida, entrada, AuthHeader); memo->Lines->Clear(); memo->Lines->LoadFromStream(entrada); delete salida; delete entrada; TJSONObject *o = (TJSONObject*) TJSONObject::ParseJSONValue(TEncoding::ANSI->GetBytes(memo->Lines->Text), 0); //Como soy muy ceporro y no me aclaro de como extraer el content de los Json, lo he apañado asi :D ////////////////////////////////////////////////////////////////////////////////////////////////// AnsiString A,B, respuesta; int i, f; A=memo->Lines->Text; i=A.AnsiPos("content"); B=A.SubString(i+10,A.Length()); i=B.AnsiPos("}"); respuesta = B.SubString(0, i-3); ////////////////////////////////////////////////////////////////////////////////////////////////////////// //////// Y aqui formateamos la respuesta para hacer que los saltos de linea salgan en el TMSRichEdit /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// AnsiString respuesta_formateada = " - "; Memo1->AddLineBreak(); Memo1->AddLineBreak(); Memo1->AddImage("gpt_icon.png" , 40, 40); //Esto es un iconcito de chatGPT para darle mejor aspecto a lo que imprime ///// Imprimimos la pregunta para saber a que se refiere la respuesta ///////////////////////////////////////////////////////////////////////////////////////////////////////////// Memo1->AddText(Utf8ToAnsi(EPregunta->Text), clGreen, clBlack); Memo1->AddLineBreak(); Memo1->AddLineBreak(); for(int c=0; c < respuesta.Length(); ++c) { if(respuesta[c+1] == '\\') { if(respuesta[c+2] == 'n' || respuesta[c+2] == 'r' ) { // Imprimimos el texto precedente y el salto de linea en el RichEdit Memo1->AddText(Utf8ToAnsi(respuesta_formateada)); Memo1->AddLineBreak(); respuesta_formateada = ""; c = c+3; } if(respuesta[c+2] == '"') { respuesta_formateada = respuesta_formateada + respuesta[c+2]; respuesta_formateada = respuesta_formateada + " "; c = c+1; } } else { //Seguimos almacenando la respuesta respuesta_formateada = respuesta_formateada + respuesta[c+1]; } } //Imprimimos lo restante de la respuesta Memo1->AddText(Utf8ToAnsi(respuesta_formateada)); o->Free(); memo->Free(); } catch (...) { ShowMessage("Error accediendo a los servicios IA de HFocused"); } Última edición por navbuoy fecha: 13-03-2024 a las 23:27:07. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Integrar ChatGPT en aplicación C++ Builder | chenech | Trucos | 1 | 20-02-2023 21:16:20 |
CSFML en Rad Studio 10.0 Seattle (o en C++ Builder en general) | Snaked | C++ Builder | 3 | 24-11-2016 04:40:32 |
Como consultar si existe una tabla desde el componente Query de C++ Builder | MARX | C++ Builder | 3 | 06-08-2016 20:42:38 |
Consultar movimientos bancarios utilizando servicios rest | EL WINDSURFISTA | Internet | 2 | 11-02-2016 09:57:56 |
Consumir servicios rest desde c++ builder 6 | JM1985 | C++ Builder | 3 | 20-01-2016 08:40:07 |
|