2 Star 0 Fork 0

李林/insurance

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
chat.py 12.96 KB
一键复制 编辑 原始数据 按行查看 历史
xyxyxy 提交于 2024-09-25 23:14 . 提高正确率
from openai import OpenAI
from bson import ObjectId
# 设置OpenAI API密钥
api_key = "sk-y6I8OuYEfespFoi68e499bE1EaC7453f86Fc836b16E826Db" # 替换成你的OpenAI API密钥
openai = OpenAI(
api_key=api_key, # 替换成你在便携AI聚合API后台生成的API密钥
base_url="https://api.bianxieai.com/v1" # 替换成便携AI聚合API的入口地址
)
# openai.api_key = "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"
def get_mongo_query_from_ai(question: str) -> str:
"""
根据问题提取能源类型和车辆类型,生成仅包含这两个条件的 MongoDB 查询语句。
如果问题中仅包含一个条件(能源类型或车辆类型),则查询语句仅包含该条件。
:param question: 提问内容
:return: 生成的查询语句字符串
"""
collection_name = "insurance"
# 创建用于向 AI 模型发送的消息内容
query_instruction = (
"你是 MongoDB 专家。根据问题中的信息提取出能源类型和车辆类型。"
"能源类型可能包括燃油、新能源等,车辆类型可能包括挂车、网约车、私家车等。"
"请确保只提取完整的车辆类型,忽略单独的'车'字,因为'车'不是一个完整的车辆类型。"
"如果问题中车辆类型描述为 '燃油车' 等这样的组合,应只提取能源类型 '燃油',忽略车辆类型。"
"常见的车辆类型示例包括:私家车、挂车、网约车、出租车、货车等。"
"生成的 MongoDB 查询语句中仅包含能源类型和车辆类型两个条件。如果问题中只包含能源类型或车辆类型其中之一,则生成仅包含该条件的查询语句。"
"确保查询中的所有键和值都用双引号包裹。"
"请只返回没有任何格式的纯文本查询语句,不要使用代码块或任何其他格式。"
"例如:不要将单独的'车'识别为车辆类型,而应提取'私家车'、'网约车'等完整的车辆类型。"
)
# 使用 OpenAI GPT-4 模型生成查询语句
response = openai.chat.completions.create(
model="gpt-4o", # 使用 gpt-4o 模型
temperature=0, # 设置温度为0以减少随机性
messages=[
{"role": "system", "content": query_instruction},
{"role": "user",
"content": f"提取问题 '{question}' 中的能源类型和车辆类型,并生成对应的 MongoDB 查询语句。"}
]
)
# 提取并返回生成的查询内容,确保只返回纯文本
response_content = response.choices[0].message.content.strip()
# 清理响应中的多余内容(如代码块标记)
clean_query = response_content.replace("```plaintext\n", "").replace("```", "")
return clean_query
def get_mysql_query_from_ai(question: str) -> str:
"""
根据问题提取EnergyType和VehicleType,生成仅包含这两个条件的 MySQL 查询语句
:param question: 提问内容
:return: 生成的 MySQL 查询语句字符串
"""
table_name = "policy" # 假设表名为 "insurance"
# 创建用于向 AI 模型发送的消息内容
query_instruction = (
"你是 MySQL 专家。根据问题中的信息提取出EnergyType和VehicleType。"
"EnergyType可能包括燃油、新能源等,VehicleType可能包括挂车、网约车、私家车等。"
"生成的 MySQL 查询语句中仅包含EnergyType和VehicleType两个条件,不包括其他任何条件。"
"请生成标准的 SQL 查询语句,确保所有字符串值用单引号包裹,列名和表名用反引号包裹。"
"请只返回没有任何格式的纯文本查询语句,不要使用代码块或任何其他格式。"
)
# 使用 OpenAI GPT-4 模型生成查询语句
response = openai.chat.completions.create(
model="gpt-4o", # 使用 gpt-4o 模型
temperature=0, # 设置温度为0以减少随机性
messages=[
{"role": "system", "content": query_instruction},
{"role": "user",
"content": f"提取问题 '{question}' 中的EnergyType和VehicleType,并生成对应的 MySQL 查询语句,表名为{table_name}。"}
]
)
# 提取并返回生成的查询内容,确保只返回纯文本
response_content = response.choices[0].message.content.strip()
return response_content.replace("```plaintext\n", "").replace("```", "")
def convert_to_serializable(obj):
"""
将 MongoDB 的 ObjectId 和其他非 JSON 序列化的对象转换为可序列化的格式
:param obj: 原始数据
:return: 可序列化的格式
"""
if isinstance(obj, ObjectId):
return str(obj)
elif isinstance(obj, dict):
return {key: convert_to_serializable(value) for key, value in obj.items()}
elif isinstance(obj, list):
return [convert_to_serializable(item) for item in obj]
else:
return obj
def get_answer_from_ai(question: str, query_results) -> str:
"""
根据提供的问题和题库中的查询结果生成答案,增加保险公司相关的专业术语预设
:param question: 问题内容
:param query_results: 题库内容,可能是 dict 或其他类型
:return: 生成的答案字符串
"""
# 处理 query_results,将其转换为可序列化格式
serializable_results = convert_to_serializable(query_results)
print("查询到的数据", serializable_results)
# 增加保险公司专业术语的预设
insurance_terms = """
保险公司常用术语:
1. 数字出28,35等:表示商业手续费28%、商业手续费35%等。在投保过程中,手续费比例是影响价格的重要因素。如果问题中提到数字,如28或35,需要根据该公司的手续费标准,判断是否在合理范围内。如果在范围内,则表示符合投保条件;否则表示不符合。
2. 出**:表示选择投保哪家保险公司。例如“出人保”表示投保中国人民保险公司;“出阳光”表示投保阳光保险公司。出某某公司,即表示投保该公司提供的保险产品。
3. 只要什么险:**需要首先判断该险种是否可以单独购买**。如果客户希望“只要商业险”或“只要三者险”等,需要检查该保险公司是否允许不捆绑其他险种(如交强险或车损险)。如果公司规定某些险种必须捆绑其他险种,则返回“不能单独购买该险种”;如果可以单独购买,则继续进行费用计算或其他操作。这类问题优先处理投保组合要求,再根据结果提供具体费用等信息。
4. 出险几次:表示车辆已经出险的次数。每家保险公司对出险次数有不同的承保限制,超出该公司可承保的出险次数最大值时,无法再承保。例如,某公司限制最多出险2次,如果已出险3次,则该公司不予承保。
5. 公司车:指以单位或公司名义注册的车辆。部分保险公司对公司车有特殊的投保限制,需查看禁保政策中是否禁止承保公司车。
6. 费用(手续费):不同保险公司对相同类型车辆的保费(包括交强险和商业险)手续费比例不同。比如问题中的“阳光28的费用”,是指阳光保险公司对于该类型保险提供的手续费比例为28%,此时需要判断是否符合保险公司内部的费用标准。
7. 要求:表示保险公司对险种的要求,例如要求附加购买某些必选险种或对险种保额有最低要求。回答时需要列出所有险种的承保要求,如座位险、三者险、车损险的最低保额。
8. 没有要求:当问题中提到某险种“没有要求”时,表示该险种为可选项,不是必选险种,客户可根据自己的需求选择是否购买。
9. 交强险+车损+三者100万:这是投保时常见的险种组合,表示客户希望购买交强险、车损险以及第三者责任险(保额100万元)。回答时,需要确认该公司是否允许并且是否对这些险种有额外要求,如三者险的最低保额。
10. 新能源车:在问题中提到新能源车时,需要明确区分不同保险公司对新能源车(如网约车、私家车、新车或过户车)的承保条件。例如,某些公司限制承保新能源网约车的新车或对车龄有要求。
11. 燃油车:与新能源车相对应,燃油车的承保条件也可能根据车型、车龄或地区有所不同。例如,某些保险公司对燃油私家车有车龄限制,或者手续费比例较高。
12. 承保公司:问题中提到的“承保哪些公司”,是指客户希望知道哪些保险公司可以为特定类型的车辆或险种提供保险。不同保险公司对承保的车种、险种及地区政策不同,需要具体说明。
13. 过户车:过户车指已经二手过户的车辆。部分保险公司对过户车有特殊的承保规定。例如,某公司可能允许为新能源网约车的过户车提供保险,而其他公司则不允许。
14. 保额要求:表示客户在购买保险时,对某些险种的保额有特定要求,例如第三者责任险的保额是50万、100万或150万。保险公司可能对不同保额有最低要求,必须符合规定才能承保。
15. 区域限制:一些保险公司对某些地区的车主有限制(如凉山地区)。如果某地被列为禁保区域,则该公司不为该地区的车主承保。
16. 车龄要求:部分公司对承保车辆的车龄有要求。例如,某公司只为车龄小于等于4年的车辆提供保险,超过这个车龄的车辆将无法承保。
17. 出险记录:当问题涉及“出险3次”时,需要根据保险公司的规定,判断该公司是否对出险次数有明确限制。某些公司限制最多出险2次,超过这个次数则无法承保。
18. 自主系数:自主系数是保险公司根据投保车辆的特征(如是否为个人车或公司车、是否出过险)设定的费率调整系数。例如平安燃油私家车的自主系数可能为1.0(个人车)、1.1(公司车)、1.2(出过险的车辆)。
19. 如果问承保要求,需要给出保额最大值和最小值
20. 如果出现类似于:交强险+车损+三者,他的意思是能不能只买这三种保险的组合,如果座位险也要求必须买,那么这个组合不能承保。以此类推。
"""
# 将 query_results 作为题库信息传递给 AI
response = openai.chat.completions.create(
model="gpt-4o", # 使用 gpt-4o 模型
temperature=0,
messages=[
{"role": "system",
"content": f"你是一个乐于助人的保险公司助手。题库已经提供,请根据问题从题库中找出最相关的答案并回答用户,给出符合问题的所有答案,不要分析原因。以下是一些常用的保险公司术语,可以帮助你更好地理解用户的问题:{insurance_terms}"},
{"role": "user",
"content": f"问题: {question}"},
{"role": "system",
"content": f"知识库内容: {serializable_results}"}
]
)
# 提取并返回生成的答案内容
response_content = response.choices[0].message.content
return response_content
def check_consistency(content1: str, content2: str) -> str:
"""
根据提供的两个内容判断它们是否一致
:param content1: 第一个内容
:param content2: 第二个内容
:return: 一致性判断结果字符串(“是”或“否”)
"""
# 将内容作为消息传递给 AI 进行一致性判断
response = openai.chat.completions.create(
model="gpt-4o", # 使用 gpt-4o 模型
temperature=0,
messages=[
{"role": "system",
"content": "你是一个判断内容表达的意思是否一致的助手。请仅返回“是”或“否”,判断以下两个内容是否表达了一致的意思。"},
{"role": "user",
"content": f"内容1: {content1}\n内容2: {content2}"}
]
)
# 提取并返回一致性判断结果,确保只返回“是”或“否”
response_content = response.choices[0].message.content.strip()
return response_content if response_content in ["是", "否"] else "无法判断"
def vehicle_and_energy_types(prompt: str) -> str:
"""
提取用户输入中的车辆类型和能源类型
:param prompt: 提示词
:return: 一致性判断结果字符串(“是”或“否”)
"""
# 将内容作为消息传递给 AI 进行一致性判断
response = openai.chat.completions.create(
model="gpt-4o", # 使用 gpt-4o 模型
temperature=0,
messages=[
{"role": "system",
"content": prompt}
]
)
# 提取并返回一致性判断结果,确保只返回“是”或“否”
response_content = response.choices[0].message.content.strip()
return response_content
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/li-_lin/insurance.git
git@gitee.com:li-_lin/insurance.git
li-_lin
insurance
insurance
main

搜索帮助