File size: 3,220 Bytes
1d4c295
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from openai import OpenAI
import os
import re

# 设置OpenAI API密钥和基础URL
api_key = os.getenv("OPENAI_API_KEY")
base_url = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
model_name = os.getenv("OPENAI_MODEL_NAME", "gpt-3.5-turbo")

def analyze_style(profile, conversations):
    client = OpenAI(
        api_key=api_key,
        base_url=base_url
    )
    # 提取患者信息
    patient_info = f"### 患者信息\n年龄:{profile['age']}\n性别:{profile['gender']}\n职业:{profile['occupation']}\n婚姻状况:{profile['marital_status']}\n症状:{profile['symptoms']}"
    # 提取对话记录
    dialogue_history = "\n".join([f"{conv['role']}: {conv['content']}" for conv in conversations])
    
    # 构建提示词,明确要求模型按特定格式输出结果
    prompt = f"""### 任务
根据患者情况及咨访对话历史记录分析患者的说话风格。

{patient_info}

### 对话记录
{dialogue_history}

请分析患者的说话风格,最多列出5种风格特点。
请按以下格式输出结果:
说话风格:
1. [风格特点1]
2. [风格特点2]
3. [风格特点3]
...

只需要列出风格特点,不需要解释。
"""
    
    response = client.chat.completions.create(
        model=model_name,
        messages=[
            {"role": "user", "content": prompt}
        ]
    )
    
    # 从响应中提取说话风格列表
    response_text = response.choices[0].message.content
    
    # 使用正则表达式提取风格特点
    # 匹配"说话风格:"之后的列表项
    style_pattern = r"说话风格:\s*(?:\d+\.\s*([^\n]+)(?:\n|$))+"
    match = re.search(style_pattern, response_text, re.DOTALL)
    
    if match:
        # 提取所有的列表项
        style_items = re.findall(r"\d+\.\s*([^\n]+)", response_text)
        return style_items
    else:
        # 如果没有按预期格式输出,尝试使用备用正则表达式
        # 寻找任何可能的列表项
        fallback_items = re.findall(r"(?:^|\n)(?:\d+[\.\)、]|[-•*])\s*([^\n]+)", response_text)
        
        # 如果仍然没找到,尝试直接分割文本
        if not fallback_items:
            # 找到可能包含风格描述的行
            potential_styles = [line.strip() for line in response_text.split('\n') 
                               if line.strip() and not line.startswith('###') and ':' not in line]
            return potential_styles[:5]  # 最多返回5项
        
        return fallback_items[:5]  # 最多返回5项
    
# unit test
# profile = {
#     "drisk": 3,
#     "srisk": 2,
#     "age": "42",
#     "gender": "女",
#     "marital_status": "离婚",
#     "occupation": "教师",
#     "symptoms": "缺乏自信心,自我价值感低,有自罪感,无望感;体重剧烈增加;精神运动性激越;有自杀想法"
# }
# conversations = [
#     {"role": "user", "content": "我最近感觉很沮丧,似乎一切都没有意义。"},
#     {"role": "assistant", "content": "你能具体说说是什么让你有这样的感觉吗?"},
#     {"role": "user", "content": "我觉得自己在工作上总是做不好,没什么价值。"}
# ]
# print(analyze_style(profile, conversations))