AiTaskPrepare.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace App\Http\Api;
  3. use App\Models\Task;
  4. use App\Models\PaliText;
  5. use App\Models\PaliSentence;
  6. use App\Models\AiModel;
  7. use App\Http\Api\Mq;
  8. use Illuminate\Support\Facades\Log;
  9. class AiTaskPrepare
  10. {
  11. /**
  12. * 读取task信息,将任务拆解为单句小任务
  13. *
  14. * @param string $taskId 任务uuid
  15. * @return array 拆解后的提示词数组
  16. */
  17. public static function translate(string $taskId)
  18. {
  19. $task = Task::findOrFail($taskId);
  20. $description = $task->description;
  21. $rows = explode("\n", $description);
  22. $params = [];
  23. foreach ($rows as $key => $row) {
  24. if (strpos($row, '=') !== false) {
  25. $param = explode('=', trim($row, '|'));
  26. $params[$param[0]] = $param[1];
  27. }
  28. }
  29. if (!isset($params['type'])) {
  30. return false;
  31. }
  32. //get sentences in article
  33. $sentences = array();
  34. $totalLen = 0;
  35. switch ($params['type']) {
  36. case 'sentence':
  37. if (!isset($params['id'])) {
  38. return false;
  39. }
  40. $sentences[] = explode('-', $params['id']);
  41. break;
  42. case 'para':
  43. if (!isset($params['book']) || !isset($params['paragraphs'])) {
  44. return false;
  45. }
  46. $sent = PaliSentence::where('book', $params['book'])
  47. ->where('paragraph', $params['paragraphs'])->orderBy('word_begin')->get();
  48. foreach ($sent as $key => $value) {
  49. $sentences[] = [
  50. 'id' => [
  51. $value->book,
  52. $value->paragraph,
  53. $value->word_begin,
  54. $value->word_end,
  55. ],
  56. 'strlen' => $value->length
  57. ];
  58. $totalLen += $value->length;
  59. }
  60. break;
  61. case 'chapter':
  62. if (!isset($params['book']) || !isset($params['para'])) {
  63. return false;
  64. }
  65. $chapterLen = PaliText::where('book', $params['book'])
  66. ->where('paragraph', $params['para'])->value('chapter_len');
  67. $sent = PaliSentence::where('book', $params['book'])
  68. ->whereBetween('paragraph', [$params['para'], $params['para'] + $chapterLen - 1])
  69. ->orderBy('paragraph')
  70. ->orderBy('word_begin')->get();
  71. foreach ($sent as $key => $value) {
  72. $sentences[] = [
  73. 'id' => [
  74. $value->book,
  75. $value->paragraph,
  76. $value->word_begin,
  77. $value->word_end,
  78. ],
  79. 'strlen' => $value->length
  80. ];
  81. $totalLen += $value->length;
  82. }
  83. break;
  84. default:
  85. return false;
  86. break;
  87. }
  88. //render prompt
  89. $mdRender = new MdRender([
  90. 'format' => 'prompt',
  91. 'footnote' => false,
  92. 'paragraph' => false,
  93. ]);
  94. $m = new \Mustache_Engine(array(
  95. 'entity_flags' => ENT_QUOTES,
  96. 'escape' => function ($value) {
  97. return $value;
  98. }
  99. ));
  100. # ai model
  101. $aiModel = AiModel::findOrFail($task->executor_id);
  102. $aiPrompts = [];
  103. $sumLen = 0;
  104. foreach ($sentences as $key => $sentence) {
  105. $sumLen += $sentence['strlen'];
  106. $sid = implode('-', $sentence['id']);
  107. Log::debug($sid);
  108. $data['pali'] = '{{' . $sid . '}}';
  109. if (isset($params['nissaya'])) {
  110. $data['nissaya'] = '{{' . $sid . '@' . $params['nissaya'] . '}}';
  111. }
  112. $content = $m->render($description, $data);
  113. $prompt = $mdRender->convert($content, []);
  114. $aiPrompts[] = $prompt;
  115. //gen mq
  116. $aiMqData = [
  117. 'model' => $aiModel,
  118. 'task' => [
  119. 'task_id' => $taskId,
  120. 'progress' => [
  121. 'current' => $sumLen,
  122. 'total' => $totalLen
  123. ],
  124. ],
  125. 'prompt' => $prompt,
  126. 'sentence' => [
  127. 'book_id' => $sentence['id'][0],
  128. 'paragraph' => $sentence['id'][1],
  129. 'word_start' => $sentence['id'][2],
  130. 'word_end' => $sentence['id'][3],
  131. 'channel_uid' => $params['channel'],
  132. 'content' => $prompt,
  133. 'content_type' => 'markdown',
  134. 'access_token' => $params['token'],
  135. ],
  136. ];
  137. Mq::publish('ai_translate', $aiMqData);
  138. }
  139. return $aiPrompts;
  140. }
  141. }