探索基於 Qwen2-5 實現 DeepSeek 推理的奇妙之旅

作爲一名互聯網技術愛好者,我一直對大型語言模型和高效推理技術充滿熱情。本文基於基於 Qwen2.5 實現 DeepSeek 推理功能。

本文使用 unsloth 框架,這個輕量高效、易於上手的工具,加上 SFT 中文數據集的加持,測試了在醫療領域的推理應用。

當然,過程中還遇到了諸如 GRPO 等新概念的挑戰與啓示,這一切都讓我對整個系統有了更深的認識。接下來,我就以親歷者的角度,帶大家走進這個既枯燥又充滿樂趣的技術世界。

Qwen2.5 模型簡介

Qwen2.5 是近年來備受矚目的大語言模型之一。相較於傳統模型,它在語義理解、生成能力以及推理效率上都有明顯提升。作爲一個以中文爲主要應用場景的模型,Qwen2.5 在處理複雜語言任務時表現得遊刃有餘。我的初衷正是希望藉助這一強大的模型,爲實現 DeepSeek 推理功能提供堅實的底層支撐。

在實際使用過程中,我發現 Qwen2.5 不僅能夠快速響應,還具備一定的自適應能力。尤其是在面對專業領域——如醫療場景——的應用時,它表現出的邏輯嚴謹性和數據敏感性,讓人不得不對其刮目相看。當然,這背後離不開大規模預訓練和精心設計的架構。

DeepSeek 推理功能概述

DeepSeek 是一種新興的推理功能,其核心目標是實現對輸入數據的高效、準確解析,並基於模型預訓練的知識進行深度推理。簡單來說,DeepSeek 的優勢在於它不僅能回答常見問題,還能通過複雜的邏輯鏈條,推斷出更爲隱含的信息。說白了,就是讓模型不僅會 “答題”,還會 “思考”。

在項目中,我利用 DeepSeek 實現了醫療領域內的一系列推理任務。在醫療診斷中形成一個較爲完整的推理鏈條,從而輔助醫生進行診斷決策。整個過程既考驗模型本身的語言理解能力,也對後端推理算法提出了挑戰。

unsloth 框架的選擇與優勢

談到技術實現,就不得不提 unsloth 框架。這款框架雖然名字聽起來 “懶散”,但實際上它專爲高併發、低延遲的推理任務而設計。以下幾點是我選擇 unsloth 框架的重要原因:

高效性:unsloth 框架在處理大規模併發請求時表現穩定,並且在資源利用率上做了諸多優化。對於我這樣需要實時推理的系統來說,這無疑是一個大優勢。

易擴展性:框架的模塊化設計使得我可以根據實際需求靈活調整架構。例如,在後期需要增加新的推理策略時,只需輕微改動即可。

兼容性:unsloth 框架與 Qwen2.5 等主流大語言模型兼容性極高,這爲我後續的調試和優化提供了極大的便利。

在實際開發過程中,我曾遇到一些資源瓶頸的問題,正是依靠 unsloth 的靈活擴展能力,我才能快速定位問題並進行相應的調整。

本次使用的數據集簡介

數據是人工智能的燃料。在醫療領域,精確的中文數據尤爲關鍵。

FreedomIntelligence/medical-o1-reasoning-SFT 中文數據集正是在這種背景下應運而生。它包含了大量經過精細標註的醫療案例和推理路徑,使得模型在進行醫療相關推理時能夠借鑑真實場景下的數據邏輯。

我在項目中採用該數據集進行微調,目的是讓 Qwen2.5 不僅具備通用的語言理解能力,更能深入理解醫學術語和專業知識。數據集的豐富性和多樣性爲模型提供了足夠的訓練樣本,從而提升了其在醫療場景下的表現。

事實上,經過這一輪微調後,我發現模型在面對複雜病症描述時,給出的推理結果更加合理且具有說服力。

數據集地址 (本次我們使用的是中文數據集):

https://huggingface.co/datasets/FreedomIntelligence/medical-o1-reasoning-SFT/viewer/zh

實現代碼

01

環境準備

%%capture
# 該魔法命令用於在 Jupyter Notebook中隱藏輸出
# 避免輸出干擾執行結果,例如 `pip install` 過程中的信息
# 安裝 Unsloth 和 vLLM 這兩個庫
!pip install unsloth vllm
# 升級 Pillow(Python Imaging Library),確保使用最新版本
!pip install --upgrade pillow
from unsloth import FastLanguageModel, PatchFastRL  
# 從 unsloth 庫中導入 FastLanguageModel(加速的語言模型)和 PatchFastRL(加速補丁)  
PatchFastRL("GRPO", FastLanguageModel)  
# 對 FastLanguageModel 應用 "GRPO" 方案的補丁優化,以提高推理效率

02

加載基礎模型

from unsloth import is_bfloat16_supported  # 檢測是否支持 bfloat16(更節省顯存的數值格式)
import torch  # 導入 PyTorch 進行深度學習計算
# 設置模型參數
max_seq_length = 1024  # 最大序列長度,可以增大以支持更長的推理
lora_rank = 64  # LoRA 低秩適配矩陣的秩,較大值提高智能性但降低推理速度
# 加載 FastLanguageModel 預訓練模型
model, tokenizer = FastLanguageModel.from_pretrained(
    model_,  # 使用 Qwen2.5-3B-Instruct 作爲基礎模型
    max_seq_length=max_seq_length,  # 設置最大序列長度
    load_in_4bit=True,  # 使用 4-bit 量化(減少顯存消耗),若爲 False 則使用 16-bit LoRA
    fast_inference=True,  # 啓用 vLLM 加速推理(優化並行計算)
    max_lora_rank=lora_rank,  # 設置 LoRA 適配的秩
    gpu_memory_utilization=0.5,  # 限制 GPU 內存佔用,降低該值可減少顯存溢出
)
# 爲模型應用 PEFT(參數高效微調)和 LoRA(低秩適配)
model = FastLanguageModel.get_peft_model(
    model,
    r=lora_rank,  # LoRA 低秩矩陣的秩,可選 8, 16, 32, 64, 128
    target_modules=[
        "q_proj", "k_proj", "v_proj", "o_proj",  # 量化關鍵模塊:QKV 投影和輸出投影
        "gate_proj", "up_proj", "down_proj",  # MLP 相關模塊
    ],  # 若顯存不足,可以移除 QKVO 相關模塊
    lora_alpha=lora_rank,  # LoRA 適配器的 alpha 參數,通常設爲與 r 相同
    use_gradient_checkpointing="unsloth",  # 啓用梯度檢查點,減少顯存佔用,適用於長上下文微調
    random_state=3407,  # 設置隨機種子,保證實驗可復現
)
# 輸出 
==((====))==  Unsloth 2025.2.12: Fast Qwen2 patching. Transformers: 4.48.3.
   \\   /|    GPU: Tesla T4. Max memory: 14.741 GB. Platform: Linux.
O^O/ \_\    Torch: 2.5.1+cu124. CUDA: 7.5. CUDA Toolkit: 12.4. Triton: 3.1.0
\        /    Bfloat16 = FALSE. FA [Xformers = 0.0.28.post3. FA2 = False]
 "-____-"     Free Apache license: http://github.com/unslothai/unsloth
Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!
Unsloth: vLLM loading unsloth/qwen2.5-3b-instruct-unsloth-bnb-4bit with actual GPU utilization = 49.66%
Unsloth: Your GPU has CUDA compute capability 7.5 with VRAM = 14.74 GB.
Unsloth: Using conservativeness = 1.0. Chunked prefill tokens = 1024. Num Sequences = 192.
Unsloth: vLLM's KV Cache can use up to 4.9 GB. Also swap space = 2 GB.
WARNING 02-17 07:17:06 config.py:2386] Casting torch.bfloat16 to torch.float16.
INFO 02-17 07:17:19 config.py:542] This model supports multiple tasks: {'classify', 'generate', 'embed', 'reward', 'score'}. Defaulting to 'generate'.
Unsloth: vLLM Bitsandbytes config using kwargs = {'load_in_8bit': False, 'load_in_4bit': True, 'bnb_4bit_compute_dtype': 'float16', 'bnb_4bit_quant_storage': 'uint8', 'bnb_4bit_quant_type': 'nf4', 'bnb_4bit_use_double_quant': True, 'llm_int8_enable_fp32_cpu_offload': False, 'llm_int8_has_fp16_weight': False, 'llm_int8_skip_modules': ['lm_head', 'multi_modal_projector', 'merger', 'modality_projection', 'model.layers.2.mlp', 'model.layers.3.mlp', 'model.layers.30.mlp'], 'llm_int8_threshold': 6.0}
INFO 02-17 07:17:19 llm_engine.py:234] Initializing a V0 LLM engine (v0.7.2) with config: model='unsloth/qwen2.5-3b-instruct-unsloth-bnb-4bit', speculative_config=None, tokenizer='unsloth/qwen2.5-3b-instruct-unsloth-bnb-4bit', skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, override_neuron_config=None, tokenizer_revision=None, trust_remote_code=False, dtype=torch.float16, max_seq_len=1024, download_dir=None, load_format=LoadFormat.BITSANDBYTES, tensor_parallel_size=1, pipeline_parallel_size=1, disable_custom_all_reduce=False, quantization=bitsandbytes, enforce_eager=False, kv_cache_dtype=auto,  device_config=cuda:0, decoding_config=DecodingConfig(guided_decoding_backend='xgrammar'), observability_config=ObservabilityConfig(otlp_traces_endpoint=None, collect_model_forward_time=False, collect_model_execute_time=False), seed=0, served_model_name=unsloth/qwen2.5-3b-instruct-unsloth-bnb-4bit, num_scheduler_steps=1, multi_step_stream_outputs=True, enable_prefix_caching=True, chunked_prefill_enabled=False, use_async_output_proc=True, disable_mm_preprocessor_cache=False, mm_processor_kwargs=None, pooler_config=None, compilation_config={"level":0,"splitting_ops":[],"compile_sizes":[],"cudagraph_capture_sizes":[192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,4,2,1],"max_capture_size":192}, use_cached_outputs=False, 
tokenizer_config.json: 100%
 7.36k/7.36k [00:00<00:00, 451kB/s]
vocab.json: 100%
 2.78M/2.78M [00:00<00:00, 8.77MB/s]
merges.txt: 100%
 1.67M/1.67M [00:00<00:00, 6.92MB/s]
tokenizer.json: 100%
 11.4M/11.4M [00:00<00:00, 42.1MB/s]
added_tokens.json: 100%
 605/605 [00:00<00:00, 37.9kB/s]
special_tokens_map.json: 100%
 614/614 [00:00<00:00, 54.5kB/s]
generation_config.json: 100%
 271/271 [00:00<00:00, 17.2kB/s]
INFO 02-17 07:17:23 cuda.py:179] Cannot use FlashAttention-2 backend for Volta and Turing GPUs.
INFO 02-17 07:17:23 cuda.py:227] Using XFormers backend.
INFO 02-17 07:17:24 model_runner.py:1110] Starting to load model unsloth/qwen2.5-3b-instruct-unsloth-bnb-4bit...
INFO 02-17 07:17:24 loader.py:1102] Loading weights with BitsAndBytes quantization.  May take a while ...
INFO 02-17 07:17:25 weight_utils.py:252] Using model weights format ['*.safetensors']
model.safetensors: 100%
 2.36G/2.36G [00:15<00:00, 165MB/s]
Loading safetensors checkpoint shards: 100% Completed | 1/1 [00:04<00:00,  4.67s/it]
Loading safetensors checkpoint shards: 100% Completed | 1/1 [00:01<00:00,  1.17s/it]
INFO 02-17 07:17:48 model_runner.py:1115] Loading model weights took 2.2160 GB
INFO 02-17 07:17:48 punica_selector.py:18] Using PunicaWrapperGPU.
INFO 02-17 07:17:58 worker.py:267] Memory profiling takes 9.77 seconds
INFO 02-17 07:17:58 worker.py:267] the current vLLM instance can use total_gpu_memory (14.74GiB) x gpu_memory_utilization (0.50) = 7.32GiB
INFO 02-17 07:17:58 worker.py:267] model weights take 2.22GiB; non_torch_memory takes 0.05GiB; PyTorch activation peak memory takes 1.05GiB; the rest of the memory reserved for KV Cache is 4.01GiB.
INFO 02-17 07:17:58 executor_base.py:110] # CUDA blocks: 7300, # CPU blocks: 3640
INFO 02-17 07:17:58 executor_base.py:115] Maximum concurrency for 1024 tokens per request: 114.06x
INFO 02-17 07:18:01 model_runner.py:1434] Capturing cudagraphs for decoding. This may lead to unexpected consequences if the model is not static. To run the model in eager mode, set 'enforce_eager=True' or use '--enforce-eager' in the CLI. If out-of-memory error occurs during cudagraph capture, consider decreasing `gpu_memory_utilization` or switching to eager mode. You can also reduce the `max_num_seqs` as needed to decrease memory usage.
Capturing CUDA graph shapes: 100%|██████████| 27/27 [00:43<00:00,  1.60s/it]
INFO 02-17 07:18:44 model_runner.py:1562] Graph capturing finished in 43 secs, took 0.62 GiB
INFO 02-17 07:18:44 llm_engine.py:431] init engine (profile, create kv cache, warmup model) took 56.33 seconds
tokenizer_config.json: 100%
 7.36k/7.36k [00:00<00:00, 650kB/s]
vocab.json: 100%
 2.78M/2.78M [00:00<00:00, 14.2MB/s]
merges.txt: 100%
 1.67M/1.67M [00:00<00:00, 26.5MB/s]
added_tokens.json: 100%
 605/605 [00:00<00:00, 45.0kB/s]
special_tokens_map.json: 100%
 614/614 [00:00<00:00, 32.3kB/s]
tokenizer.json: 100%
 11.4M/11.4M [00:00<00:00, 40.2MB/s]
Unsloth 2025.2.12 patched 36 layers with 36 QKV layers, 36 O layers and 36 MLP layers.

03

訓練數據準備

import re
from datasets import load_dataset, Dataset
# Load and prep dataset
SYSTEM_PROMPT = """
Respond in the following format:
<reasoning>
...
</reasoning>
<answer>
...
</answer>
"""
def extract_xml_answer(text: str) -> str:
    """提取 <answer> 標籤內的內容"""
    match = re.search(r"<answer>(.*?)</answer>", text, re.DOTALL)
    return match.group(1).strip() if match else text.strip()
def get_medical_questions(split="train") -> Dataset:
    """加載 FreedomIntelligence/medical-o1-reasoning-SFT 數據集並格式化"""
    data = load_dataset("FreedomIntelligence/medical-o1-reasoning-SFT"'zh')[split]  
    def format_example(x):
        xml_answer = f"""\
<reasoning>
{x['Complex_CoT'].strip()}
</reasoning>
<answer>
{x['Response'].strip()}
</answer>"""
        return {
            'prompt': [
                {'role''system''content': SYSTEM_PROMPT},
                {'role''user''content': x['Question']}
            ],
            'answer': extract_xml_answer(xml_answer)  # 確保解析正確答案
        }
    data = data.map(format_example)
    return data
# 加載數據集
dataset = get_medical_questions()
# 獎勵函數
def correctness_reward_func(prompts, completions, answer, **kwargs) -> list[float]:
    """檢查模型輸出的答案是否正確"""
    responses = [completion[0]['content'] for completion in completions]
    extracted_responses = [extract_xml_answer(r) for r in responses]
    return [2.0 if r ==else 0.0 for r, a in zip(extracted_responses, answer)]
def int_reward_func(completions, **kwargs) -> list[float]:
    """檢查答案是否爲整數"""
    responses = [completion[0]['content'] for completion in completions]
    extracted_responses = [extract_xml_answer(r) for r in responses]
    return [0.5 if r.isdigit() else 0.0 for r in extracted_responses]
def strict_format_reward_func(completions, **kwargs) -> list[float]:
    """嚴格格式檢查:必須有換行符"""
    pattern = r"^<reasoning>\n.*?\n</reasoning>\n<answer>\n.*?\n</answer>\n$"
    responses = [completion[0]["content"] for completion in completions]
    return [0.5 if re.match(pattern, r) else 0.0 for r in responses]
def soft_format_reward_func(completions, **kwargs) -> list[float]:
    """寬鬆格式檢查:允許不嚴格換行"""
    pattern = r"<reasoning>.*?</reasoning>\s*<answer>.*?</answer>"
    responses = [completion[0]["content"] for completion in completions]
    return [0.5 if re.match(pattern, r) else 0.0 for r in responses]
def count_xml(text) -> float:
    """檢查 XML 結構完整性"""
    count = 0.0
    if text.count("<reasoning>\n") == 1:
        count += 0.125
    if text.count("\n</reasoning>\n") == 1:
        count += 0.125
    if text.count("\n<answer>\n") == 1:
        count += 0.125
        count -= len(text.split("\n</answer>\n")[-1]) * 0.001
    if text.count("\n</answer>") == 1:
        count += 0.125
        count -= (len(text.split("\n</answer>")[-1]) - 1) * 0.001
    return count
def xmlcount_reward_func(completions, **kwargs) -> list[float]:
    """計算 XML 結構完整性分數"""
    contents = [completion[0]["content"] for completion in completions]
    return [count_xml(c) for c in contents]
#輸出
medical_o1_sft_Chinese.json: 100%
 64.8M/64.8M [00:00<00:00, 120MB/s]
Generating train split: 100%
 24772/24772 [00:01<00:00, 12662.63 examples/s]
Map: 100%
 24772/24772 [00:04<00:00, 5735.65 examples/s]

04

訓練模型

from trl import GRPOConfig, GRPOTrainer  # 導入 GRPO 訓練配置和訓練器
# 設置 GRPO(General Reinforcement Preference Optimization)的訓練參數
training_args = GRPOConfig(
    use_vllm=True,  # 啓用 vLLM 進行推理加速,提高訓練效率
    learning_rate=5e-6,  # 設置學習率,較小值防止梯度爆炸
    adam_beta1=0.9,  # AdamW 優化器的 beta1 參數(動量項)
    adam_beta2=0.99,  # AdamW 優化器的 beta2 參數(平方梯度平滑項)
    weight_decay=0.1,  # 權重衰減,防止過擬合
    warmup_ratio=0.1,  # 預熱步數比例,避免初始學習率過高導致的不穩定
    lr_scheduler_type="cosine",  # 採用餘弦退火學習率調度
    optim="adamw_8bit",  # 使用 `8-bit AdamW` 優化器,節省顯存
    logging_steps=1,  # 每 1 步記錄日誌
    bf16=is_bfloat16_supported(),  # 如果支持 bfloat16,則使用 bfloat16 精度
    fp16=not is_bfloat16_supported(),  # 如果不支持 bfloat16,則使用 fp16 精度
    per_device_train_batch_size=1,  # 每個設備的批量大小,顯存不足時設爲 1
    gradient_accumulation_steps=1,  # 梯度累積步數,增加到 4 可以平滑訓練
    num_generations=8,  # 生成的樣本數,減少該值可降低顯存佔用
    max_prompt_length=256,  # 最大輸入提示長度
    max_completion_length=200,  # 最大模型輸出長度
    # num_train_epochs=1,  # 訓練 1 輪,實際使用時可以調整
    max_steps=10,  # 訓練的最大步數(短時間測試用)正常爲250
    save_steps=10,  # 每 10 步保存一次模型 正常爲250
    max_grad_norm=0.1,  # 梯度裁剪,防止梯度爆炸
    report_to="none",  # 訓練日誌不上傳到 W&B(Weights & Biases)
    output_dir="outputs",  # 訓練結果的保存目錄
)
trainer = GRPOTrainer(
    model=model,  # 使用 FastLanguageModel 加載的 Qwen2.5-3B-Instruct
    processing_class=tokenizer,  # 令牌化工具(Tokenizer)
    reward_funcs=[  # 定義獎勵函數
        xmlcount_reward_func,  # XML 結構完整性評分
        soft_format_reward_func,  # 寬鬆格式檢查
        strict_format_reward_func,  # 嚴格格式檢查
        int_reward_func,  # 評估答案是否爲整數
        correctness_reward_func,  # 檢查答案是否正確
    ],
    args=training_args,  # 訓練參數配置
    train_dataset=dataset,  # 訓練數據集(醫學問答數據)
)
trainer.train()  # 運行 GRPO 強化學習訓練
==((====))==  Unsloth - 2x faster free finetuning | Num GPUs = 1
   \\   /|    Num examples = 24,772 | Num Epochs = 1
O^O/ \_/ \    Batch size per device = 8 | Gradient Accumulation steps = 1
\        /    Total batch size = 8 | Total steps = 10
 "-____-"     Number of trainable parameters = 119,734,272
 [10/10 03:46, Epoch 0/1]
Step
Training Loss
reward
reward_std
completion_length
kl
rewards / xmlcount_reward_func
rewards / soft_format_reward_func
rewards / strict_format_reward_func
rewards / int_reward_func
rewards / correctness_reward_func
....因輸出太長,此處省略
TrainOutput(global_step=10, training_loss=2.103237093251664e-05, metrics={'train_runtime': 254.9268, 'train_samples_per_second': 0.314, 'train_steps_per_second': 0.039, 'total_flos': 0.0, 'train_loss': 2.103237093251664e-05})

05

不使用 GRPO 訓練的模型進行問答

text = tokenizer.apply_chat_template([
    {"role" : "user""content" : "一個10歲男孩在患膿皮症後出現眼瞼水腫、尿少和高血壓等症狀,作爲醫生,你認爲首選的治療藥物是什麼?"
},
], tokenize = False, add_generation_prompt = True)
from vllm import SamplingParams
sampling_params = SamplingParams(
    temperature = 0.8,
    top_p = 0.95,
    max_tokens = 1024,
)
output = model.fast_generate(
    [text],
    sampling_params = sampling_params,
    lora_request = None,
)[0].outputs[0].text
output
# 回答
Processed prompts: 100%|██████████| 1/1 [00:08<00:00,  8.94s/it, est. speed input: 6.94 toks/s, output: 37.73 toks/s]
'
膿皮症(也稱爲膿皰瘡或膿皰病)是一種由細菌感染引起的皮膚感染,雖然膿皮症與眼瞼水腫、尿少和高血壓等症狀聯繫不大,但是這些症狀可能提示存在其他問題,如膿皮症併發了其他併發症,或者出現了膿皮症以外的其他疾病。因此,首先需要通過詳細的病史詢問、體檢、實驗室檢查(如血液檢查、尿液檢查等)和影像學檢查(如必要時進行)來明確診斷。\n\n如果確診爲膿皮症,治療通常依賴抗生素。對於10歲男孩的膿皮症,首選的治療藥物通常是:\n\n1. **青黴素類**:對於大多數膿皮症患者,首選青黴素類抗生素治療(如阿莫西林),尤其是對於兒童而言。\n2. **大環內酯類**:如果患者對青黴素過敏,可以考慮使用大環內酯類抗生素(如紅黴素)。\n\n如果出現眼瞼水腫、尿少和高血壓等症狀,可能需要更進一步的評估和治療,這可能包括:\n\n- **利尿劑**:用於減少體內液體積聚,減輕水腫。\n- **血管緊張素轉換酶抑制劑(ACEI)或血管緊張素受體拮抗劑(ARB)**:用於降低血壓,尤其是如果是因爲腎臟受損導致的高血壓時。\n\n需要注意的是,這些症狀可能提示存在併發症或其它系統性疾病,因此,必須首先由專業的醫療人員進行評估和治療。請務必諮詢專業醫生,獲得針對具體情況的專業治療建議。在沒有得到專業醫生指導的情況下,不要自行給孩子使用任何藥物。

06

使用 GRPO 訓練後的模型進行問答

model.save_lora("grpo_saved_lora")
text = tokenizer.apply_chat_template([
    {"role" : "system""content" : SYSTEM_PROMPT},
    {"role" : "user""content" : "一個10歲男孩在患膿皮症後出現眼瞼水腫、尿少和高血壓等症狀,作爲醫生,你認爲首選的治療藥物是什麼?"},
], tokenize = False, add_generation_prompt = True)
from vllm import SamplingParams
sampling_params = SamplingParams(
    temperature = 0.8,
    top_p = 0.95,
    max_tokens = 1024,
)
output = model.fast_generate(
    text,
    sampling_params = sampling_params,
    lora_request = model.load_lora("grpo_saved_lora"),
)[0].outputs[0].text
output
#回答
Processed prompts: 100%|██████████| 1/1 [00:09<00:00,  9.17s/it, est. speed input: 7.42 toks/s, output: 34.04 toks/s]
'
<reasoning>\n根據病史描述,這個10男孩出現眼瞼水腫、
尿少和高血壓的症狀,而膿皮症是引起這些症狀的一個可能的原因,
但是最應該考慮的是水腫和高血壓可能與感染相關的系統性炎症反應有關。
在這種情況下,首選的治療藥物需要考慮控制感染(膿皮症)、
控制炎症反應以及處理高血壓。考慮到患兒的年齡,
首選的藥物應該是安全的並且可以兼顧上述三個問題。
\n\n1. 抗生素:膿皮症是一種細菌感染,需要使用抗生素進行治療。對於10歲的小男孩,青黴素類藥物通常是首選,因爲這類抗生素對兒童來說副作用較小。
\n\n2. 非甾體抗炎藥(NSAIDs):這類藥物可以減輕炎症反應,幫助控制膿皮症。例如布洛芬,它相對安全,副作用較少,適用於兒童。
\n\n3. 抗高血壓藥物:如果伴有高血壓,可能需要使用抗高血壓藥物,例如ACE抑制劑或者鈣通道阻滯劑。然而,考慮到10歲兒童的特殊性,這些藥物的使用需要謹慎,並且需要兒科醫生的指導。
\n\n綜上所述,治療首選藥物應該是青黴素類抗生素來控制膿皮症,並且根據病情可能還需要使用NSAIDs以及兒科醫生指導下可能需要的抗高血壓藥物。
\n...\n<answer>\n首選治療藥物是青黴素類抗生素來控制膿皮症。其他可能需要的藥物包括NSAIDs和抗高血壓藥物,但是需要兒科醫生指導。

reasoning 後的數據爲推理,answer 後的數據爲回答,因本次訓練不夠,模型回答結果和標註數據相差很遠。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/2yCs7p71GSn7cU8Xt_U4vg