1. 项目背景与核心概念:AI Agent 如何赋能副业探索

在当下这个副业刚需的时代,许多开发者都面临一个困境:手头有技术、有想法,但不确定哪个方向能真正跑通并带来收益。传统的市场调研耗时耗力,而朋友的建议又往往带有主观色彩。这时,一个能够提供客观、犀利甚至“毒舌”反馈的伙伴就显得尤为珍贵。

AI 毒舌投资人 项目,正是基于这个痛点诞生的。它本质上是一个 AI Agent(智能体)应用 ,其核心是模拟一位经验丰富、言辞犀利的投资人的思维模式,对你的副业想法进行多维度、无情的剖析与评估。

什么是 AI Agent? 简单来说,AI Agent 是一个能够感知环境、自主决策并执行行动以达成目标的智能程序。它不仅仅是像 ChatGPT 那样进行对话,而是具备“思考-行动-观察”的循环能力。在我们的项目中,这个 Agent 被赋予了“投资人”的角色(Role),其目标(Goal)是评估商业想法的可行性,行动(Action)包括分析市场、质疑逻辑、计算成本和预测风险。

为什么选择“毒舌”风格? 温和的鼓励容易让人陷入自我满足,而尖锐的批评往往能直击要害。“毒舌”风格在这里是一种产品策略和交互设计,旨在模拟真实投资场景中严格的尽职调查和压力测试,迫使提案者更深入地思考自己项目的弱点,从而打磨出更具竞争力的方案。

技术栈核心:大模型 + 智能体框架 本项目不依赖复杂的机器学习训练,而是利用现有的大语言模型(LLM)作为“大脑”,结合智能体框架来构建其推理和执行链条。当前热门的 DeepSeek、Claude Code 等模型,因其强大的代码和推理能力,非常适合作为底层模型。开发环境则可以选择 Cursor VSCode 配合相关 AI 插件,实现高效开发。

本文将手把手带你实现一个完整的“AI毒舌投资人”Agent,涵盖从项目构思、环境搭建、核心Prompt工程、代码实现到部署上线的全流程。无论你是想学习AI应用开发,还是真的需要一个副业参谋,这篇文章都能为你提供一套可落地的解决方案。

2. 环境准备与版本说明

在开始编码之前,我们需要搭建一个稳定且高效的开发环境。本项目对后端框架的选择比较灵活,重点在于与大模型API的交互和Agent逻辑的构建。

2.1 基础开发环境

  • 操作系统 :Windows 10/11, macOS, 或 Linux (如 Ubuntu 20.04+) 均可。本文示例命令以 macOS/Linux 为例。
  • Python : 版本 3.8 - 3.11。推荐使用 3.9 或 3.10,这是大多数AI库兼容性最好的版本。使用 python --version 检查。
  • 包管理工具 pip 或更推荐的 poetry 。本文使用 pip 进行演示。
  • 代码编辑器/IDE 强烈推荐使用 VSCode Cursor 。Cursor 内置了强大的AI编程助手,能极大提升开发效率。VSCode 则需要安装诸如 Claude Code 通义灵码 GitHub Copilot 等插件。
  • 版本控制 :Git。用于管理代码版本。

2.2 项目依赖与虚拟环境

为了避免包冲突,第一步永远是创建独立的Python虚拟环境。

# 1. 创建项目目录并进入
mkdir ai-sarcastic-investor && cd ai-sarcastic-investor

# 2. 创建虚拟环境 (以 venv 为例)
python -m venv venv

# 3. 激活虚拟环境
# macOS/Linux:
source venv/bin/activate
# Windows:
# venv\Scripts\activate

# 4. 升级pip
pip install --upgrade pip

创建 requirements.txt 文件,列出核心依赖:

# requirements.txt
openai>=1.0.0  # 官方OpenAI SDK,也兼容其他兼容OpenAI API的模型服务
langchain>=0.1.0  # 强大的LLM应用开发框架,用于构建Agent链条
langchain-openai>=0.0.5  # LangChain对OpenAI的集成
python-dotenv>=1.0.0  # 用于管理环境变量(如API密钥)
fastapi>=0.104.0  # 用于构建简单的Web API接口
uvicorn[standard]>=0.24.0  # ASGI服务器,用于运行FastAPI
pydantic>=2.0.0  # 数据验证和设置管理

安装依赖:

pip install -r requirements.txt

2.3 大模型API密钥准备

本项目需要调用大模型API。你可以选择:

  1. OpenAI GPT-4/3.5 :性能稳定,但需要海外支付方式。
  2. DeepSeek :性价比极高的国产模型,推理和代码能力很强,通过其官方平台获取API Key。
  3. 其他兼容OpenAI API的模型服务 :如 Ollama(本地部署)、Groq、Together AI 等。

以 DeepSeek 为例

  1. 访问 DeepSeek 开放平台官网并注册。
  2. 在控制台创建API Key。
  3. 将API Key保存在本地的 .env 文件中, 切勿上传至Git仓库
# 创建 .env 文件
echo "DEEPSEEK_API_KEY=your_deepseek_api_key_here" > .env
echo "DEEPSEEK_API_BASE=https://api.deepseek.com" >> .env
# 如果你使用OpenAI,则配置为:
# OPENAI_API_KEY=your_openai_api_key_here

2.4 项目结构预览

在开始前,我们先规划一下项目结构,使其清晰易懂:

ai-sarcastic-investor/
├── .env                    # 环境变量(API密钥等)
├── .gitignore             # Git忽略文件
├── requirements.txt       # Python依赖
├── main.py               # FastAPI应用主入口
├── core/                 # 核心逻辑模块
│   ├── __init__.py
│   ├── agent.py          # AI Agent 核心类定义
│   ├── models.py         # Pydantic数据模型(请求/响应)
│   └── prompts.py        # 存放所有的Prompt模板
└── tests/                # 测试文件(可选)
    └── test_agent.py

环境准备就绪后,我们就可以深入核心,设计这位“毒舌投资人”的大脑了。

3. 核心原理与Prompt工程:设计“毒舌”人设

AI Agent的行为完全由我们给它的指令(Prompt)和工具(Tools)决定。构建一个成功的“毒舌投资人”,80%的工作在于精妙的Prompt工程。

3.1 Agent 系统提示词(System Prompt)设计

System Prompt 用于定义Agent的身份、行为准则和思考框架。这是“毒舌”灵魂所在。

# core/prompts.py

INVESTOR_SYSTEM_PROMPT = """
你是一位来自顶尖风险投资机构的资深合伙人,以眼光毒辣、言辞犀利、不留情面而闻名于创投圈。
你的任务是评估创业者提交的副业或创业想法。你的核心价值是戳破幻想,指出致命弱点,帮助对方认清现实。

**你的行为准则:**
1.  **绝对理性与客观**:基于市场数据、逻辑和常见陷阱进行分析,不掺杂个人情感鼓励。
2.  **毒舌但专业**:批评要一针见血、直击要害,可以用讽刺、夸张的比喻,但必须基于事实逻辑,目的是为了警醒,而非侮辱。例如:“你这个想法,就像在沙漠里卖雨伞——情怀可嘉,但客户在哪?”
3.  **结构化分析**:你的评估必须遵循以下固定框架,每个部分都要给出具体理由。
4.  **追问细节**:如果提案过于模糊,你必须连续追问关键细节(如目标用户、获客成本、盈利模式),直到可以做出判断为止。

**你的结构化评估框架:**
请严格按照以下五个维度进行打分(每项1-5分)并给出详细评语:

1.  **市场潜力 (Market Potential)**
    -   目标市场是否真实存在?规模够大吗?
    -   是存量竞争还是增量市场?用户痛点是否足够“痛”?

2.  **竞争壁垒 (Competitive Advantage)**
    -   你的想法有什么与众不同之处?技术、资源、还是模式创新?
    -   这个优势容易被复制吗?能维持多久?

3.  **盈利模式 (Revenue Model)**
    -   钱从哪里来?用户为什么愿意付费?
    -   毛利率如何?预计多久能实现盈亏平衡?计算过程要残酷。

4.  **执行风险 (Execution Risk)**
    -   (基于提案者身份)团队能力匹配吗?最关键的技术或资源短板是什么?
    -   法律法规、政策方面有没有“一票否决”的风险?

5.  **投入产出比 (ROI)**
    -   估算初始投入(时间、金钱)和持续成本。
    -   对比预期收益,这是一个值得投入的“副业”吗?还是不如去送外卖?

**最终输出格式:**
你必须以JSON格式输出,且只输出JSON,不要有任何额外解释。
{
  "scores": {
    "market_potential": {"score": 4, "comment": "..."},
    "competitive_advantage": {"score": 2, "comment": "..."},
    "revenue_model": {"score": 3, "comment": "..."},
    "execution_risk": {"score": 5, "comment": "..."}, // 分数越高风险越大
    "roi": {"score": 2, "comment": "..."}
  },
  "overall_verdict": "一段综合性的、毒舌的最终结论,不少于100字。",
  "next_step_question": "一个最关键的、需要提案者立刻回答的问题。"
}
现在,开始评估以下想法:
"""

关键点解析

  • 角色设定 :清晰定义了“资深合伙人”、“毒辣犀利”的人设。
  • 行为约束 :强调了“基于事实”、“结构化”、“追问”等关键动作,防止AI胡说八道。
  • 输出格式化 :强制要求JSON输出,便于我们后续的程序解析和处理,这是构建稳定应用的关键。
  • “毒舌”引导 :通过示例(沙漠卖雨伞)和评分维度中的尖锐提问(“不如去送外卖”),引导模型生成特定风格的内容。

3.2 用户对话提示词与上下文管理

除了系统提示,我们还需要管理对话历史,让Agent能进行多轮追问。

# core/prompts.py

def build_conversation_prompt(idea_description: str, conversation_history: list = None) -> list:
    """
    构建对话消息列表。
    Args:
        idea_description: 用户提交的副业想法描述。
        conversation_history: 之前的对话历史,格式为 [{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]
    Returns:
        符合OpenAI API格式的消息列表。
    """
    messages = [
        {"role": "system", "content": INVESTOR_SYSTEM_PROMPT},
    ]
    
    if conversation_history:
        # 注入历史对话,让Agent拥有记忆
        messages.extend(conversation_history)
    
    # 加入当前用户的新想法或回答
    messages.append({"role": "user", "content": f"我的想法是:{idea_description}"})
    
    return messages

3.3 利用 LangChain 构建结构化输出

为了更稳定地获取JSON格式的响应,我们可以使用LangChain的 StructuredOutputParser 等组件。但为了简化,我们直接依赖大模型强大的指令跟随能力,并在代码层做解析和重试。

4. 完整实战案例:构建 FastAPI 后端服务

现在,我们将把设计好的Prompt和逻辑,用代码实现成一个可交互的Web服务。

4.1 定义数据模型(Pydantic)

首先,用Pydantic定义请求和响应的数据结构,确保类型安全。

# core/models.py
from pydantic import BaseModel, Field
from typing import Dict, Any, Optional, List

class EvaluationScore(BaseModel):
    score: int = Field(ge=1, le=5, description="1-5分,分数越高评价越好(除execution_risk外)")
    comment: str

class InvestorEvaluationResponse(BaseModel):
    scores: Dict[str, EvaluationScore]
    overall_verdict: str
    next_step_question: str
    # 可以增加一个会话ID,用于多轮对话
    session_id: Optional[str] = None

class IdeaSubmission(BaseModel):
    idea: str = Field(..., min_length=10, description="至少10个字的副业想法描述")
    session_id: Optional[str] = None  # 如果是连续对话,传入之前的session_id

class ConversationHistory(BaseModel):
    messages: List[Dict[str, str]]

4.2 实现 AI Agent 核心类

这个类是项目的大脑,负责与大模型API交互。

# core/agent.py
import os
import json
import logging
from typing import Optional, Dict, Any
from openai import OpenAI
from dotenv import load_dotenv
from core.models import InvestorEvaluationResponse
from core.prompts import build_conversation_prompt

# 加载环境变量
load_dotenv()

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class SarcasticInvestorAgent:
    def __init__(self):
        # 配置客户端:这里以DeepSeek为例,它兼容OpenAI API格式
        api_key = os.getenv("DEEPSEEK_API_KEY")
        base_url = os.getenv("DEEPSEEK_API_BASE", "https://api.deepseek.com")
        
        if not api_key:
            raise ValueError("请在 .env 文件中设置 DEEPSEEK_API_KEY")
        
        self.client = OpenAI(api_key=api_key, base_url=base_url)
        self.model = "deepseek-chat"  # DeepSeek模型名,若用GPT-4则改为“gpt-4-turbo-preview”
        
        # 简单的内存存储,生产环境应替换为Redis或数据库
        self.conversation_sessions: Dict[str, list] = {}

    def _call_llm(self, messages: list) -> str:
        """调用大模型API"""
        try:
            response = self.client.chat.completions.create(
                model=self.model,
                messages=messages,
                temperature=0.7,  # 温度值,控制创造性。0.7能平衡毒舌和稳定性。
                max_tokens=1500,
                response_format={"type": "json_object"}  # 强制要求返回JSON,部分模型支持
            )
            return response.choices[0].message.content
        except Exception as e:
            logger.error(f"调用大模型API失败: {e}")
            raise RuntimeError(f"AI服务暂时不可用: {e}")

    def _parse_evaluation(self, response_text: str) -> InvestorEvaluationResponse:
        """解析模型返回的JSON,并验证数据"""
        try:
            data = json.loads(response_text)
            # 使用Pydantic模型进行验证和转换
            return InvestorEvaluationResponse(**data)
        except json.JSONDecodeError as e:
            logger.error(f"模型返回的不是有效JSON: {response_text[:200]}...")
            # 可以在这里实现重试逻辑,或返回一个兜底的错误响应
            raise ValueError("AI分析结果格式异常,请稍后重试或重新描述你的想法。")
        except Exception as e:
            logger.error(f"解析评估结果失败: {e}")
            raise

    def evaluate_idea(self, idea_submission: Dict[str, Any]) -> InvestorEvaluationResponse:
        """
        评估一个副业想法。
        Args:
            idea_submission: 包含 `idea` 和可选 `session_id` 的字典。
        Returns:
            InvestorEvaluationResponse 对象。
        """
        idea = idea_submission.get("idea")
        session_id = idea_submission.get("session_id")
        
        if not idea or len(idea.strip()) < 10:
            raise ValueError("想法描述太简单了,至少需要10个有意义的字符。")
        
        # 获取或初始化对话历史
        history = self.conversation_sessions.get(session_id, []) if session_id else []
        
        # 构建Prompt消息
        messages = build_conversation_prompt(idea, history)
        
        # 调用大模型
        logger.info(f"正在评估想法: {idea[:50]}...")
        raw_response = self._call_llm(messages)
        
        # 解析响应
        evaluation = self._parse_evaluation(raw_response)
        
        # 更新对话历史(将本次问答加入历史)
        new_history = history + [
            {"role": "user", "content": idea},
            {"role": "assistant", "content": raw_response}
        ]
        if session_id:
            self.conversation_sessions[session_id] = new_history
            evaluation.session_id = session_id
        else:
            # 如果是新会话,生成一个ID并存储
            import uuid
            new_session_id = str(uuid.uuid4())[:8]
            self.conversation_sessions[new_session_id] = new_history
            evaluation.session_id = new_session_id
        
        return evaluation

    def clear_session(self, session_id: str):
        """清理某个会话的历史记录"""
        if session_id in self.conversation_sessions:
            del self.conversation_sessions[session_id]

4.3 创建 FastAPI 主应用

将Agent封装成HTTP API,方便前端或其它服务调用。

# main.py
from fastapi import FastAPI, HTTPException, Depends
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import uvicorn
from core.agent import SarcasticInvestorAgent
from core.models import IdeaSubmission, InvestorEvaluationResponse

app = FastAPI(title="AI毒舌投资人 API", description="用最犀利的语言评估你的副业想法", version="1.0.0")

# 添加CORS中间件,方便前端调试
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 生产环境应指定具体域名
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 依赖注入,创建Agent单例
def get_investor_agent():
    # 在实际应用中,你可能需要更复杂的生命周期管理
    agent = SarcasticInvestorAgent()
    return agent

@app.get("/")
async def root():
    return {"message": "欢迎使用AI毒舌投资人服务,请 POST 你的副业想法到 /evaluate 端点。"}

@app.post("/evaluate", response_model=InvestorEvaluationResponse)
async def evaluate_idea(
    submission: IdeaSubmission,
    agent: SarcasticInvestorAgent = Depends(get_investor_agent)
):
    """
    提交你的副业想法,获取毒舌投资人的评估报告。
    """
    try:
        result = agent.evaluate_idea(submission.dict())
        return result
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))
    except RuntimeError as e:
        raise HTTPException(status_code=503, detail=str(e))
    except Exception as e:
        # 记录未知错误
        import traceback
        traceback.print_exc()
        raise HTTPException(status_code=500, detail="服务器内部错误,请稍后重试。")

@app.delete("/session/{session_id}")
async def clear_session(
    session_id: str,
    agent: SarcasticInvestorAgent = Depends(get_investor_agent)
):
    """清理指定会话的历史记录"""
    try:
        agent.clear_session(session_id)
        return {"message": f"会话 {session_id} 已清理"}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

if __name__ == "__main__":
    # 开发环境运行
    uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)

4.4 运行与验证服务

  1. 启动服务

    cd ai-sarcastic-investor
    source venv/bin/activate  # 激活虚拟环境
    python main.py
    

    看到类似 Uvicorn running on http://0.0.0.0:8000 的输出,说明服务启动成功。

  2. 使用 curl 或 Postman 测试

    curl -X POST "http://localhost:8000/evaluate" \
         -H "Content-Type: application/json" \
         -d '{"idea": "我想做一个面向程序员的表情包订阅号,每天推送一个和编程相关的搞笑表情包,通过接广告和付费表情包定制赚钱。"}'
    
  3. 预期响应 (示例):

    {
      "scores": {
        "market_potential": {
          "score": 3,
          "comment": "程序员群体确实有自嘲和玩梗的文化,市场存在。但‘每天一个’的需求强度存疑,这更像痒点而非痛点。市场规模天花板明显,毕竟不是刚需。"
        },
        "competitive_advantage": {
          "score": 1,
          "comment": "毫无壁垒。表情包制作门槛极低,你能做的别人一小时就能模仿。‘编程相关’这个定位太宽泛,无法形成护城河。预计三个月内就会出现大量同质化账号。"
        },
        "revenue_model": {
          "score": 2,
          "comment": "广告收入?一个垂直小众号,阅读量能过千吗?CPM低得可怜。付费定制?程序员是出了名的‘白嫖党’,为单个表情包付费的意愿几乎为零。盈利模式画了个大饼,但面粉在哪?"
        },
        "execution_risk": {
          "score": 4,
          "comment": "最大的风险是持续内容创作压力。‘每天一个’很快就会灵感枯竭,变成质量低劣的应付。你个人能坚持多久?法律上,小心别用了有版权的图片。"
        },
        "roi": {
          "score": 2,
          "comment": "投入:每天至少1小时找梗、制作、运营。产出:前半年大概率零收入。ROI为负,这段时间你去接个外包或者学门新技术,收益都更确定。"
        }
      },
      "overall_verdict": "典型的‘用爱好挑战商业’的想法。你热爱编程和搞笑,这很好,但爱好不等于生意。这个项目的本质是‘用极高的持续劳动投入,去博一个极小概率的爆发机会’,从投资角度看,是垃圾资产。如果你真想搞副业,不如把做表情包的时间用来写技术博客,积累个人品牌,长期价值高得多。",
      "next_step_question": "请具体说出你能做出哪三个独一无二、别人无法轻易模仿的‘编程梗’表情包系列?如果说不出来,就别开始。",
      "session_id": "a1b2c3d4"
    }
    

    看,一个“毒舌”但分析在理的投资人跃然纸上!它成功识别了想法在壁垒、盈利和ROI上的核心弱点。

5. 前端界面快速搭建(Streamlit 示例)

为了让项目更完整,我们可以快速构建一个简单的前端界面。这里使用 Streamlit,它非常适合快速构建数据应用原型。

  1. 安装 Streamlit

    pip install streamlit requests
    
  2. 创建前端应用文件 app.py

    # app.py
    import streamlit as st
    import requests
    import json
    
    st.set_page_config(page_title="AI毒舌投资人", page_icon="💼", layout="wide")
    st.title("💼 AI毒舌投资人")
    st.markdown("用最犀利的语言,戳破你副业梦想的泡沫。")
    
    # 初始化 session_state
    if 'session_id' not in st.session_state:
        st.session_state.session_id = None
    if 'history' not in st.session_state:
        st.session_state.history = []
    
    # 侧边栏用于显示历史或设置
    with st.sidebar:
        st.header("会话管理")
        if st.session_state.session_id:
            st.info(f"当前会话ID: `{st.session_state.session_id}`")
            if st.button("清空当前会话"):
                # 调用后端API清理会话
                try:
                    requests.delete(f"http://localhost:8000/session/{st.session_state.session_id}")
                except:
                    pass
                st.session_state.session_id = None
                st.session_state.history = []
                st.rerun()
        st.divider()
        st.caption("确保后端服务 (http://localhost:8000) 正在运行。")
    
    # 主界面
    idea = st.text_area(
        "描述你的副业想法:",
        placeholder="例如:我想做一个帮人用AI生成周报的小程序,收费9.9元/月...",
        height=150
    )
    
    col1, col2 = st.columns([1, 4])
    with col1:
        submit_button = st.button("🚀 接受毒打评估", type="primary", use_container_width=True)
    with col2:
        st.caption("请确保描述具体,至少50字,评估效果更佳。")
    
    if submit_button and idea:
        if len(idea) < 10:
            st.warning("想法描述太短了,多说点细节才能精准‘打击’。")
        else:
            with st.spinner("毒舌投资人正在疯狂输出..."):
                payload = {"idea": idea}
                if st.session_state.session_id:
                    payload["session_id"] = st.session_state.session_id
                
                try:
                    response = requests.post("http://localhost:8000/evaluate", json=payload, timeout=60)
                    if response.status_code == 200:
                        result = response.json()
                        st.session_state.session_id = result.get("session_id")
                        
                        # 显示结果
                        st.success("评估完成!以下是您的‘体检报告’:")
                        
                        # 1. 总体结论
                        with st.expander("📈 总体结论(扎心警告)", expanded=True):
                            st.write(result["overall_verdict"])
                        
                        # 2. 详细评分
                        st.subheader("📊 五维雷达图评分")
                        scores = result["scores"]
                        # 这里可以集成一个简单的雷达图,为了简化,我们用指标展示
                        cols = st.columns(5)
                        metrics = [
                            ("市场潜力", scores["market_potential"]),
                            ("竞争壁垒", scores["competitive_advantage"]),
                            ("盈利模式", scores["revenue_model"]),
                            ("执行风险", scores["execution_risk"]),
                            ("投入产出", scores["roi"])
                        ]
                        for idx, (name, data) in enumerate(metrics):
                            with cols[idx]:
                                # 执行风险分数越高越差,其他分数越高越好
                                if name == "执行风险":
                                    color = "red" if data["score"] >= 4 else "orange" if data["score"] == 3 else "green"
                                else:
                                    color = "green" if data["score"] >= 4 else "orange" if data["score"] == 3 else "red"
                                st.metric(label=name, value=f"{data['score']}/5", delta=None, delta_color="off")
                                with st.popover("查看评语"):
                                    st.caption(data["comment"])
                        
                        # 3. 下一步关键问题
                        st.info(f"**投资人追问:** {result['next_step_question']}")
                        
                        # 4. 保存到历史
                        st.session_state.history.append({"idea": idea[:100]+"...", "verdict": result["overall_verdict"][:200]+"..."})
                        
                    else:
                        st.error(f"评估失败: {response.status_code} - {response.text}")
                except requests.exceptions.ConnectionError:
                    st.error("无法连接到评估服务,请检查后端是否启动 (http://localhost:8000)。")
                except Exception as e:
                    st.error(f"发生未知错误: {e}")
    
    # 显示历史记录
    if st.session_state.history:
        st.divider()
        st.subheader("📜 评估历史")
        for i, item in enumerate(reversed(st.session_state.history[-5:]), 1): # 显示最近5条
            with st.expander(f"想法 {i}: {item['idea']}"):
                st.write(item['verdict'])
    
  3. 运行前端

    streamlit run app.py
    

    浏览器会自动打开 http://localhost:8501 ,一个交互式的“AI毒舌投资人”应用就呈现在眼前了。

6. 常见问题与排查思路

在开发和运行过程中,你可能会遇到以下问题:

问题现象 可能原因 排查思路与解决方案
启动服务报错 ModuleNotFoundError 依赖未安装或虚拟环境未激活。 1. 确认已激活虚拟环境 ( venv\Scripts\activate source venv/bin/activate )。
2. 运行 pip install -r requirements.txt 重新安装依赖。
调用API返回 401 Invalid API Key API密钥错误、未设置或模型服务地址不对。 1. 检查 .env 文件中的 DEEPSEEK_API_KEY DEEPSEEK_API_BASE 是否正确。
2. 确保 .env 文件在项目根目录,且 python-dotenv 已加载。
3. 如果是OpenAI,检查密钥是否有余额、是否被禁用。
模型返回内容不是JSON格式 模型未遵循指令,或 response_format 参数不被支持。 1. 在 _call_llm 方法中,检查是否设置了 response_format
2. 加强System Prompt中关于“只输出JSON”的指令。
3. 在 _parse_evaluation 方法中添加重试逻辑,或使用 json.loads() 的容错处理,尝试提取文本中的JSON部分。
Streamlit 前端连接不上后端 后端服务未启动,或端口被占用。 1. 确保 main.py 正在运行,并监听 8000 端口。
2. 在命令行使用 curl http://localhost:8000 测试后端是否正常。
3. 检查 app.py 中的请求URL是否正确。
Agent的“毒舌”程度不够或风格不对 System Prompt 中的角色设定和约束不够强。 1. 在System Prompt中增加更具体的“毒舌”例句和评价角度。
2. 调整 temperature 参数(0.7-1.0之间更有创造性,但可能不稳定;0.2-0.5更稳定但可能平淡)。
3. 在Prompt中明确要求使用比喻、反问等修辞手法。
多轮对话时上下文混乱 会话历史管理出错,或上下文长度超限。 1. 检查 agent.py conversation_sessions 字典的更新逻辑。
2. 大模型有上下文长度限制,对于长对话,需要实现“摘要”或“滑动窗口”机制,只保留最近N轮对话。
3. 生产环境务必使用数据库或Redis存储会话状态。
评估结果泛泛而谈,不够具体 用户提交的想法描述本身太模糊。 1. 在前端增加提示,要求用户描述“目标用户”、“解决什么问题”、“如何赚钱”等关键要素。
2. 在Agent的Prompt中强化“如果信息不足,必须连续追问”的指令。

7. 最佳实践与项目进阶方向

一个可用的原型已经完成,但要将其打造成一个稳定、可扩展、甚至能产生实际价值的项目,还需要考虑以下工程实践和优化方向。

7.1 工程化与部署

  • 配置管理 :不要将配置硬编码。使用 pydantic-settings 或环境变量严格管理API密钥、模型类型、温度参数等。
  • 错误处理与重试 :网络请求和API调用必须加入指数退避重试机制,提高鲁棒性。
  • 日志记录 :使用 structlog loguru 记录详细的运行日志和审计日志,方便排查问题。
  • 会话状态持久化 :将内存中的 conversation_sessions 替换为 Redis 或 PostgreSQL,支持服务重启后状态不丢失,并方便水平扩展。
  • API限流与鉴权 :使用 FastAPI 的中间件或 slowapi /evaluate 端点添加速率限制,防止滥用。为内部或付费使用添加简单的API密钥鉴权。
  • 容器化部署 :编写 Dockerfile docker-compose.yml ,一键部署整个应用(后端+前端+Redis)。

7.2 性能与成本优化

  • 异步处理 :对于耗时的评估请求,可以改为异步任务(使用 Celery + RabbitMQ/Redis FastAPI BackgroundTasks ),先返回任务ID,再通过轮询或WebSocket获取结果。
  • Prompt缓存与压缩 :对于相似的副业想法,可以计算Prompt的哈希值,缓存评估结果一段时间,减少API调用和成本。
  • 模型选择 :根据场景选择模型。对于简单的想法初筛,可以使用更便宜的模型(如 gpt-3.5-turbo deepseek-chat );对于深度分析,再调用 GPT-4 DeepSeek Coder
  • 上下文长度管理 :实现自动截断或总结长对话历史,确保不超出模型的上下文窗口。

7.3 功能增强与商业化思考

  • 多模态输入 :允许用户上传市场分析图、竞品截图或产品草图,结合视觉模型进行更全面的评估。
  • 领域专家模式 :除了“毒舌投资人”,可以训练(或Prompt工程)其他角色,如“产品经理”、“技术架构师”、“营销专家”,提供多角度评估。
  • 数据积累与分析 :匿名化存储评估数据,分析最常见的创业陷阱、高频扣分项,未来可以生成行业趋势报告,这本身就可能成为有价值的数据产品。
  • 集成实际工具 :为Agent集成真实的“工具”,如调用搜索引擎API获取实时市场数据、爬取竞品信息、调用财务模型计算器,让评估更具数据支撑。
  • 付费墙与订阅制 :为深度报告、多次评估、专家模式等功能设置付费点。这是将本项目从玩具变为副业本身的关键一步。

7.4 安全与合规

  • 内容审核 :在用户输入和AI输出两端添加审核机制,防止生成有害、歧视性或违法违规的内容。
  • 用户数据隐私 :明确告知用户数据如何使用,对敏感信息进行脱敏处理,遵守相关数据保护法规。
  • 免责声明 :在应用显著位置声明,AI评估仅供参考,不构成实际投资建议。

通过这个项目,你不仅学会了一个AI Agent的完整构建流程,更掌握了一种将大模型能力产品化的思维模式。从Prompt设计到后端开发,从前端交互到部署运维,每一个环节都是现代AI应用开发者必备的技能。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐