185 lines
7.6 KiB
PHP
185 lines
7.6 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use OpenAI;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
class OpenAIService
|
|
{
|
|
protected $client;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->client = OpenAI::client(env('OPENAI_API_KEY'));
|
|
}
|
|
|
|
public function generateGeneralText($prompt, $mainContent)
|
|
{
|
|
$response = $this->client->chat()->create([
|
|
'model' => 'gpt-4o-mini',
|
|
'messages' => [
|
|
[
|
|
'role' => 'system',
|
|
'content' => "You are an expert assistant. Your task is to generate a concise response based on the provided prompt and main content.
|
|
|
|
Guidelines:
|
|
- Summarize the key points in exactly 5 bullet points.
|
|
- Ensure the response is clear and relevant to the prompt.
|
|
- Use simple and professional language."
|
|
],
|
|
['role' => 'user', 'content' => "Prompt: $prompt \nMain Content: $mainContent"],
|
|
],
|
|
]);
|
|
|
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
|
}
|
|
|
|
public function generateClassifyMainContent($prompt, $mainContent)
|
|
{
|
|
$response = $this->client->chat()->create([
|
|
'model' => 'gpt-4o-mini',
|
|
'messages' => [
|
|
[
|
|
'role' => 'system',
|
|
'content' => "You are an expert assistant in classifying questions based on whether their answers must be retrieved from a database or can be explained generally.
|
|
Your task is to return one of the following two labels:
|
|
- \"DATABASE\" → If the question requires specific data that can only be obtained from a database.
|
|
- \"GENERAL\" → If the question can be answered without accessing a database.
|
|
|
|
Consider the following context: \"$mainContent\"
|
|
|
|
Respond with only one of the labels: \"DATABASE\" or \"GENERAL\"."
|
|
],
|
|
['role' => 'user', 'content' => $prompt],
|
|
],
|
|
]);
|
|
|
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
|
}
|
|
|
|
public function generateQueryBasedMainContent($prompt, $mainContent)
|
|
{
|
|
// Load file JSON
|
|
$jsonPath = public_path('templates/contentTemplatePrompt.json'); // Sesuaikan path
|
|
$jsonData = json_decode(file_get_contents($jsonPath), true);
|
|
|
|
// Periksa apakah kategori ada dalam JSON
|
|
if (!isset($jsonData[$mainContent])) {
|
|
return "Template prompt tidak ditemukan.";
|
|
}
|
|
|
|
// Ambil template berdasarkan kategori
|
|
$promptTemplate = $jsonData[$mainContent]['prompt'];
|
|
|
|
$response = $this->client->chat()->create([
|
|
'model' => 'gpt-4o-mini',
|
|
'messages' => [
|
|
['role' => 'system', 'content' => $promptTemplate],
|
|
['role' => 'user', 'content' => $prompt],
|
|
],
|
|
]);
|
|
|
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
|
}
|
|
|
|
|
|
public function validateSyntaxQuery($queryResponse)
|
|
{
|
|
$response = $this->client->chat()->create([
|
|
'model' => 'gpt-4o-mini',
|
|
'messages' => [
|
|
[
|
|
'role' => 'system',
|
|
'content' => "You are a MariaDB SQL expert. Your task is to validate the syntax of an SQL query to ensure it follows proper MariaDB syntax rules.
|
|
|
|
Guidelines:
|
|
- Check for any syntax errors, missing keywords, or incorrect clause usage.
|
|
- Ensure the query is well-structured and adheres to best practices.
|
|
- Verify that all SQL keywords are used correctly and in the right order.
|
|
- If the query is valid, respond with: \"VALID\".
|
|
- If the query has issues, respond with: \"INVALID\".
|
|
|
|
Always respond with either \"VALID\" or \"INVALID\"."
|
|
],
|
|
['role' => 'user', 'content' => $queryResponse],
|
|
],
|
|
]);
|
|
|
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
|
}
|
|
|
|
public function generateNLPFromQuery($inputUser, $resultQuery) {
|
|
$response = $this->client->chat()->create([
|
|
'model' => 'gpt-4o-mini',
|
|
'messages' => [
|
|
[
|
|
'role' => 'system',
|
|
'content' => "You are an expert assistant. Your task is to analyze the database query results and transform them into a human-readable answer based on the user's question.
|
|
|
|
Guidelines:
|
|
- Understand the user's question and extract the key intent.
|
|
- Summarize or format the query results to directly answer the user's question.
|
|
- Ensure the response is clear, concise, and relevant.
|
|
- If the query result is empty or does not match the question, provide a polite response indicating that no data is available.
|
|
|
|
Always provide a well-structured response that makes sense based on the input question."
|
|
],
|
|
['role' => 'user', 'content' => "User's question: $inputUser \nDatabase result: $resultQuery"],
|
|
],
|
|
]);
|
|
|
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
|
}
|
|
|
|
public function generateFinalText($nlpResult) {
|
|
$response = $this->client->chat()->create([
|
|
'model' => 'gpt-4o-mini',
|
|
'messages' => [
|
|
[
|
|
'role' => 'system',
|
|
'content' => "You are an expert text formatter. Your task is to take the given NLP result and format it into a structured, human-readable text suitable for rendering inside an HTML <div>.
|
|
|
|
Guidelines:
|
|
- Preserve the meaning and clarity of the content.
|
|
- Use proper line breaks for readability.
|
|
- If the text contains lists, convert them into bullet points.
|
|
- Emphasize important keywords using <strong> tags if necessary.
|
|
- Ensure the response remains clean and concise without extra explanations."
|
|
],
|
|
['role' => 'user', 'content' => "Here is the NLP result that needs formatting:\n\n$nlpResult"],
|
|
],
|
|
]);
|
|
|
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
|
}
|
|
|
|
public function mainGenerateText($prompt) {
|
|
$response = $this->client->chat()->create([
|
|
'model' => 'gpt-4o-mini',
|
|
'messages' => [
|
|
[
|
|
'role' => 'system',
|
|
'content' => "You are an expert assistant with deep knowledge in multiple fields, including programming, data science, and business strategy. Provide clear, concise, and accurate responses."
|
|
],
|
|
[
|
|
'role' => 'user',
|
|
'content' => $prompt
|
|
],
|
|
],
|
|
]);
|
|
|
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
|
}
|
|
|
|
// 1. Buat fungsi untuk akses data advertisements
|
|
// 2. Buat fungsi untuk akses data business_or_industries
|
|
// 3. Buat fungsi untuk akses data customers
|
|
// 4. Buat fungsi untuk akses data pbg_task
|
|
// 5. Buat fungsi untuk akses data pbg_task_retribution
|
|
// 6. Buat fungsi untuk akses data spatial_plannings
|
|
// 7. Buat fungsi untuk akses data tourisms
|
|
// 8. Buat fungsi untuk akses data umkms
|
|
|
|
}
|