使用模型api来生成prompt

xxx师兄,需要给模型一个一个csv病例数据来生成4个prompt:提示词1:模拟真实病人,提示词 2:发起咨询,提示词 3:扮演真实医生,提示词 4:如何向患者提问的COT版本以及其加上One-shot和Few-shot的版本

API调用不说了,上一篇有

主要分为
1.配置DeepSeek API参数
2.读取CSV文件并提取病例信息
3.调用API生成文本
4.存储提示词

import csv
import requests
import chardet
import time

# 配置DeepSeek API参数
API_KEY = #这个得隐藏一下
BASE_URL = "https://api.siliconflow.cn/v1/chat/completions"
HEADERS = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {API_KEY}"
}

# 自动检测文件编码
def detect_encoding(file_path):
    with open(file_path, 'rb') as file:
        raw_data = file.read()
        result = chardet.detect(raw_data)
        return result['encoding']

# 读取CSV文件并提取病例信息
def read_csv(file_path):
    encoding = detect_encoding(file_path)
    print(f"检测到文件编码为:{encoding}")
    try:
        with open(file_path, mode='r', encoding=encoding, errors='replace') as file:
            reader = csv.reader(file)
            next(reader)  # 跳过表头
            cases = []
            ro=0
            for row in reader:
                # 提取A列到O列的信息(假设每行有15列)
                case_info = row[:15]
                # 合并所有列的信息
                merged_info = " ".join(filter(None, case_info))
                cases.append(merged_info)
                ro+=1
                if ro==1:
                    return cases
    except UnicodeDecodeError:
        print(f"使用检测到的编码 {encoding} 读取失败,尝试使用其他编码...")
        for alt_encoding in ['GBK', 'GB18030', 'ISO-8859-1', 'UTF-8']:
            try:
                with open(file_path, mode='r', encoding=alt_encoding, errors='replace') as file:
                    reader = csv.reader(file)
                    next(reader)  # 跳过表头
                    first_row = next(reader)  # 只读取第一行数据
                    case_info = first_row[:15]
                    merged_info = " ".join(filter(None, case_info))
                    print(f"成功使用编码 {alt_encoding} 读取文件。")
                    return [merged_info]
            except UnicodeDecodeError:
                print(f"尝试使用编码 {alt_encoding} 读取失败,继续尝试其他编码...")
        raise Exception("无法读取文件,请手动检查文件编码。")

# 调用DeepSeek-V3 API生成文本
def call_deepseek_api(prompt):
    max_retries = 5  # 最大重试次数
    retry_delay = 1  # 重试间隔时间(秒)
    for attempt in range(max_retries):
        data = {
            "model": "deepseek-ai/DeepSeek-V3",
            "messages": [
                {"role": "user", "content": prompt}
            ],
            "max_tokens": 1024,
            "temperature": 0.7
        }
        response = requests.post(BASE_URL, headers=HEADERS, json=data)
        if response.status_code == 200:
            return response.json()["choices"][0]["message"]["content"]
        elif response.status_code == 504 and attempt < max_retries - 1:
            print(f"请求超时(504),正在第 {attempt + 1} 次重试...")
            time.sleep(retry_delay)
        else:
            return f"Error: {response.status_code} - {response.text}"
    return "Error: 达到最大重试次数,请求失败。"
# 存储提示词
def save_prompts(case, input_file, output_file):
    prompts = {}

# 提示词1:模拟真实病人

    #Cot版本
    prompt1_cot = f"""
    病例信息:{case}
    用以上信息生成的提示词1:模拟真实病人prompt的COT版本,你将扮演该病例信息的的患者角色,与该患者拥有同样的疾病信息,家族史等信息,模板信息直接输出即可,只需要确认角色扮演的身份
    以下是模板:
    你是一名【年龄】的【男性/女性】患者,【最近症状】,【过往治疗】,【家族病史】,【需要得到的帮助】。请根据这些信息,准确描述你的病情,并回答医生的提问。描述时要像真实的病人一样,可能包含模糊的描述或表达不确定性。
    请按照以下思维步骤进行:
    1.回忆主要症状:描述你的主要不适(如头痛、咳嗽、胸闷等)。
    2.提供详细的背景信息:症状持续时间、严重程度、是否有缓解或加重的情况。
    3.考虑相关病史:是否有类似经历、家族病史、近期服药情况等。
    4.尽可能自然地表达:你的回答应该像真实的病人一样,可能包含模糊的描述(如“有点痛”)或者表达不确定性(如“我不太确定什么时候开始的”)。
    5.当医生提问时,提供连贯且符合逻辑的回答,但如果问题超出你的知识范围,可以表示不清楚。
    """
    response1_cot = call_deepseek_api(prompt1_cot)
    prompts["提示词1:COT版本"] = response1_cot

    # COT + One-shot版本
    prompt1_one_shot = """
    示例对话:
    患者:“医生,我最近感觉鼻子很堵,喉咙里好像有脓鼻涕,但鼻涕不流出来。有点咳嗽,但不严重。有时感觉要好的时候,症状又突然加重了。”
    医生:“这些症状大概持续多久了?有没有什么诱因?”
    患者:“大概从10月中旬开始,那时我突然发烧到39度,后来烧退了,但鼻塞和喉咙里的脓鼻涕一直没好。”
    医生:“你之前有过类似的情况吗?家里有人有类似的症状吗?”
    患者:“没有,家族里也没有人有类似的鼻窦炎问题。”
    """
    response1_one_shot = f"{response1_cot}\n\n{prompt1_one_shot}"
    prompts["提示词1:COT + One-shot版本"] = response1_one_shot


    # COT + Few-shot版本
    prompt1_few_shot = """
    示例对话1:
    患者:“医生,我最近感觉鼻子很堵,喉咙里好像有脓鼻涕,但鼻涕不流出来。有点咳嗽,但不严重。有时感觉要好的时候,症状又突然加重了。”
    医生:“这些症状大概持续多久了?有没有什么诱因?”
    患者:“大概从10月中旬开始,那时我突然发烧到39度,后来烧退了,但鼻塞和喉咙里的脓鼻涕一直没好。”
    医生:“你之前有过类似的情况吗?家里有人有类似的症状吗?”
    患者:“没有,家族里也没有人有类似的鼻窦炎问题。”

    示例对话2:
    患者:“医生,我这两个月一直觉得胸闷,爬楼梯的时候特别明显。”
    医生:“胸闷是什么时候开始的?有没有其他症状?”
    患者:“大概一个月前开始,有时候还会喘不过气来,特别是走路快了或者提重物的时候。”
    医生:“你有心脏病家族史吗?最近工作压力大吗?”
    患者:“我爷爷有冠心病,我最近工作压力确实挺大的。”
    """
    response1_few_shot  = f"{response1_cot}\n\n{prompt1_few_shot}"
    prompts["提示词1:COT + Few-shot版本"] = response1_few_shot

# 提示词2:发起咨询

    # COT版本

    response2_cot = f"""
    请根据你的病情,按照以下步骤向医生提问:
    1.描述主要症状:用简单明了的语言描述自己的不适。
    2.表达你的疑问:例如“这可能是什么问题?”、“我应该吃什么药?”
    3.提供额外信息:如果你有相关病史、近期用药情况,可以主动说明。
    4.避免一次性提供过多信息,等待医生的提问后再补充细节。
    5.确保你的提问符合真实病人的表达习惯,如“医生,我最近老是头晕,这是怎么回事?“
    """
    prompts["提示词2:COT版本"] = response2_cot

    # COT + One-Shot版本
    prompt2_one_shot = """
    示例:
    患者:医生,我最近老是头晕,这是怎么回事?
    医生:头晕持续多久了?有其他症状吗?
    患者:大概两周了,有时候站起来会觉得天旋地转。
    医生:最近有没有压力大,或者睡眠不足?
    患者:有可能,我最近经常熬夜。
    请根据这个示例,向医生发起咨询并自然表达你的问题。"
    """
    response2_one_shot = f"{response2_cot}\n\n{prompt2_one_shot}"
    prompts["提示词2:COT + One-shot版本"] = response2_one_shot

    # COT + Few-Shot版本
    prompt2_few_shot = """
    示例1:
    患者:医生,我最近一直咳嗽,还流鼻涕,是感冒吗?
    医生:咳嗽持续多久了?
    患者:三天了,早上咳嗽比较严重。
    示例2:
    患者:医生,我最近胃总是不舒服,吃饭后会胀气,这是怎么回事?
    医生:胀气的感觉是从什么时候开始的?
    患者:大概一个星期了,特别是吃油腻的食物后更严重。
    请根据这些示例,发起你的咨询,并尽量贴合真实患者的表达方式。"
    """
    response2_few_shot = f"{response2_cot}\n\n{prompt2_few_shot}"
    prompts["提示词2:COT + Few-shot版本"] = response2_few_shot

# 提示词 3:扮演真实医生

    # COT版本

    prompt3_cot  = f"""
    病例信息:{case}
    用以上信息生成的提示词3:扮演真实医生prompt的COT版本,你将扮演该病例信息的的医生角色,与该医生拥有同样的科室,擅长等信息,你在没听到患者诉说前是不知道任何病例信息的,模板信息直接输出即可,只需要确认角色扮演的身份
    你是一位【科室】医生,【擅长】
    接下来需要按照以下逻辑进行问诊:
    1.先倾听患者的描述,理解他们的主要问题。
    2.通过询问补充症状信息,确保掌握完整的病情信息。
    3.结合患者的病史,分析可能的病因。
    4.判断是否能直接给出建议,如果信息不足,则继续询问。
    5.使用通俗易懂的语言,避免医学术语过多。
    6.如果有必要,建议患者线下就诊,并提供合理的解释。
    """
    response3_cot = call_deepseek_api(prompt3_cot )
    prompts["提示词3:COT版本"] = response3_cot

    # COT + One-Shot版本

    prompt3_one_shot = """
    示例对话:
    患者:医生,我最近胃不舒服,吃饭后会胀气。
    医生:胀气的感觉从什么时候开始的?
    患者:大概一个星期了。
    医生:最近有没有吃特别油腻或辛辣的食物?
    患者:有,前几天吃了很多烧烤。
    医生:可能是消化不良,建议你吃清淡的食物,多喝温水,如果持续不适建议线下就诊。
    """
    response3_one_shot = f"{response3_cot}\n\n{prompt3_one_shot}"
    prompts["提示词3:COT版本 + One-shot版本"] = response3_one_shot

    # COT + Few-Shot版本

    prompt3_few_shot = """
    示例1:
    患者:医生,我最近经常头痛。
    医生:头痛是从什么时候开始的?
    患者:两周前吧,有时候太阳穴会跳痛。
    示例2:
    患者:医生,我最近咳嗽很厉害,怎么办?
    医生:咳嗽持续多久了?
    患者:大概五天了。
    请参考这些示例,进行自然的问诊过程。
    """
    response3_few_shot = f"{response3_cot}\n\n{prompt3_few_shot}"
    prompts["提示词3:COT版本 + Few-shot版本"] = response3_few_shot

# 提示词 4:如何向患者提问


    # COT版本

    response4_cot = f"""
    如果你无法确定病情,请按照以下步骤提问,以获取更多有助于诊断的信息:
    1.询问症状细节:明确症状的性质、严重程度和持续时间。例如:
    “打喷嚏和流鼻涕是每天都有吗?主要集中在什么时间段?”
    “呼吸困难的时候,有没有胸闷或者喘不过气的感觉?”
    2.探寻病史:了解患者是否有相关病史或家族史。例如:
    “您以前有没有类似的过敏症状?是每年都会发作吗?”
    “您家里有没有其他人也有类似的过敏问题?”
    3.分析生活习惯:评估患者的生活方式对病情的影响。例如:
    “最近有没有接触过花粉、灰尘或者宠物毛发?”
    “您平时工作环境是否比较干燥或者有刺激性气味?”
    4.确定症状进展:判断病情的发展趋势。例如:
    “这些症状是逐渐加重的,还是每年都差不多?”
    “您之前用过什么药物?用完药后症状有没有缓解?”
    请根据患者的具体情况,合理选择和调整你的提问,以确保获取足够的信息进行诊断。
    """
    prompts["提示词4:COT版本"] = response4_cot


    # COT + One-Shot版本

    prompt4_one_shot = """
    示例:
    医生:您每年立秋后就开始打喷嚏、流鼻涕,呼吸有点困难,这些症状是每天都有吗?主要集中在什么时间段?
    患者:主要是早上起床的时候比较严重,晚上睡觉的时候也会觉得呼吸不太顺畅。
    医生:您以前有没有类似的过敏症状?是每年都会发作吗?
    患者:是的,每年秋天都会这样,大概持续一个月左右。
    医生:您之前用过什么药物?用完药后症状有没有缓解?
    患者:用过酸录马斯丁口服液,但效果不太好。
    医生:最近有没有接触过花粉、灰尘或者宠物毛发?
    患者:没有接触宠物,但工作环境比较干燥,灰尘有点多。
    """
    response4_one_shot = f"{response4_cot}\n\n{prompt4_one_shot}"
    prompts["提示词4:COT + One-shot版本"] = response4_one_shot

    # COT + Few-Shot版本

    prompt4_few_shot = """
    示例1:
    患者:医生,我最近经常头痛。
    医生:头痛是从什么时候开始的?
    患者:两周前吧,有时候太阳穴会跳痛。
    示例2:
    患者:医生,我最近咳嗽很厉害,怎么办?
    医生:咳嗽持续多久了?
    患者:大概五天了。
    请参考这些示例,进行自然的问诊过程。
    """
    response4_few_shot = f"{response4_cot}\n\n{prompt4_few_shot}"
    prompts["提示词4:COT + Few-shot版本"] = response4_few_shot

    # 写入CSV文件
    with open(output_file, mode='a', encoding=detect_encoding(input_file), newline='') as file:
        writer = csv.DictWriter(file, fieldnames=prompts.keys())
        if file.tell() == 0:
            writer.writeheader()  # 如果文件是空的,写入表头
        writer.writerow(prompts)

# 主程序
def main():
    input_file = "D://input11.csv"  # 输入CSV文件路径
    output_file = "D://output11.csv"
    try:
        cases = read_csv(input_file)
        for case in cases:
            save_prompts(case,input_file,output_file)
        print("程序运行完成")
    except Exception as e:
        print(f"程序运行时发生错误:{e}")

if __name__ == "__main__":
    main()
posted @ 2025-02-20 00:03  Lxx-123  阅读(93)  评论(0)    收藏  举报