From eb7c4cf2210818c8fa088e280df8cba9acdead9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E9=9B=A8?= Date: Fri, 6 Jun 2025 10:14:29 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=E6=8F=90=E4=BA=A4dockerfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 4 ++-- Dockerfile | 10 ++++++++++ requirements.txt | 3 ++- yj_room_agent/LLM/ai_service.py | 9 ++++++--- yonyouopenapisdk-1.1.1-py3-none-any.whl | Bin 0 -> 7874 bytes 5 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 Dockerfile create mode 100644 yonyouopenapisdk-1.1.1-py3-none-any.whl diff --git a/.env b/.env index 6a846dc..cf86877 100644 --- a/.env +++ b/.env @@ -5,6 +5,6 @@ MODEL_BASE_URL=https://api.deepseek.com #模型名称 MODEL_NAME=deepseek-chat #放行host地址 -DJANGO_ALLOWED_HOSTS=192.168.237.130,127.0.0.1,10.212.27.4 +DJANGO_ALLOWED_HOSTS=192.168.237.130,127.0.0.1,10.212.26.136 #是否开启debug模式 -DJANGO_DEBUG_ENABLE=False \ No newline at end of file +DJANGO_DEBUG_ENABLE=True \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d8ca093 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM docker-0.unsee.tech/python:3.12-slim +WORKDIR /app +COPY . /app +ENV TZ=Asia/Shanghai \ + LANG=C.UTF-8 +RUN apt-get update && pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ \ + && pip install yonyouopenapisdk-1.1.1-py3-none-any.whl -i https://mirrors.aliyun.com/pypi/simple/ +RUN mkdir -p /app/logs && touch /app/logs/yj_room_agent.log +EXPOSE 9000 +CMD ["gunicorn","-w 3","-b 0.0.0.0:9000", "yj_room_agent.wsgi"] diff --git a/requirements.txt b/requirements.txt index a005d57..14bd193 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ Django==5.2.1 requests==2.32.3 -python-decouple==3.8 \ No newline at end of file +python-decouple==3.8 +gunicorn==23.0.0 \ No newline at end of file diff --git a/yj_room_agent/LLM/ai_service.py b/yj_room_agent/LLM/ai_service.py index 9bc8fa1..9566f4b 100644 --- a/yj_room_agent/LLM/ai_service.py +++ b/yj_room_agent/LLM/ai_service.py @@ -11,8 +11,12 @@ BASE_URL = config('MODEL_BASE_URL', default="") def parse_time(time_str: str) -> int: - timestamp = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S").timestamp() - return int(timestamp) + try: + timestamp = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S").timestamp() + return int(timestamp) + except Exception as ee: + print("解析时间错误:" + str(ee.with_traceback())) + return int(datetime.now().timestamp()) def is_json(myjson): @@ -46,7 +50,6 @@ def query_room_info(params) -> str: return str(result) - def book_room(data: dict, params: dict) -> str: # resp = requests.post('http://127.0.0.1:8000/myapi/room/', data) """ diff --git a/yonyouopenapisdk-1.1.1-py3-none-any.whl b/yonyouopenapisdk-1.1.1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..c4d19af1e3c280d11fe191287c48c44f81e6c7fe GIT binary patch literal 7874 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 S3J3T2;TnFZd{@Z+y8AzyLc|6D literal 0 HcmV?d00001 From fadb0a004b27484be5e8d12edc54728c0a73aebc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E9=9B=A8?= Date: Mon, 9 Jun 2025 10:19:30 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=E6=95=B4=E7=90=86=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E8=B0=83=E7=94=A8=EF=BC=8C=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E9=A2=84=E8=AE=A2=E7=BB=93=E6=9E=9C=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yj_room_agent/LLM/ai_service.py | 105 +++++++++++++++++++++++++++----- 1 file changed, 91 insertions(+), 14 deletions(-) diff --git a/yj_room_agent/LLM/ai_service.py b/yj_room_agent/LLM/ai_service.py index 9566f4b..f1d6ef4 100644 --- a/yj_room_agent/LLM/ai_service.py +++ b/yj_room_agent/LLM/ai_service.py @@ -1,6 +1,8 @@ from threading import Lock from datetime import datetime import requests, json +from django.db.models.expressions import result + from .openai_client import call_openai_api from decouple import config import threading, re @@ -104,16 +106,24 @@ def build_prompt(params): """构建增强提示词""" # 获取可用会议室信息 room_info = query_room_info(params) - for_mart_str = ''' + book_for_mart_str = ''' { "room_id":"11", //会议室ID "capacity":20, "start_time":"2025-06-04 09:30:10", "end_time":"2025-06-04 12:30:10", - "user_confirm":1 //用户是否确认 + "user_confirm":1 //用户是否确认, + "func_name":"book_room", } ''' + qry_book_info_for_mart_str = ''' + { + + "func_name":"query_booking_info", + } + ''' + time_now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 增强提示词模板 template = f"""你是一个专业的OA会议预订助手,请根据以下信息提供服务: @@ -124,15 +134,22 @@ def build_prompt(params): 1. 解析用户预订需求(时间、人数、设备要求等) 2. 根据可用会议室列表推荐合适选项,推荐选项时,没有用户明确需要预订哪间会议室时,不需要提取用户预订信息,直接返回推荐会议室列表,按照自然语言返回即可 3. 只有当用户确定要预订某间会议室,而不是在询问合适会议室时,请根据上下文提取用户预订信息,预订时间等信息并返回而不是直接提示预订成功,结果请只返回json格式得预订信息且不需要包含多余的描述内容以及标签等,输出结果示例如下: - {for_mart_str} - 4. 如果当用户再次请求预订会议室时,请不要按照json格式直接提取用户的预订信息,而是请重新查看现有会议室的最新情况,基于用户需求给用户推荐合理的会议室,推荐选项时不需要提取用户预订信息按照json格式返回,只需要重新给用户推荐选项即可,按照正常自然语言对话返回 - 5. 如果用户需要解析调用预订会议室返回的结果,请解析用户提供的相应结果信息,并给予自然语言反馈,不需要返回json数据 - 6. 用户其他需求,请按照自然语言对话返回 + {book_for_mart_str} + 4. 用户需要查询已有的会议室预订情况或者预订情况时,结果请按照以下的json示例返回,不需要返回其他的多余数据,返回示例如下: + {qry_book_info_for_mart_str} + 5. 如果当用户再次请求预订会议室时,请不要按照json格式直接提取用户的预订信息,而是请重新查看现有会议室的最新情况,基于用户需求给用户推荐合理的会议室,推荐选项时不需要提取用户预订信息按照json格式返回,只需要重新给用户推荐选项即可,按照正常自然语言对话返回 + 6. 如果用户需要解析调用API返回的结果,请解析用户提供的相应结果信息,并给予自然语言反馈,不需要返回json数据 + 7. 用户其他需求,请按照自然语言对话返回 """ return template +''' +消息历史维护 +''' + + class DialogManager: def __init__(self): self.dialogs = {} @@ -192,12 +209,59 @@ class DialogManager: dialog_manager = DialogManager() +''' +异步添加上下文处理信息 +''' + def add_message_async(manager: DialogManager, session_id: str, role: str, content: str): thread = threading.Thread(target=manager.add_message, args=(session_id, role, content)) thread.start() +''' +函数调用,处理预订会议室 +''' + + +def process_book_room(data, params) -> str: + result = book_room(data=data, params=params) + book_promot = f''' + 系统调用API预订该会议室的结果如下: + {result} + 请帮用户解析预订会议室的结果,并根据结果给予用户相应自然语言反馈 + ''' + return book_promot + + +''' +函数调用,查询已经预订会议室详情 +''' + + +def process_query_book_room(data, params) -> str: + result = query_booking_info(params) + book_promot = f''' + 系统调用API查询已经预订的会议室的结果如下: + {result} + 请帮用户解析已有的会议室的结果,并根据结果给予用户相应自然语言反馈 + ''' + return book_promot + + +''' +函数调用map维护 +''' +func_tion_call_map = { + "book_room": process_book_room, + "query_booking_info": process_query_book_room +} + +''' +消息对话入口函数 +''' + + def process_chat(user_id: str, user_input: str, params: dict): history = [] query_history = dialog_manager.get_history(user_id) @@ -219,14 +283,27 @@ def process_chat(user_id: str, user_input: str, params: dict): new_content = new_content.replace("json", '') new_content = new_content.replace("`", '') data = json.loads(new_content) - # 触发预订函数------ - result = book_room(data=data, params=params) - print(result) - book_promot = f''' - 系统调用API预订该会议室的结果如下: - {result} - 请帮用户解析预订会议室的结果,并根据结果给予用户相应自然语言反馈 - ''' + fun_name = data.get("func_name", None) + book_promot = '' + result_false = {'result': False} + if fun_name: + func = func_tion_call_map.get(fun_name, None) + if func: + # 触发函数调用------ + book_promot = func(data=data, params=params) + + else: + book_promot = f''' + 未查询到相应的执行函数,结果为: + {result_false} + 请帮用户解析结果,并根据结果给予用户相应自然语言反馈 + ''' + else: + book_promot = f''' + 提取用户的函数调用参数失败,结果为: + {result_false} + 请帮用户解析结果,并根据结果给予用户相应自然语言反馈 + ''' new_history = [] query_history = dialog_manager.get_history(user_id) new_history.extend(query_history) From e77deb6f84289a9db40c6cd6d377cc9f86636f2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E9=9B=A8?= Date: Mon, 9 Jun 2025 11:18:04 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E6=B8=85=E7=90=86=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- requirements.txt | 3 ++- yj_room_agent/LLM/ai_service.py | 37 ++++++++++++++++++++++++++++----- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/.env b/.env index cf86877..20da282 100644 --- a/.env +++ b/.env @@ -5,6 +5,6 @@ MODEL_BASE_URL=https://api.deepseek.com #模型名称 MODEL_NAME=deepseek-chat #放行host地址 -DJANGO_ALLOWED_HOSTS=192.168.237.130,127.0.0.1,10.212.26.136 +DJANGO_ALLOWED_HOSTS=192.168.237.130,127.0.0.1,172.20.10.10 #是否开启debug模式 DJANGO_DEBUG_ENABLE=True \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 14bd193..548ee01 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ Django==5.2.1 requests==2.32.3 python-decouple==3.8 -gunicorn==23.0.0 \ No newline at end of file +gunicorn==23.0.0 +APScheduler==3.11.0 \ No newline at end of file diff --git a/yj_room_agent/LLM/ai_service.py b/yj_room_agent/LLM/ai_service.py index f1d6ef4..17023d9 100644 --- a/yj_room_agent/LLM/ai_service.py +++ b/yj_room_agent/LLM/ai_service.py @@ -3,6 +3,7 @@ from datetime import datetime import requests, json from django.db.models.expressions import result +from apscheduler.schedulers.background import BackgroundScheduler from .openai_client import call_openai_api from decouple import config import threading, re @@ -11,6 +12,10 @@ from ..tools import getinfo, params_filter MODEL_NAME = config('MODEL_NAME', default="") BASE_URL = config('MODEL_BASE_URL', default="") +''' +解析时间,转化为时间戳 +''' + def parse_time(time_str: str) -> int: try: @@ -21,6 +26,11 @@ def parse_time(time_str: str) -> int: return int(datetime.now().timestamp()) +''' +判断是否为json格式 +''' + + def is_json(myjson): try: json_object = json.loads(myjson) @@ -29,6 +39,11 @@ def is_json(myjson): return False +''' +查询会议室信息 +''' + + def query_room_info(params) -> str: # resp = requests.get('http://127.0.0.1:8000/myapi/room/') """ @@ -102,6 +117,11 @@ def check_and_process_think(content: str) -> str: return filtered_text +''' +初始提示词构建 +''' + + def build_prompt(params): """构建增强提示词""" # 获取可用会议室信息 @@ -158,6 +178,10 @@ class DialogManager: def get_history(self, session_id: str) -> list: return self.dialogs.get(session_id, []) + def clear_history(self): + print('开始定时执行清理历史消息') + self.dialogs.clear() + def add_message(self, session_id, role, content): with self.lock: if session_id not in self.dialogs: @@ -208,7 +232,10 @@ class DialogManager: dialog_manager = DialogManager() - +scheduler = BackgroundScheduler() +# 每天凌晨1点执行任务,清理缓存中的历史消息 +scheduler.add_job(dialog_manager.clear_history, 'cron', hour=1) +scheduler.start() ''' 异步添加上下文处理信息 ''' @@ -239,12 +266,12 @@ def process_book_room(data, params) -> str: ''' -def process_query_book_room(data, params) -> str: - result = query_booking_info(params) +def process_query_book_room(**kwargs) -> str: + result = query_booking_info(params=kwargs['params']) book_promot = f''' - 系统调用API查询已经预订的会议室的结果如下: + 系统调用API查询当前租户下已经预订的会议室的结果如下: {result} - 请帮用户解析已有的会议室的结果,并根据结果给予用户相应自然语言反馈 + 请帮用户解析已有的预订会议室的结果,并根据结果给予用户相应自然语言反馈 ''' return book_promot