|
|
|
@ -12,7 +12,8 @@ from WxMini.Milvus.Utils.MilvusCollectionManager import MilvusCollectionManager
|
|
|
|
|
from WxMini.Milvus.Utils.MilvusConnectionPool import *
|
|
|
|
|
from WxMini.Utils.OssUtil import upload_mp3_to_oss_from_memory
|
|
|
|
|
from WxMini.Utils.TtsUtil import TTS
|
|
|
|
|
from WxMini.Utils.MySQLUtil import init_mysql_pool, save_chat_to_mysql, get_chat_log_by_session
|
|
|
|
|
from WxMini.Utils.MySQLUtil import init_mysql_pool, save_chat_to_mysql, get_chat_log_by_session, update_risk, \
|
|
|
|
|
get_risk_chat_log_page
|
|
|
|
|
from WxMini.Utils.EmbeddingUtil import text_to_embedding
|
|
|
|
|
|
|
|
|
|
# 配置日志
|
|
|
|
@ -44,6 +45,40 @@ async def lifespan(app: FastAPI):
|
|
|
|
|
logger.info("Milvus 和 MySQL 连接池已关闭。")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 会话结束后,调用检查方法,判断是不是有需要介入的问题出现
|
|
|
|
|
async def on_session_end(session_id):
|
|
|
|
|
# 获取聊天记录
|
|
|
|
|
result = await get_chat_log_by_session(app.state.mysql_pool, session_id, page=1, page_size=100)
|
|
|
|
|
|
|
|
|
|
# 拼接历史聊天记录
|
|
|
|
|
history = ""
|
|
|
|
|
for row in result['data']:
|
|
|
|
|
history = f"{history}\n问题:{row['user_input']}\n回答:{row['model_response']}"
|
|
|
|
|
|
|
|
|
|
# 将历史聊天记录发给大模型,让它帮我分析一下
|
|
|
|
|
prompt = (
|
|
|
|
|
"我将把用户与AI大模型交流的记录发给你,帮我分析一下这个用户是否存在心理健康方面的问题,"
|
|
|
|
|
"参考:1、PHQ-9抑郁症筛查量表和2、Beck自杀意念评量表(BSI-CV)。"
|
|
|
|
|
"如果没有健康问题请回复: OK;否则回复:NO,换行后再输出是什么问题。"
|
|
|
|
|
f"\n\n历史聊天记录:{history}"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
response = await client.chat.completions.create(
|
|
|
|
|
model=MODEL_NAME,
|
|
|
|
|
messages=[
|
|
|
|
|
{"role": "system", "content": "你是一个心理健康分析助手,负责分析用户的心理健康状况。"},
|
|
|
|
|
{"role": "user", "content": prompt}
|
|
|
|
|
],
|
|
|
|
|
max_tokens=1000
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 处理分析结果
|
|
|
|
|
if response.choices and response.choices[0].message.content:
|
|
|
|
|
analysis_result = response.choices[0].message.content.strip()
|
|
|
|
|
if analysis_result.startswith("NO"):
|
|
|
|
|
await update_risk(app.state.mysql_pool, session_id, analysis_result)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 初始化 FastAPI 应用
|
|
|
|
|
app = FastAPI(lifespan=lifespan)
|
|
|
|
|
|
|
|
|
@ -111,10 +146,10 @@ async def reply(session_id: str = Form(...), prompt: str = Form(...)):
|
|
|
|
|
model=MODEL_NAME,
|
|
|
|
|
messages=[
|
|
|
|
|
{"role": "system",
|
|
|
|
|
"content": "你是一个私人助理,负责回答用户的问题。请根据用户的历史对话和当前问题,提供准确且简洁的回答。不要提及你是通义千问或其他无关信息,也不可以回复与本次用户问题不相关的历史对话记录内容。"},
|
|
|
|
|
"content": "你是一个私人助理,负责回答用户的问题。请根据用户的历史对话和当前问题,提供准确且简洁的回答。不要提及你是通义千问或其他无关信息,也不可以回复与本次用户问题不相关的历史对话记录内容,回复内容不要超过90字。"},
|
|
|
|
|
{"role": "user", "content": f"历史对话记录:{history_prompt},本次用户问题: {prompt}"}
|
|
|
|
|
],
|
|
|
|
|
max_tokens=500
|
|
|
|
|
max_tokens=100
|
|
|
|
|
),
|
|
|
|
|
timeout=60 # 设置超时时间为 60 秒
|
|
|
|
|
)
|
|
|
|
@ -165,6 +200,10 @@ async def reply(session_id: str = Form(...), prompt: str = Form(...)):
|
|
|
|
|
await save_chat_to_mysql(app.state.mysql_pool, session_id, prompt, result, url, duration)
|
|
|
|
|
logger.info("用户输入和大模型反馈已记录到 MySQL 数据库。")
|
|
|
|
|
|
|
|
|
|
# 调用会话检查机制
|
|
|
|
|
await on_session_end(session_id)
|
|
|
|
|
|
|
|
|
|
# 返回数据
|
|
|
|
|
return {
|
|
|
|
|
"success": True,
|
|
|
|
|
"url": url,
|
|
|
|
@ -204,6 +243,26 @@ async def get_chat_log(
|
|
|
|
|
raise HTTPException(status_code=500, detail=f"查询聊天记录失败: {str(e)}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.get("/aichat/get_risk_page")
|
|
|
|
|
async def get_risk_page(
|
|
|
|
|
risk_flag: int = Query(default=1, ge=1, description="1:有风险,0:无风险,2:有风险但已处理"),
|
|
|
|
|
page: int = Query(default=1, ge=1, description="当前页码"),
|
|
|
|
|
page_size: int = Query(default=10, ge=1, le=100, description="每页记录数")
|
|
|
|
|
):
|
|
|
|
|
"""
|
|
|
|
|
查询有风险的聊天记录,并按 id 降序分页
|
|
|
|
|
:param page: 当前页码
|
|
|
|
|
:param page_size: 每页记录数
|
|
|
|
|
:return: 分页数据
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
result = await get_risk_chat_log_page(app.state.mysql_pool, risk_flag, page, page_size)
|
|
|
|
|
return result
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"查询有风险的聊天记录失败: {str(e)}")
|
|
|
|
|
raise HTTPException(status_code=500, detail=f"查询有风险的聊天记录失败: {str(e)}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 运行 FastAPI 应用
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
import uvicorn
|
|
|
|
|