2
0

AITermService.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. namespace App\Services;
  3. use App\Services\OpenSearchService;
  4. use App\Services\TermService;
  5. use App\Services\OpenAIService;
  6. use App\Services\AIModelService;
  7. use App\Http\Resources\AiModelResource;
  8. use App\Http\Controllers\AuthController;
  9. use App\DTO\Search\SearchDataDTO;
  10. class AITermService
  11. {
  12. protected $pageSize = 20;
  13. protected AiModelResource $model;
  14. protected $modelService;
  15. protected $modelToken;
  16. protected $openAIService;
  17. private $sysPrompt = <<<md
  18. 请根据提供的文献搜素结果,撰写一个巴利术语的简体中文百科词条。
  19. 搜素结果是json数组
  20. 字段
  21. - title(标题)
  22. - content:(内容)
  23. - path(章节路径)
  24. - link(引用链接)
  25. 要求:
  26. 1. 参考维基百科的形式和结构
  27. 2. 所有观点必须标明巴利文出处,使用我提供的link
  28. 3. 引用巴利文原文时使用引号并斜体
  29. 4. 提供完整的参考文献列表
  30. 5. 保持学术中立性和客观性
  31. 6. 请引用我提供的全部内容,不要有任何遗漏
  32. **观点引用标准格式:**
  33. 《文献中文名》在《章节中文名》中指出/解释/说明:"巴利文原文"(中文翻译及必要说明)。(link引用链接)
  34. 如果某个观点有多个出处,请分别列出巴利文引用链接。范例
  35. 《文献中文名》在《章节中文名》中指出/解释/说明:"巴利文原文"(中文翻译及必要说明)。(link引用链接1)(link引用链接2)
  36. 示例:
  37. 《疑惑度脱新注》在《染色学处注释》中指出:"*Kiriyākiriyanti nivāsanapārupanato, kappassa anādānato kiriyākiriyaṃ*"[9](穿着下衣、披上衣是作为,不采取如法措施是不作为,故为作为-不作为)。{{para|id=202-1878|title=202-1878|style=reference}}
  38. 词条结构应包括:
  39. - 标题(术语的巴利语、字面含义)
  40. - 简短定义段落
  41. - 目录
  42. - 词源与定义
  43. - 其他的,文献中提及的内容分类
  44. - 参考文献
  45. - 相关条目
  46. - 分类标签
  47. 格式要求:
  48. - 使用Markdown格式
  49. - 标题层级清晰(#, ##, ###)
  50. - 直接输出百科正文,无需大标题
  51. - 引用格式:《文献中文名》在《章节中文名》中 + 动词 + "巴利文" + (巴利文的中文译文)(link引用链接)
  52. - 引用动词可用:指出、解释、说明、定义、描述、强调、阐述、论述等
  53. - 巴利文使用罗马转写
  54. - 关键术语首次出现时提供巴利文和中文对照
  55. 参考文献格式:
  56. [序号] 文献全称缩写, 具体章节, 标题, 段落编号
  57. md;
  58. /**
  59. * Create a new command instance.
  60. *
  61. * @return void
  62. */
  63. public function __construct(
  64. AIModelService $model,
  65. OpenAIService $openAI,
  66. ) {
  67. $this->modelService = $model;
  68. $this->openAIService = $openAI;
  69. }
  70. public function setModel($id)
  71. {
  72. $this->model = $this->modelService->getModelById($id);
  73. $this->modelToken = AuthController::getUserToken($id);
  74. }
  75. private function query(string $word): array
  76. {
  77. $search = app(OpenSearchService::class);
  78. // 组装搜索参数
  79. $params = [
  80. 'query' => $word,
  81. 'pageSize' => $this->pageSize,
  82. ];
  83. $result = $search->search($params);
  84. $dto = SearchDataDTO::fromArray($result);
  85. $res = array();
  86. foreach ($dto->hits->items as $key => $item) {
  87. $res[] = [
  88. 'title' => $item->title,
  89. 'content' => $item->content,
  90. 'path' => $item->path,
  91. 'link' => $item->getParaLink()
  92. ];
  93. }
  94. return $res;
  95. }
  96. public function create(string $id)
  97. {
  98. // 获取术语
  99. $term = app(TermService::class)->getRaw($id);
  100. // 全文搜索
  101. $query = $this->query($term->word);
  102. $res = json_encode($query, JSON_UNESCAPED_UNICODE);
  103. //LLM 生成
  104. $response = $this->openAIService->setApiUrl($this->model['url'])
  105. ->setModel($this->model['model'])
  106. ->setApiKey($this->model['key'])
  107. ->setSystemPrompt($this->sysPrompt)
  108. ->setTemperature(0.5)
  109. ->setStream(false)
  110. ->send("# 文献搜素结果\n\n{$res}\n\n" .
  111. "# 巴利术语\n\n{$term->word}\n\n");
  112. $content = $response['choices'][0]['message']['content'] ?? '';
  113. return $content;
  114. }
  115. public function update() {}
  116. }