modelService = $model; $this->sentenceService = $sent; $this->openAIService = $openAI; $this->nissayaTranslateService = $nissayaTranslate; parent::__construct(); } /** * Execute the console command. * * @return int */ public function handle() { if ($this->option('model')) { $this->model = $this->modelService->getModelById($this->option('model')); $this->info("model:{$this->model['model']}"); $this->modelToken = AuthController::getUserToken($this->model['uid']); } $this->workChannel = ChannelApi::getById($this->ask('请输入结果channel')); $books = []; if ($this->option('book')) { $books = [$this->option('book')]; } else { $books = range(1, 217); } foreach ($books as $key => $book) { $maxParagraph = PaliText::where('book', $book)->max('paragraph'); $paragraphs = range(1, $maxParagraph); if ($this->option('para')) { $paragraphs = [$this->option('para')]; } foreach ($paragraphs as $key => $paragraph) { $this->info($this->argument('type') . " {$book}-{$paragraph}"); $data = []; switch ($this->argument('type')) { case 'translation': $data = $this->aiPaliTranslate($book, $paragraph); break; case 'nissaya': $data = $this->aiNissayaTranslate($book, $paragraph); break; case 'wbw': $data = $this->aiWBW($book, $paragraph); break; default: # code... break; } $this->save($data); } } return 0; } private function getPaliContent($book, $para) { $sentenceService = app(SearchPaliDataService::class); $sentences = PaliSentence::where('book', $book) ->where('paragraph', $para) ->orderBy('word_begin') ->get(); if (!$sentences) { return null; } $json = []; foreach ($sentences as $key => $sentence) { $content = $sentenceService->getSentenceText($book, $para, $sentence->word_begin, $sentence->word_end); $id = "{$book}-{$para}-{$sentence->word_begin}-{$sentence->word_end}"; $json[] = ['id' => $id, 'content' => $content['markdown']]; } return $json; } private function aiPaliTranslate($book, $para) { $prompt = <<getPaliContent($book, $para); $originalText = "```json\n" . json_encode($pali, JSON_UNESCAPED_UNICODE) . "\n```"; Log::debug($originalText); if (!$this->model) { Log::error('model is invalid'); return []; } $startAt = time(); $response = $this->openAIService->setApiUrl($this->model['url']) ->setModel($this->model['model']) ->setApiKey($this->model['key']) ->setSystemPrompt($prompt) ->setTemperature(0.0) ->setStream(false) ->send("# pali\n\n{$originalText}\n\n"); $complete = time() - $startAt; $translationText = $response['choices'][0]['message']['content'] ?? '[]'; Log::debug("complete in {$complete}s", $translationText); $json = []; if (is_string($translationText)) { $json = LlmResponseParser::jsonl($translationText); } return $json; } private function aiWBW($book, $para) { $sysPrompt = <<where('book_id', $book) ->where('paragraph', $para) ->get(); $result = []; foreach ($sentences as $key => $sentence) { $wbw = json_decode($sentence->content); $tpl = []; foreach ($wbw as $key => $word) { if ( !empty($word->real->value) && $word->type->value !== '.ctl.' ) { $tpl[] = [ 'id' => $word->sn[0], 'original' => $word->real->value, ]; } } $tplText = json_encode($tpl, JSON_UNESCAPED_UNICODE); Log::debug($tplText); $startAt = time(); $response = $this->openAIService->setApiUrl($this->model['url']) ->setModel($this->model['model']) ->setApiKey($this->model['key']) ->setSystemPrompt($sysPrompt) ->setTemperature(0.7) ->setStream(false) ->send("```json\n{$tplText}\n```"); $complete = time() - $startAt; $content = $response['choices'][0]['message']['content'] ?? '[]'; Log::debug("ai response in {$complete}s content=" . $content); $json = LlmResponseParser::jsonl($content); $id = "{$sentence->book_id}-{$sentence->paragraph}-{$sentence->word_start}-{$sentence->word_end}"; $result[] = [ 'id' => $id, 'content' => json_encode($json, JSON_UNESCAPED_UNICODE), ]; } return $result; } private function aiNissayaTranslate($book, $para) { $sysPrompt = <<language('my') // 过滤缅文 ->where('book_id', $book) ->where('paragraph', $para) ->orderBy('strlen') ->get(); $result = []; foreach ($sentences as $key => $sentence) { $id = "{$sentence->book_id}-{$sentence->paragraph}-{$sentence->word_start}-{$sentence->word_end}"; /* $nissaya = []; $rows = explode("\n", $sentence->content); foreach ($rows as $key => $row) { if (strpos('=', $row) >= 0) { $factors = explode("=", $row); $nissaya[] = Tools::MyToRm($factors[0]) . ':' . end($factors); } else { $nissaya[] = $row; } } $nissayaText = json_encode(implode("\n", $nissaya), JSON_UNESCAPED_UNICODE); Log::debug($nissayaText); $startAt = time(); $response = $this->openAIService->setApiUrl($this->model['url']) ->setModel($this->model['model']) ->setApiKey($this->model['key']) ->setSystemPrompt($sysPrompt) ->setTemperature(0.7) ->setStream(false) ->send("# nissaya\n\n{$nissayaText}\n\n"); $complete = time() - $startAt; $content = $response['choices'][0]['message']['content'] ?? ''; Log::debug("ai response in {$complete}s content=" . $content); */ $aiNissaya = $this->nissayaTranslateService ->setModel($this->model) ->translate($sentence->content, false); Log::debug("ai response ", ['content' => $aiNissaya['data']]); $result[] = [ 'id' => $id, 'content' => json_encode($aiNissaya['data'] ?? [], JSON_UNESCAPED_UNICODE), 'content_type' => 'json' ]; } return $result; } private function save($data) { //写入句子库 $sentData = []; $sentData = array_map(function ($n) { $sId = explode('-', $n['id']); return [ 'book_id' => $sId[0], 'paragraph' => $sId[1], 'word_start' => $sId[2], 'word_end' => $sId[3], 'channel_uid' => $this->workChannel['id'], 'content' => $n['content'], 'content_type' => $n['content_type'] ?? 'markdown', 'lang' => $this->workChannel['lang'], 'status' => $this->workChannel['status'], 'editor_uid' => $this->model['uid'], ]; }, $data); foreach ($sentData as $key => $value) { $this->sentenceService->save($value); } } }