File size: 5,338 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
from openai import OpenAI
import json
import re
import os

# 设置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 extract_boolean(text):
    """从文本中提取布尔值判断"""
    # 查找明确的"是"或"否"的回答
    text_lower = text.lower()
    
    # 更具体地查找否定表达 - 这些应该优先匹配
    negative_patterns = [
        r'不需要', r'没有提及', r'不涉及', r'没有涉及', r'无关', r'没有提到',
        r'不是', r'否', r'不包含', r'未提及', r'未涉及', r'未提到',
        r'不包括', r'并未', r'不包括', r'没有', r'无'
    ]
    
    # 检查是否有明确的否定
    for pattern in negative_patterns:
        if re.search(r'\b' + pattern + r'\b', text_lower):
            return False
    
    # 如果找到"之前疗程"附近有否定词,也认为是否定
    therapy_negation = re.search(r'(没有|不|未|无).*?(之前|以前|上次|过去|先前).*?(疗程|治疗|会话)', text_lower)
    if therapy_negation:
        return False
        
    # 明确的肯定模式 - 只有在没有否定的情况下才考虑
    positive_patterns = [
        r'是的', r'提及了', r'确实', r'有提到', r'涉及到', 
        r'提及', r'确认', r'有关联', r'有联系', r'包含', r'涉及'
    ]
    
    # 检查是否有肯定模式
    for pattern in positive_patterns:
        if re.search(r'\b' + pattern + r'\b', text_lower):
            return True
            
    # 查找含有"之前疗程"的文本,没有否定词的情况下可能是肯定
    therapy_mention = re.search(r'(之前|以前|上次|过去|先前).*?(疗程|治疗|会话)', text_lower)
    if therapy_mention:
        return True
    
    # 默认情况 - 如果没有明确的肯定或否定,我们假设是否定的
    return False

def extract_knowledge(text):
    """从文本中提取知识总结部分"""
    # 尝试匹配总结部分
    summary_patterns = [
        r'总结[::]\s*([\s\S]+)$',
        r'知识总结[::]\s*([\s\S]+)$',
        r'相关信息[::]\s*([\s\S]+)$',
        r'搜索结果[::]\s*([\s\S]+)$'
    ]
    
    for pattern in summary_patterns:
        match = re.search(pattern, text)
        if match:
            return match.group(1).strip()
    
    # 如果没有找到明确的总结标记,尝试清理文本
    # 移除可能的指令解释部分
    clean_text = re.sub(r'^.*?(根据|基于).*?[,,。]', '', text, flags=re.DOTALL)
    
    # 移除可能的前导分析部分
    clean_text = re.sub(r'^.*?(分析|查看|判断).*?\n\n', '', clean_text, flags=re.DOTALL)
    
    return clean_text.strip()

def is_need(utterance):
    client = OpenAI(
        api_key=api_key,
        base_url=base_url
    )
    
    instruction = """
    ### 任务
    下面这句话是心理咨询师说的话,请判断它是否提及了之前疗程的内容。
    
    请使用以下确切格式回答:
    判断: [是/否]
    解释: [简要解释为什么]
    
    ### 话语
    "{}"
    """.format(utterance)
    
    response = client.chat.completions.create(
        model=model_name,
        messages=[{"role": "user", "content": instruction}],
        temperature=0
    )
    
    response_text = response.choices[0].message.content
    
    # 首先尝试从格式化输出中提取
    judgment_match = re.search(r'判断:\s*(是|否)', response_text)
    if judgment_match:
        return judgment_match.group(1) == "是"
    
    # 如果没有格式化输出,使用更通用的提取
    return extract_boolean(response_text)

def query(utterance, conversations, scales):
    client = OpenAI(
        api_key=api_key,
        base_url=base_url
    )
    
    # 将scales转换为字符串以便传入
    if isinstance(scales, dict):
        scales_str = json.dumps(scales, ensure_ascii=False)
    else:
        scales_str = str(scales)
    
    instruction = """
    ### 任务
    根据对话内容,从知识库中搜索相关的信息并总结。
    
    请使用以下确切格式回答:
    总结: [提供一个清晰、简洁的总结]
    
    ### 对话内容
    {}
    
    ### 知识库
    对话历史: {}
    量表结果: {}
    """.format(utterance, conversations, scales_str)
    
    response = client.chat.completions.create(
        model=model_name,
        messages=[{"role": "user", "content": instruction}],
        temperature=0
    )
    
    response_text = response.choices[0].message.content
    
    # 尝试提取总结部分
    summary_match = re.search(r'总结:\s*([\s\S]+)$', response_text)
    if summary_match:
        return summary_match.group(1).strip()
    
    # 回退到通用提取
    return extract_knowledge(response_text)

# 测试用例
# if __name__ == "__main__":
#     test_utterance = "上次给你说的方法有用吗"
#     # test_utterance = "我觉得你可以多出去走走"
#     print(f"是否提及疗程: {is_need(test_utterance)}")
    
#     test_convs = ["第一次对话内容", "讨论量表结果", "提到睡眠问题"]
#     test_scales = {"BDI": ["A", "B"], "GHQ": ["C", "D"]}
#     print(f"知识检索结果:\n{query(test_utterance, test_convs, test_scales)}")