kofdai commited on
Commit
3350c9d
·
verified ·
1 Parent(s): ac81430

Upload deepseek_prompt_templates.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. deepseek_prompt_templates.py +148 -0
deepseek_prompt_templates.py ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import requests
3
+ import json
4
+
5
+ # 設計書で定義されたDeepSeek R1用のプロンプトテンプレート
6
+ MEDICAL_KNOWLEDGE_GENERATION_PROMPT = """
7
+ You are a medical knowledge expert. Your task is to generate verified medical knowledge
8
+ for the Ilm-Athens system.
9
+
10
+ 【生成タスク】
11
+ トピック: {topic}
12
+ 対象読者: {audience_level} # beginner/intermediate/expert
13
+ 言語: Japanese
14
+
15
+ 【出力形式】
16
+ 1. <思考プロセス> セクション
17
+ - なぜこの情報が重要か
18
+ - 関連する医学的概念
19
+ - 証拠となる事実やメカニズム
20
+
21
+ 2. <最終回答> セクション
22
+ - 明確で簡潔な説明
23
+ - 医学的根拠の明示
24
+ - 不確実性があれば明記
25
+
26
+ 3. <参考資料> セクション
27
+ - 学術論文
28
+ - 臨床ガイドライン
29
+ - 教科書参照
30
+
31
+ 【重要な指示】
32
+ - Chain of Thoughtを詳細に展開してください
33
+ - 仮説と事実を明確に区別してください
34
+ - 確実性レベルを明示してください(確実/可能性あり/投機的)
35
+ - 現在の医学知識の限界も記載してください
36
+
37
+ トピック: {topic}
38
+ """
39
+
40
+ class DeepSeekLocalAPI:
41
+ """
42
+ ローカルで実行されているDeepSeekモデル(例: deepseek-r1 32b)への
43
+ APIリクエストを管理するクラス。
44
+ """
45
+ def __init__(self, api_base_url="http://localhost:8080/v1"):
46
+ """
47
+ Args:
48
+ api_base_url (str): ローカルLLM APIのエンドポイント。
49
+ 環境に合わせて変更してください。
50
+ """
51
+ self.api_base_url = api_base_url
52
+ self.headers = {"Content-Type": "application/json"}
53
+
54
+ def generate(self, prompt: str, thinking_length_tokens: int = 8000, max_tokens: int = 3000):
55
+ """
56
+ ローカルのDeepSeekモデルにリクエストを送信し、思考プロセスと最終回答を取得します。
57
+
58
+ Note: このメソッドは、一般的なローカルLLMサーバー(LM Studio, vLLMなど)の
59
+ OpenAI互換エンドポイントを想定しています。
60
+ ご使用の環境のAPI仕様に合わせてペイロードの調整が必要になる場合があります。
61
+ また、DeepSeek R1特有の<thinking>タグを正しく出力させるための
62
+ 特別なパラメータが必要な場合があります。
63
+ """
64
+
65
+ # OpenAI互換API用のペイロード例
66
+ data = {
67
+ "model": "local-model", # モデル名はサーバー設定に依存
68
+ "messages": [{"role": "user", "content": prompt}],
69
+ "max_tokens": max_tokens + thinking_length_tokens,
70
+ "temperature": 0.7,
71
+ # 'thinking_length_tokens'のようなカスタムパラメータはサーバーに依存します。
72
+ # ここでは単純にmax_tokensに含めています。
73
+ }
74
+
75
+ try:
76
+ response = requests.post(
77
+ f"{self.api_base_url}/chat/completions",
78
+ headers=self.headers,
79
+ data=json.dumps(data)
80
+ )
81
+ response.raise_for_status()
82
+
83
+ response_data = response.json()
84
+ full_text = response_data['choices'][0]['message']['content']
85
+
86
+ # <思考プロセス>と<最終回答>を分離する(仮の実装)
87
+ thinking_part = ""
88
+ response_part = ""
89
+
90
+ if "<思考プロセス>" in full_text and "<最終回答>" in full_text:
91
+ thinking_start = full_text.find("<思考プロセス>") + len("<思考プロセス>")
92
+ thinking_end = full_text.find("</思考プロセス>") if "</思考プロセス>" in full_text else full_text.find("<最終回答>")
93
+ thinking_part = full_text[thinking_start:thinking_end].strip()
94
+
95
+ response_start = full_text.find("<最終回答>") + len("<最終回答>")
96
+ response_end = full_text.find("</最終回答>") if "</最終回答>" in full_text else len(full_text)
97
+ response_part = full_text[response_start:response_end].strip()
98
+ else:
99
+ # タグが見つからない場合は、暫定的に全体をレスポンスとする
100
+ response_part = full_text
101
+
102
+ return {
103
+ "thinking": thinking_part,
104
+ "response": response_part,
105
+ "raw_response": full_text
106
+ }
107
+
108
+ except requests.exceptions.RequestException as e:
109
+ print(f"APIリクエスト中にエラーが発生しました: {e}")
110
+ return {
111
+ "thinking": "",
112
+ "response": f"Error: {e}",
113
+ "raw_response": ""
114
+ }
115
+
116
+ # --- 使用例 ---
117
+ if __name__ == "__main__":
118
+ # ユーザーはこのURLを自身のローカル環境に合わせて変更する必要があります。
119
+ LOCAL_API_URL = "http://localhost:8080/v1"
120
+
121
+ deepseek_api = DeepSeekLocalAPI(api_base_url=LOCAL_API_URL)
122
+
123
+ topic = "心筋梗塞の急性期診断アルゴリズム"
124
+ audience_level = "intermediate" # 医学生~若手医師向け
125
+
126
+ prompt = MEDICAL_KNOWLEDGE_GENERATION_PROMPT.format(
127
+ topic=topic,
128
+ audience_level=audience_level
129
+ )
130
+
131
+ print("--- 生成AIに送信するプロンプト ---")
132
+ print(prompt)
133
+ print("\n--- ローカルAPIからのレスポンス待機中... ---")
134
+
135
+ # 実際にAPIを叩く
136
+ # response_data = deepseek_api.generate(prompt=prompt)
137
+
138
+ # このスクリプト単体でテストするためのダミーレスポンス
139
+ response_data = {
140
+ 'thinking': 'まず、心筋梗塞の定義から始めます。これは心筋への血流が途絶えることで心筋が壊死する状態です。次に、診断のゴールドスタンダードであるトロポニン測定について考慮します。これは~という理由で重要です。さらに心電図の変化も重要な所見です。ST上昇が見られる場合、緊急性が高いと判断されます。',
141
+ 'response': '急性心筋梗塞は、迅速な診断と治療が求められる救急疾患です。診断は主に、臨床症状(胸痛など)、心電図変化(ST上昇など)、心筋逸脱酵素(特にトロポニン)の上昇を三本柱として行われます。アルゴリズムとしては、まず疑いがあれば直ちに12誘導心電図を記録し、バイタルサインを確認します。ST上昇があれば、緊急カテーテル治療の適応を考慮します。<参考資料> 日本循環器学会ガイドライン2023',
142
+ 'raw_response': '<思考プロセス>まず、心筋梗塞の定義から始めます。これは心筋への血流が途絶えることで心筋が壊死する状態です。次に、診断のゴールドスタンダードであるトロポニン測定について考慮します。これは~という理由で重要です。さらに心電図の変化も重要な所見です。ST上昇が見られる場合、緊急性が高いと判断されます。</思考プロセス>\n<最終回答>急性心筋梗塞は、迅速な診断と治療が求められる救急疾患です。診断は主に、臨床症状(胸痛など)、心電図変化(ST上昇など)、心筋逸脱酵素(特にトロポニン)の上昇を三本柱として行われます。アルゴリズムとしては、まず疑いがあれば直ちに12誘導心電図を記録し、バイタルサインを確認します。ST上昇があれば、緊急カテーテル治療の適応を考慮します。<参考資料> 日本循環器学会ガイドライン2023</最終回答>'
143
+ }
144
+
145
+
146
+ print("\n--- APIからのレスポンス ---")
147
+ print(f"思考プロセス: {response_data['thinking']}")
148
+ print(f"最終回答: {response_data['response']}")