style: 目录优化

main
old-tom 4 months ago
parent d05d97a824
commit 285a708bb0

@ -25,12 +25,12 @@ uv sync
docker run --name marqo -it --privileged -p 8882:8882 --add-host host.docker.internal:host-gateway marqoai/marqo:latest docker run --name marqo -it --privileged -p 8882:8882 --add-host host.docker.internal:host-gateway marqoai/marqo:latest
``` ```
初始化:执行[vector_db.py](vector_db.py) create_and_set_index()方法 初始化:执行[vector_db.py](src/vector_db.py) create_and_set_index()方法
测试:执行[vector_db.py](vector_db.py) query_vector_db() 方法,参数为任意字符串 测试:执行[vector_db.py](src/vector_db.py) query_vector_db() 方法,参数为任意字符串
4.配置文件 4.配置文件
[env.toml](env.toml) [env.toml](src/env.toml)
```toml ```toml
[base] [base]
@ -57,11 +57,11 @@ streaming = true
# 本地测试 # 本地测试
环境搭建完成后,本地运行[local_test.py](local_test.py) 即可在终端体验对话 环境搭建完成后,本地运行[local_test.py](src/local_test.py) 即可在终端体验对话
# 服务端简单实现 # 服务端简单实现
服务端使用fastapi实现,启动[server.py](server.py) 即可, 完整接口文档请访问 http://ip:port/docs 服务端使用fastapi实现,启动[server.py](src/server.py) 即可, 完整接口文档请访问 http://ip:port/docs
1. 建立sse连接用于接收模型返回流式 1. 建立sse连接用于接收模型返回流式
[GET] http://ip:port/sse/{client_id} [GET] http://ip:port/sse/{client_id}

@ -0,0 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2025/4/17 15:40
# @Author : old-tom
# @File : __init__.py
# @Project : reActLLMDemo
# @Desc :

@ -3,6 +3,8 @@
similarity_threshold = 0.93 similarity_threshold = 0.93
# 模型供应商 # 模型供应商
model_form = 'siliconflow' model_form = 'siliconflow'
# 提示词类型(普通较为宽松的场景SMART_ASSISTANT 强制使用工具SMART_ASSISTANT_STRICT)
prompt_type = 'SMART_ASSISTANT'
[siliconflow] [siliconflow]
# 硅基流动 # 硅基流动

@ -6,9 +6,9 @@
# @Project : reActLLMDemo # @Project : reActLLMDemo
# @Desc : # @Desc :
from langchain_openai import ChatOpenAI from langchain_openai import ChatOpenAI
from llmagent.llm_config import LLMConfigLoader from src.llmagent.llm_config import LLMConfigLoader
from llmagent.llm_config import base_conf from src.llmagent.llm_config import base_conf
from llmtools import tools from src.llmtools import tools
# 初始化LLM模型 # 初始化LLM模型
llm_conf = LLMConfigLoader.load(item_name=base_conf.model_form) llm_conf = LLMConfigLoader.load(item_name=base_conf.model_form)
@ -24,7 +24,7 @@ llm_with_tools = llm.bind_tools(tools)
# 提示词模版 # 提示词模版
PROMPT_TEMPLATE = { PROMPT_TEMPLATE = {
'SMART_ASSISTANT': { 'SMART_ASSISTANT': {
'description': '智能助手', 'description': '普通版本提示词',
'template': 'template':
""" """
你是智能助手,用户将会告诉你一条指令,你需要根据指令分析意图并完成任务 你是智能助手,用户将会告诉你一条指令,你需要根据指令分析意图并完成任务
@ -35,8 +35,8 @@ PROMPT_TEMPLATE = {
3. 当询问你的功能时你可以通过工具列表分析自己的功能并生成清晰的回答 3. 当询问你的功能时你可以通过工具列表分析自己的功能并生成清晰的回答
# 任务规则 # 任务规则
1. 根据指令分析意图并判断是否使用工具,如果不需要使用工具请直接回答 1. 根据指令分析意图并判断是否使用工具,如果不需要使用工具请提供简洁清晰明了的回答
2. 如果需要使用工具,根据指令和提供的工具描述选择最合适的工具,仔细阅读工具参数说明,正确的解析参数并评估用户输入的参数是否满足条件,如果参数不满足则需要提示用户重新发出指令 2. 如果需要使用工具,根据指令和提供的工具描述选择最合适的工具,仔细阅读工具参数说明,正确的解析参数
3. 所有返回禁止包含xml标签markdownhtmljson格式 3. 所有返回禁止包含xml标签markdownhtmljson格式
4. 有时候需要分析用户的上一轮指令并结合当前指令判断用户的意图 4. 有时候需要分析用户的上一轮指令并结合当前指令判断用户的意图
5. 你有足够的时间思考和回答用户的查询从而给出更周全和深入的答案然而要知道你推理和处理的时间越长相关的资源成本和潜在后果就越大虽然你不应该仓促但要在推理深度和效率之间寻求平衡优先提供一个深思熟虑的答案但如果通过合理的分析就能提供答案就不要过度思考明智地利用你的推理时间专注于提供准确答案所必需的东西避免不必要的拖延和过度思考 5. 你有足够的时间思考和回答用户的查询从而给出更周全和深入的答案然而要知道你推理和处理的时间越长相关的资源成本和潜在后果就越大虽然你不应该仓促但要在推理深度和效率之间寻求平衡优先提供一个深思熟虑的答案但如果通过合理的分析就能提供答案就不要过度思考明智地利用你的推理时间专注于提供准确答案所必需的东西避免不必要的拖延和过度思考
@ -48,5 +48,29 @@ PROMPT_TEMPLATE = {
4. 在任何情况下都不要修改或扩展提供的工具参数 4. 在任何情况下都不要修改或扩展提供的工具参数
5. 所有工具参数禁止使用unicode编码 5. 所有工具参数禁止使用unicode编码
""" """
},
'SMART_ASSISTANT_STRICT': {
'description': '严格版本提示词,强制使用工具',
'template': """
你是智能助手,用户将会告诉你一条指令,你需要根据指令分析意图并完成任务
# 背景
1. 现在时间是{current_time}
2. 无论怎样询问你的身份, 请记住你是由盛视科技开发的智能助手
3. 当询问你的功能时你可以通过工具列表分析自己的功能并生成清晰的回答
# 任务规则
1. 根据指令和提供的工具描述选择最合适的工具,仔细阅读工具参数说明,正确的解析参数并评估用户输入的参数是否满足条件,如果参数不满足则需要提示用户重新发出指令
2. 所有返回禁止包含xml标签markdownhtmljson格式
3. 有时候需要分析用户的上一轮指令并结合当前指令判断用户的意图
4. 你有足够的时间思考和回答用户的查询从而给出更周全和深入的答案然而要知道你推理和处理的时间越长相关的资源成本和潜在后果就越大虽然你不应该仓促但要在推理深度和效率之间寻求平衡优先提供一个深思熟虑的答案但如果通过合理的分析就能提供答案就不要过度思考明智地利用你的推理时间专注于提供准确答案所必需的东西避免不必要的拖延和过度思考
# 工具使用规则
1. 每条消息可以使用一个工具
2. 在每次使用工具后切勿假设工具使用成功禁止猜测工具结果
3. 根据工具返回的内容组装逻辑清晰的回答
4. 在任何情况下都不要修改或扩展提供的工具参数
5. 所有工具参数禁止使用unicode编码
"""
} }
} }

@ -5,12 +5,13 @@
# @File : llm_agent # @File : llm_agent
# @Project : reActLLMDemo # @Project : reActLLMDemo
# @Desc : 用图构建ReAct # @Desc : 用图构建ReAct
import os
from typing import Annotated from typing import Annotated
from langgraph.checkpoint.memory import MemorySaver from langgraph.checkpoint.memory import MemorySaver
from llmagent import llm_with_tools, PROMPT_TEMPLATE from src.llmagent import llm_with_tools, PROMPT_TEMPLATE
from llmtools import tool_node from src.llmtools import tool_node
from langchain_core.messages import AnyMessage, SystemMessage from langchain_core.messages import AnyMessage, SystemMessage
from typing_extensions import TypedDict from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END from langgraph.graph import StateGraph, START, END
@ -35,7 +36,7 @@ memory = MemorySaver()
class AgentState(TypedDict): class AgentState(TypedDict):
""" """
状态机 状态机
add_messages 函数会自动合并message到一个list中例如HumanMessage\AIMessage add_messages 函数会自动合并message到一个list中例如HumanMessageAIMessage
""" """
messages: Annotated[list[AnyMessage], add_messages] messages: Annotated[list[AnyMessage], add_messages]
@ -67,4 +68,4 @@ graph_builder.add_edge("chat_llm", END)
graph_builder.add_conditional_edges("chat_llm", tools_condition) graph_builder.add_conditional_edges("chat_llm", tools_condition)
graph_builder.add_edge("tools", "chat_llm") graph_builder.add_edge("tools", "chat_llm")
# checkpointer 是检查点设置 # checkpointer 是检查点设置
graph = graph_builder.compile(name='smart_assistant', checkpointer=memory) graph = graph_builder.compile(name='smart_assistant', checkpointer=memory)

@ -58,6 +58,7 @@ class LLMConfigLoader(object):
class BaseConf(BaseModel): class BaseConf(BaseModel):
similarity_threshold: float similarity_threshold: float
model_form: str model_form: str
prompt_type: str
base_conf = BaseConf(**conf['base']) base_conf = BaseConf(**conf['base'])

@ -5,7 +5,7 @@
# @File : __init__.py # @File : __init__.py
# @Project : reActLLMDemo # @Project : reActLLMDemo
# @Desc : # @Desc :
from llmtools.tool_impl import play_video, split_screen, play_video_record, switch_page, zoom_in, view_flight_details from src.llmtools.tool_impl import play_video, split_screen, play_video_record, switch_page, zoom_in, view_flight_details
from langgraph.prebuilt import ToolNode from langgraph.prebuilt import ToolNode
# 工具列表 # 工具列表

@ -8,9 +8,9 @@
from typing import Annotated from typing import Annotated
from langchain_core.tools import tool from langchain_core.tools import tool
from vector_db import query_vector_db from src.vector_db import query_vector_db
from log_conf import log from src.log_conf import log
from llmagent.llm_config import base_conf from src.llmagent.llm_config import base_conf
@tool("play_video", description="播放、查看、打开实时视频") @tool("play_video", description="播放、查看、打开实时视频")
@ -29,12 +29,14 @@ def play_video(camera_name: Annotated[str, "相机名称,例如南卡口1号
@tool("split_screen", description="切换分屏") @tool("split_screen", description="切换分屏")
def split_screen(split_n: Annotated[int, "要切换的分屏数量,整数并且大于0例如1分屏、2分屏。如果是中文,例如:壹、贰、参需要转为数字形式"]) -> str: def split_screen(split_n: Annotated[
int, "要切换的分屏数量,整数并且大于0例如1分屏、2分屏。如果是中文,例如:壹、贰、参需要转为数字形式"]) -> str:
return f"【tool_back】正在切换到{split_n}分屏,请等待操作完成" return f"【tool_back】正在切换到{split_n}分屏,请等待操作完成"
@tool("play_video_record", description="播放、打开录像") @tool("play_video_record", description="播放、打开录像")
def play_video_record(camera_name: Annotated[str, "相机名称,例如南卡口1号相机,如果没有提供时间,结束时间为当前时间,开始时间为当前时间往前5分钟"], def play_video_record(camera_name: Annotated[
str, "相机名称,例如南卡口1号相机,如果没有提供时间,结束时间为当前时间,开始时间为当前时间往前5分钟"],
start_time: Annotated[str, "录像开始时间,格式为yyyy-MM-dd hh:mm:ss例 2025-03-16 01:00:00"], start_time: Annotated[str, "录像开始时间,格式为yyyy-MM-dd hh:mm:ss例 2025-03-16 01:00:00"],
end_time: Annotated[str, "录像结束时间,格式为yyyy-MM-dd hh:mm:ss例 2025-03-16 02:09:31"]) -> str: end_time: Annotated[str, "录像结束时间,格式为yyyy-MM-dd hh:mm:ss例 2025-03-16 02:09:31"]) -> str:
log.info('【function】play_video_record 输入 [{},{},{}]', camera_name, start_time, end_time) log.info('【function】play_video_record 输入 [{},{},{}]', camera_name, start_time, end_time)

@ -10,7 +10,8 @@ import sys
import os import os
from loguru import logger from loguru import logger
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 当前目录上一层
BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
# 日志输出路径 # 日志输出路径
LOG_PATH = os.path.join(BASE_DIR, r'logout/logout.log') LOG_PATH = os.path.join(BASE_DIR, r'logout/logout.log')
Loading…
Cancel
Save