2
0

AITermService.php 4.1 KB

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