diff --git a/backend/app/agent/question_analyzer.py b/backend/app/agent/question_analyzer.py index 1823c26..e93ccf0 100644 --- a/backend/app/agent/question_analyzer.py +++ b/backend/app/agent/question_analyzer.py @@ -139,11 +139,17 @@ class QuestionAnalyzer: 请分析以下维度: 1. **问题类型** - - stock_analysis: 针对特定股票的分析(如"贵州茅台怎么样"、"分析比亚迪"、"AAPL走势") - - market_overview: 市场整体分析(如"最近有什么投资机会"、"现在适合买股票吗") + - stock_analysis: 针对**特定单只股票**的分析(如"贵州茅台怎么样"、"分析比亚迪"、"AAPL走势") + **注意**:如果用户问的是"板块"、"行业"、"概念股"等,这不是stock_analysis,而是market_overview + - market_overview: 市场整体分析、行业板块分析、投资机会(如"最近有什么投资机会"、"商业航天板块怎么样"、"新能源行业走势"、"现在适合买股票吗") - knowledge: 金融知识问答(如"什么是MACD"、"如何看K线图") - chat: 一般对话(如"你好"、"在吗") +**重要**:判断是stock_analysis还是market_overview的关键: +- 如果提到具体的公司名称或股票代码 → stock_analysis +- 如果提到"板块"、"行业"、"概念"、"赛道"、"领域" → market_overview +- 如果问"哪些股票"、"什么机会" → market_overview + 2. **用户关注维度**(如果是stock_analysis) 分析用户想了解哪些方面: - price_trend: 价格走势、涨跌情况、最新价格 diff --git a/backend/app/agent/smart_agent.py b/backend/app/agent/smart_agent.py index f11d928..b6702b3 100644 --- a/backend/app/agent/smart_agent.py +++ b/backend/app/agent/smart_agent.py @@ -1197,40 +1197,27 @@ MA60:{f"{ma['ma60']:.2f}" if ma['ma60'] else '计算中'} intent_analysis: Dict[str, Any], message: str ) -> Dict[str, Any]: - """处理宏观金融问题""" - keywords = intent_analysis.get('keywords', []) + """处理宏观金融问题(智能模式)""" description = intent_analysis.get('description', '') + keywords = intent_analysis.get('keywords', []) - logger.info(f"处理宏观问题: {description}") + logger.info(f"[智能模式] 处理宏观问题: {description}") try: - # 使用LLM进行分析(基于Tushare数据和公开信息) + # 使用智能、自然的prompt prompt = f"""你是一位专业的金融分析师。用户询问了宏观金融问题。 用户问题:{message} -问题分析:{description} -关键词:{', '.join(keywords)} +请用自然、专业的语言回答用户的问题。不要使用固定的格式或标题,而是像和朋友聊天一样,直接回答用户关心的内容。 -请基于你的金融知识和市场经验,给出专业且易懂的分析: - -## 市场现状分析 -简要说明当前市场整体情况和主要影响因素(分段说明,每个要点独立成段) - -## 趋势判断 -- 短期趋势(1-2周) -- 中期展望(1-3个月) - -## 投资建议 -- 具体的投资策略建议 -- 需要关注的风险点 - -写作要求: -1. 语言简洁专业但易懂,避免过度修饰 -2. 分析要客观理性,基于事实和数据 -3. 每个分析点独立成段,段落之间用空行分隔 -4. 控制在400-500字 -5. 最后声明:"以上分析仅供参考,不构成投资建议。股市有风险,投资需谨慎。" +要求: +- 直接回答用户的问题,不要添加"【宏观市场分析】"等标题 +- 根据问题的具体内容调整回答的重点 +- 语言自然、专业但易懂 +- 如果用户问的是短期趋势,重点讲短期;如果问的是投资机会,重点讲机会 +- 控制在300-500字 +- 最后声明:"以上分析仅供参考,不构成投资建议。" """ analysis = await self._call_llm_async( @@ -1241,29 +1228,17 @@ MA60:{f"{ma['ma60']:.2f}" if ma['ma60'] else '计算中'} if analysis: return { - "message": f"【宏观市场分析】\n\n{analysis}", + "message": analysis, "metadata": {"type": "macro_analysis"} } except Exception as e: logger.error(f"宏观问题处理失败: {e}") - # 降级方案:提供友好的引导 + # 降级方案 return { - "message": f"""我理解您想了解:{description} - -目前我可以帮您: -• 📊 分析具体股票的走势和投资价值 -• 📈 查看大盘指数(如上证指数、深证成指) -• 📚 解答金融投资相关问题 - -您可以更具体地问我,比如: -• "现在上证指数怎么样" -• "分析一下创业板的走势" -• "最近哪些行业比较热门" - -请告诉我您想了解什么?""", - "metadata": {"type": "guide"} + "message": f"抱歉,我暂时无法回答这个问题。您可以问我具体股票或指数的分析。", + "metadata": {"type": "error"} } async def _handle_knowledge_question( @@ -1271,34 +1246,24 @@ MA60:{f"{ma['ma60']:.2f}" if ma['ma60'] else '计算中'} intent_analysis: Dict[str, Any], message: str ) -> Dict[str, Any]: - """处理金融知识问答""" + """处理金融知识问答(智能模式)""" description = intent_analysis.get('description', '') - keywords = intent_analysis.get('keywords', []) - logger.info(f"处理知识问答: {description}") + logger.info(f"[智能模式] 处理知识问答: {description}") - # 直接使用LLM回答 + # 使用智能、自然的prompt prompt = f"""你是一位专业的金融教育专家。用户询问了金融知识问题。 用户问题:{message} -请用通俗易懂的语言解释这个概念或回答这个问题: +请用自然、通俗的语言回答用户的问题。不要使用固定的格式(如"## 核心概念"),而是像老师给学生讲解一样,直接、清晰地解释。 -## 核心概念 -- 清晰定义和解释 - -## 实际应用 -- 如何在投资中应用 -- 注意事项 - -## 举例说明 -- 用简单的例子帮助理解 - -写作要求: -1. 语言通俗易懂,避免过多专业术语 -2. 如果使用专业术语,要简单解释 -3. 控制在300-400字 -4. 重点是帮助用户理解,而不是炫耀知识 +要求: +- 直接回答问题,不要添加"【金融知识解答】"等标题 +- 用通俗易懂的语言,避免过多专业术语 +- 如果必须用专业术语,简单解释一下 +- 可以举例子帮助理解 +- 控制在200-400字 """ try: @@ -1310,7 +1275,7 @@ MA60:{f"{ma['ma60']:.2f}" if ma['ma60'] else '计算中'} if answer: return { - "message": f"【金融知识解答】\n\n{answer}", + "message": answer, "metadata": {"type": "knowledge"} } @@ -1327,46 +1292,35 @@ MA60:{f"{ma['ma60']:.2f}" if ma['ma60'] else '计算中'} intent_analysis: Dict[str, Any], message: str ) -> Dict[str, Any]: - """处理一般对话,智能引导用户""" + """处理一般对话(智能模式)""" description = intent_analysis.get('description', '') - logger.info(f"处理一般对话: {description}") + logger.info(f"[智能模式] 处理一般对话: {description}") - # 使用LLM生成友好的引导回复 - prompt = f"""你是一位专业且友好的金融智能助手。用户发来了一条消息,但不够具体。 + # 使用智能、自然的prompt + prompt = f"""你是一位专业且友好的金融智能助手。用户发来了一条消息。 用户消息:{message} -问题分析:{description} -你的任务是: -1. 如果是问候(如"你好"、"在吗"),友好回应并介绍你的能力 -2. 如果问题不明确(如"帮我"、"看看"),礼貌地询问用户想了解什么 -3. 如果可能与金融相关但不具体,给出具体的提问示例引导用户 +请用自然、友好的语言回应用户。不要使用固定的格式,而是像真人对话一样。 -你可以提供的服务: -• 📊 股票分析 - 分析个股走势、技术指标、基本面 -• 📈 市场观察 - 解读大盘走势、行业热点、投资机会 -• 📚 知识问答 - 解答金融投资相关问题 - -回复要求: -1. 语气友好、专业但不生硬 -2. 简洁明了,不要太长(150字以内) -3. 给出2-3个具体的提问示例 -4. 不要使用"抱歉"、"无法理解"等负面词汇 -5. 用emoji让回复更友好(但不要过度使用) - -直接返回回复内容,不要有其他格式。""" +要求: +- 如果是问候(如"你好"),友好回应并简单介绍你能做什么 +- 如果问题不明确,礼貌地询问用户想了解什么 +- 语言自然、友好,不要太正式 +- 控制在100-200字 +""" try: - reply = await self._call_llm_async( + response = await self._call_llm_async( messages=[{"role": "user", "content": prompt}], temperature=0.8, - max_tokens=400 + max_tokens=500 ) - if reply: + if response: return { - "message": reply, + "message": response, "metadata": {"type": "chat"} }