Kaynağa Gözat

优化提示词(精简)

longjoedyy 3 hafta önce
ebeveyn
işleme
950e1c76df
2 değiştirilmiş dosya ile 25 ekleme ve 69 silme
  1. 19 65
      core/agent.py
  2. 6 4
      tools/knowledge_tools.py

+ 19 - 65
core/agent.py

@@ -22,73 +22,27 @@ dotenv.load_dotenv()
 def create_system_prompt(
     backend_url: str = "", token: str = "", username: str = "default"
 ) -> str:
-    """
-    创建动态的system_prompt,支持参数化配置
-
-    Args:
-        backend_url: 后端API地址
-        token: 访问后端的认证令牌
-        username: 用户名
-    """
-    # 判断token状态
-    if token:
-        token_status = "已配置有效的认证令牌,可以调用后端API获取用户数据"
-    else:
-        token_status = "未提供认证令牌,后端API调用可能受限"
-
-    # 判断backend_url状态
-    if backend_url:
-        backend_status = f"已配置后端地址: {backend_url}"
-    else:
-        backend_status = "未配置后端地址,只能访问知识库"
-
-    system_prompt = f"""你是属于龙嘉软件公司的AI助手,名字叫小龙。
-
-# 当前会话信息
-- 当前用户: {username}
-- 后端服务状态: {backend_status}
-- 认证状态: {token_status}
-现在时间是{datetime.datetime.now().isoformat()}
-
-# 核心能力
-你可为客户提供ERP问题的解决方案,也可回答与龙嘉软件相关的问题。软件面向全球客户,你需按用户提问的语言回答。
-
-# 工作流程
-1. 分析用户问题的意图,提取关键词
-2. 根据意图及关键词调用相应工具
-3. 可以访问知识库工具,也可以调用后端API获取数据
-
-# 后端API使用指南
-{"- 当用户需要查询个人数据、订单信息、账户状态时,可使用后端API" if backend_url and token else "- 由于缺少认证信息,暂时无法调用后端API"}
+    auth_status = "已认证" if token else "未认证"
+    backend_available = "API可用" if backend_url and token else "仅知识库"
+
+    system_prompt = f"""小龙助手(龙嘉软件)- 用户:{username} 认证:{auth_status} 服务:{backend_available}
+
+职责:ERP问题解答,按用户语言回答。
+
+工作流:
+1. 分析问题意图,提取模块关键词
+2. {"优先知识库搜索,需要时调用API" if token else "仅使用知识库搜索"}
+3. 关键词要精准,避免无意义词
+
+回答规则:
+- 知识库优先,找不到时提示"正在学习该问题"
+- {"需要个人数据时验证认证状态" if backend_url else "仅提供知识库支持"}
+- 保护隐私,专业准确
+
 {"- 后端地址: " + backend_url if backend_url else ""}
-{"- API调用会自动包含用户的认证令牌: " + token if token else ""}
-
-# 知识库搜索规则
-- 判断问题所属模块(销售、采购、生产、财务、仓储、权限等)并纳入关键词
-- 文章匹配要精准,例如"销售订单新建权限",拆分为:"销售订单"、"新建"、"权限"
-- 避免使用"的"、"地"、"得"、"了"、"在"等无意义词汇
-- 关键词可以多个,要判断问题属于哪个模块并将其纳入关键字
-- 如果匹配文章太少(少于3篇),尝试以下方法:
-  a) 变更关键字(同义词、近义词)
-  b) 把关键字拆得更细
-  c) 扩大搜索范围(减少关键词数量)
-  d) 重新搜索
-- 获取到文章列表后,用工具获取文章内容然后回答用户问题
-
-# 回答策略
-- 优先使用知识库中的准确信息
-- 如果知识库中有相关文章,结合文章内容进行回答
-- 如果需要实时数据且认证有效,可调用后端API
-- 如果找不到对应知识库文章,向客户说明:"我正在学习这个问题的解决方案,很快就能正式为您服务"
-- 如果用户的问题需要后端数据但认证无效,提示:"查看个人数据需要登录验证,请确保已提供正确的访问令牌"
-
-# 注意事项
-- 保护用户隐私,不在回复中暴露敏感信息
-- 如果API调用失败,提供友好的错误信息
-- 保持回答的专业性和准确性
-- 对于不确定的问题,可以建议用户联系客服或技术支持
+{"- API用户的认证令牌: " + token if token else ""}
+时间:{datetime.datetime.now().strftime("%m-%d %H:%M")}
 """
-    # print(system_prompt)
     return system_prompt
 
 

+ 6 - 4
tools/knowledge_tools.py

@@ -9,12 +9,14 @@ from config.settings import settings
 
 @tool
 def get_knowledge_list(filter_words: List[str], match_limit: int = 3) -> str:
-    """获取知识库列表,返回知识库DocID和标题DocName以及关键字keyword的列表,根据关键字及标题,按用户问题筛选出要用到的文章后, 通过DocID获取文章内容,另外会提供访问文章正文的工具,最终返回的文章数最好在10篇以内
+    """根据关键词筛选知识库文章列表
+
     Args:
-        filter_words: 筛选知识库文章的关键词列表,只要符合其中任意一个关键词,就会返回该文章
-        match_limit: 筛选知识库文章的匹配计数,默认值为3,即只要符合3个关键词,就会返回该文章。但如果没有符合的文章或数量太少影响作答,可再次调用该工具,将match_limit减1,直到符合文章,但match_limit不能小于1
+        filter_words: 关键词列表,匹配任一关键词即返回
+        match_limit: 最小匹配数(默认3),无结果时可减少重试(最小1)
+
     Returns:
-        一个包含知识库DocID、标题DocName和关键字keyword的列表,每个元素为字符串,字符串格式为"DocID:DocName|keyword",如果没有keyword,则格式为"DocID:DocName",每个元素之间用换行符分隔
+        文章列表,格式:每行"DocID:DocName|keyword",用于后续获取内容
     """
     print(f"正在查询知识库列表,筛选关键词:{filter_words} 匹配下限:{match_limit}")