Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
PHAN Xuan Quang committed Sep 11, 2024
1 parent 089e0e7 commit 2d27f3b
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 67 deletions.
2 changes: 1 addition & 1 deletion Entities/Conversation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{
public class Conversation
{
public List<History> ChatHistory { get; set; } = new List<History>();
public List<History> ChatHistory { get; set; } = [];
public required string Question { get; set; }

public class History
Expand Down
20 changes: 9 additions & 11 deletions Events/ChatScope.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,27 +19,25 @@ public static async Task<string> GenerateAnswer(string apiKey, Conversation conv
.Select(message => new Content
{
Role = message.FromUser ? "user" : "model",
Parts = new List<Part>
{
new Part
{
Parts =
[
new() {
Text = message.Message.Trim(),
}
}
]
})
.ToList()
};

var question = new Content
{
Role = "user",
Parts = new List<Part>
{
new Part
{
Parts =
[
new() {
Text = conversation.Question.Trim()
}
}
]
};

request.Contents.Add(question);
Expand Down Expand Up @@ -71,7 +69,7 @@ public static async Task<string> GenerateAnswer(string apiKey, Conversation conv
Message = "Bắt đầu!"
};

return new List<Conversation.History>() { prompt, botReply };
return [prompt, botReply];
}
}
}
68 changes: 43 additions & 25 deletions Events/QuizScope.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ public static async Task<List<Quiz>> GenerateQuizes(string apiKey, string topic,
.AsParallel()
.OrderBy(x => Guid.NewGuid())
.Take(questionsCount)
.Select(q => new Quiz
{
Question = q.Question.Replace("**", "'"),
Options = q.Options.Select(o => o.Replace("**", "'")).ToList(),
RightOptionIndex = q.RightOptionIndex,
ExplanationInVietnamese = q.ExplanationInVietnamese.Replace("**", "'"),
})
.ToList();
}

Expand All @@ -52,55 +59,66 @@ private static async Task<List<Quiz>> GenerateQuizesByType(string apiKey, string
var userLevel = GeneralHelper.GetEnumDescription(level);
var type = GeneralHelper.GetEnumDescription(quizzType);

promptBuilder.AppendLine($"Bạn là một giáo viên dạy tiếng Anh với hơn 20 năm kinh nghiệm. Tôi là người đang học tiếng Anh, trình độ tiếng Anh của tôi theo tiêu chuẩn CEFR là {userLevel}. ");
promptBuilder.Append($"Hãy cho tôi một bộ câu hỏi trắc nghiệm tiếng Anh bao gồm từ {questionsCount} đến {questionsCount + 5} câu hỏi liên quan đến chủ đề '{topic.Trim()}' để luyện tập. ");
promptBuilder.Append("Nội dung câu hỏi không được vượt quá trình độ tiếng Anh của tôi. ");
promptBuilder.Append($"Bạn phải đảm bảo mỗi câu hỏi trong bộ đề trắc nghiệm chỉ được phép có 4 lựa chọn với duy nhất 1 lựa chọn đúng, và bộ câu hỏi trắc nghiệm phải thuộc loại câu hỏi: {type}");
promptBuilder.AppendLine("Output là một mảng JSON tương ứng với class C# sau: ");
promptBuilder.AppendLine($"You are an English teacher with over 20 years of experience. My English level according to the CEFR standard is {userLevel}. ");
promptBuilder.Append($"Please provide a set of multiple-choice English questions consisting of {questionsCount} to {questionsCount + 5} questions related to the topic '{topic.Trim()}' for practice. ");
promptBuilder.Append("The content of the questions should not exceed my English level. ");
promptBuilder.Append($"Each question in the quiz should have only 4 options with exactly 1 correct choice, and the quiz should be of the type: {type}");
promptBuilder.AppendLine("Return an empty array if the topic is meaningless, or cannot be determined, or cannot be understood.");
promptBuilder.AppendLine("The output should be a JSON array corresponding to the following C# class: ");
promptBuilder.AppendLine("class Quiz");
promptBuilder.AppendLine("{");
promptBuilder.AppendLine(" string Question; // Nội dung câu hỏi bằng tiếng Anh, hãy chắc chắn rằng nó phù hợp với trình độ của tôi");
promptBuilder.AppendLine(" List<string> Options; // 4 lựa chọn cho người dùng chọn, hãy chắc chắn rẳng nội dung của các lựa chọn không được trùng nhau, và chỉ có duy nhất 1 lựa chọn đúng");
promptBuilder.AppendLine(" int RightOptionIndex; // Index của lựa chọn đúng trong mảng Options, bạn phải đảm bảo rằng đây là index của lựa chọn chính xác và hợp lý nhất cho câu hỏi (index có giá trị tối thiểu là 0 và giá trị tối đa là 3");
promptBuilder.AppendLine(" string ExplanationInVietnamese; // Lời giải thích một cách dễ hiểu và hợp lý, phù hợp với trình độ tiếng Anh của tôi");
promptBuilder.AppendLine(" string Question; // The question content in English, ensure it matches my level");
promptBuilder.AppendLine(" List<string> Options; // 4 choices for the user to select, ensure that the options are distinct, and there is only 1 correct option for the question.");
promptBuilder.AppendLine(" int RightOptionIndex; // Index of the correct option in the 'Options' array, ensure this is the index of the most accurate and reasonable choice for the question (index range is from 0 to 3)");
promptBuilder.AppendLine(" string ExplanationInVietnamese; // Short explanation in Vietnamese in a clear and reasonable manner, suitable for my English level");
promptBuilder.AppendLine("}");
promptBuilder.AppendLine("Ví dụ về output mà tôi cần:");
promptBuilder.AppendLine("In order to help to do the task more correctly and effectively, here is an example of the response I want:");
promptBuilder.AppendLine("[");
promptBuilder.AppendLine(" {");
promptBuilder.AppendLine(" \"Question\": \"Nội dung câu hỏi 1\",");
promptBuilder.AppendLine(" \"Options\": [\"Option1\", \"Option2\", \"Option3\", \"Option4\"],");
promptBuilder.AppendLine(" \"Question\": \"Question content no. 1\",");
promptBuilder.AppendLine(" \"Options\": [\"Option 1\", \"Option 2\", \"Option 3\", \"Option 4\"],");
promptBuilder.AppendLine(" \"RightOptionIndex\": 0,");
promptBuilder.AppendLine(" \"ExplanationInVietnamese\": \"Lời giải thích cho đáp án đúng\"");
promptBuilder.AppendLine(" \"ExplanationInVietnamese\": \"The short explanation for the correct answer in Vietnamese\"");
promptBuilder.AppendLine(" },");
promptBuilder.AppendLine(" {");
promptBuilder.AppendLine(" \"Question\": \"Nội dung câu hỏi 2\",");
promptBuilder.AppendLine(" \"Options\": [\"Option1\", \"Option2\", \"Option3\", \"Option4\"],");
promptBuilder.AppendLine(" \"RightOptionIndex\": 1,");
promptBuilder.AppendLine(" \"ExplanationInVietnamese\": \"Lời giải thích cho đáp án đúng\"");
promptBuilder.AppendLine(" \"Question\": \"Question content no. 2\",");
promptBuilder.AppendLine(" \"Options\": [\"Option 1\", \"Option 2\", \"Option 3\", \"Option 4\"],");
promptBuilder.AppendLine(" \"RightOptionIndex\": 2,");
promptBuilder.AppendLine(" \"ExplanationInVietnamese\": \"The short explanation for the correct answer in Vietnamese\"");
promptBuilder.AppendLine(" }");
promptBuilder.AppendLine("]");
promptBuilder.AppendLine("Nếu chủ đề được input một thứ vô nghĩa hoặc không thể khác định hoặc không thể hiểu được, hãy trả về một mảng rỗng.");
promptBuilder.AppendLine("The output:");

var response = await Generator.GenerateContent(apiKey, promptBuilder.ToString(), true, 50, GenerativeModel.Gemini_15_Flash);
return JsonConvert.DeserializeObject<List<Quiz>>(response).ToList();
var response = await Generator.GenerateContent(apiKey, promptBuilder.ToString(), true, 50);
return [.. JsonConvert.DeserializeObject<List<Quiz>>(response)];
}
catch
{
return new List<Quiz>();
return [];
}
}

public static async Task<List<string>> SuggestTopcis(string apiKey, EnglishLevel level)
{
var promptBuilder = new StringBuilder();
var userLevel = GeneralHelper.GetEnumDescription(level);

promptBuilder.AppendLine($"Bạn là một giáo viên dạy tiếng Anh với hơn 20 năm kinh nghiệm và bạn đang giảng dạy tại Việt Nam. Trình độ tiếng Anh của tôi theo tiêu chuẩn CEFR là {userLevel}.");
promptBuilder.Append($"Tôi đang tìm kiếm những chủ đề thú vị để luyện tập tiếng Anh phù hợp với trình độ hiện tại của bản thân, đồng thời cũng muốn có thêm hứng thú để học tập.");
promptBuilder.AppendLine("Hãy đề xuất cho tôi ít nhất 40 topic ngắn bằng tiếng Anh mà bạn cảm thấy phù hợp nhất và thú vị nhất để luyện tập tiếng Anh.");
promptBuilder.Append("Danh sách chủ đề mà bạn đề xuất phải là một mảng đối lượng JSON tương ứng với kiểu dữ liệu List<string> của ngôn ngữ lập trình C#.");
promptBuilder.AppendLine($"You are an IELTS teacher with over 20 years of experience, teaching in Vietnam. My English level according to the CEFR standard is {userLevel}.");
promptBuilder.Append($"I am looking for interesting topics to practice English that match my current level, and I also want to have more motivation for learning.");
promptBuilder.AppendLine("Please suggest at least 40 short topics in English that you think are most suitable and interesting for practicing English.");
promptBuilder.Append("The list of suggested topics should be a JSON array corresponding to the List<string> data type in C# programming language.");
promptBuilder.AppendLine("In order to help you to do the task more correctly and more effectively, here is an example of the response I want:");
promptBuilder.AppendLine("[");
promptBuilder.AppendLine(" \"Topic 1\",");
promptBuilder.AppendLine(" \"Topic 2\",");
promptBuilder.AppendLine(" \"Topic 3\",");
promptBuilder.AppendLine(" \"Topic 4\"");
promptBuilder.AppendLine("]");
promptBuilder.Append("Your response:");

var response = await Gemini.Generator.GenerateContent(apiKey, promptBuilder.ToString(), true, 75);
return JsonConvert.DeserializeObject<List<string>>(response);
}

}
}
2 changes: 1 addition & 1 deletion Events/ReviewScope.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public static async Task<Comment> GenerateReview(string apiKey, EnglishLevel lev
promptBuilder.AppendLine(" \"GeneralComment\": \"Đây là nhận xét chung cho bài viết của tôi, hãy nhớ là phải sử dụng tiếng Việt\",");
promptBuilder.AppendLine(" \"ImprovedContent\": \"Đây là bài viết đã được sửa chữa dựa trên nhận xét trong phần GeneralComment.\"");
promptBuilder.AppendLine("}");
promptBuilder.AppendLine("Nếu bài viết của tôi là một thứ vô nghĩa hoặc không thể khác định hoặc không thể hiểu được, GenerateComment sẽ mang giá trị 'Không thể nhận xét' và ImprovedContent mang giá trị ''.");
promptBuilder.AppendLine("Nếu bài viết của tôi là một thứ vô nghĩa hoặc không thể khác định hoặc không thể hiểu được, GenerateComment sẽ mang giá trị 'Không thể nhận xét' và ImprovedContent mang giá trị ''");
promptBuilder.AppendLine("Nội dung bài viết của tôi: ");
promptBuilder.AppendLine($"{content.Trim()}");

Expand Down
2 changes: 1 addition & 1 deletion Gemini/Generator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace Gemini
{
public static class Generator
{
private static readonly HttpClient Client = new HttpClient();
private static readonly HttpClient Client = new();

public static async Task<string> GenerateContent(string apiKey, string query, bool useJson = true, double creativeLevel = 50, GenerativeModel model = GenerativeModel.Gemini_15_Flash)
{
Expand Down
23 changes: 6 additions & 17 deletions Helper/GeneralHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public static ushort GetTotalWords(string input)
return 0;
}

char[] delimiters = { ' ', '\r', '\n', '\t', '.', ',', ';', ':', '!', '?' };
char[] delimiters = [' ', '\r', '\n', '\t', '.', ',', ';', ':', '!', '?'];

string[] words = input.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);

Expand All @@ -41,32 +41,21 @@ public static bool IsEnglish(string input)
return input.All(c => englishAlphabetAndPunctuation.Contains(c) || char.IsWhiteSpace(c) || char.IsDigit(c));
}

public static List<int> GenerateRandomNumbers(int x, int y)
public static List<int> GenerateRandomNumbers(int totalQuizTypes, int totalQuizzes)
{
// Nếu số phần tử lớn hơn tổng hoặc tổng nhỏ hơn x thì không thể tạo ra danh sách hợp lệ.
if (x > y)
{
throw new ArgumentException("Không thể tạo danh sách có tổng bằng y với số phần tử lớn hơn y.");
}

// Khởi tạo danh sách
var rand = new Random();
var result = new List<int>();

// Bắt đầu bằng cách gán giá trị 1 cho mỗi phần tử để đảm bảo chúng đều là số dương
int sum = x; // Tối thiểu mỗi phần tử là 1, do đó tổng ban đầu là x.
for (int i = 0; i < x; i++)
for (int i = 0; i < totalQuizTypes; i++)
{
result.Add(1); // Tạo x phần tử đều bằng 1
result.Add(1);
}

// Phân phối phần còn lại (y - x) vào các phần tử ngẫu nhiên trong danh sách
int remaining = y - x;
int remaining = totalQuizzes - totalQuizTypes;

while (remaining > 0)
{
// Chọn ngẫu nhiên một chỉ số để tăng giá trị
int index = rand.Next(0, x);
int index = rand.Next(0, totalQuizTypes);
result[index]++;
remaining--;
}
Expand Down
18 changes: 7 additions & 11 deletions Helper/ImageOptimizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,16 @@ public static class ImageOptimizer
{
public static async Task<string> GetOptimizedBase64VersionOf(MemoryStream stream)
{
using (var image = await Image.LoadAsync(stream))
using var image = await Image.LoadAsync(stream);
var encoder = new JpegEncoder
{
var encoder = new JpegEncoder
{
Quality = 70
};
Quality = 70
};

using (var outputStream = new MemoryStream())
{
await image.SaveAsync(outputStream, encoder);
using var outputStream = new MemoryStream();
await image.SaveAsync(outputStream, encoder);

return Convert.ToBase64String(outputStream.ToArray());
}
}
return Convert.ToBase64String(outputStream.ToArray());
}
}
}

0 comments on commit 2d27f3b

Please sign in to comment.