为了能到远方,脚下的每一步都不能少.|

Lxx-123

园龄:1年粉丝:8关注:0

使用模型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 中国大陆许可协议进行许可。

posted @   Lxx-123  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起