feature: chatbot
This commit is contained in:
157
app/Services/OpenAIService.php
Normal file
157
app/Services/OpenAIService.php
Normal file
@@ -0,0 +1,157 @@
|
||||
<?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');
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user