使用模型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()
本文作者:Lxx-123
本文链接:https://www.cnblogs.com/l-xx123/p/18725640
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步