基于DeepSeek API构建AI毒舌投资人Agent:从商业点子验证到工程实现
🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度
最近在探索副业变现时,我发现很多朋友(包括我自己)都面临一个困境:手头有不错的点子,但要么缺乏启动资金,要么对商业逻辑一知半解,要么就是被“投资人”的温和反馈给“捧杀”了。一个想法,如果没人能一针见血地指出它的致命缺陷,那它大概率会倒在从想法到产品的半路上。
于是,我萌生了一个想法:能不能用 AI 做一个“毒舌投资人”?它不跟你谈情怀,只跟你聊数据、聊模式、聊风险,用最犀利的提问和逻辑,帮你把副业想法“逼”成一个真正能赚钱的方案。经过一番折腾,我基于 DeepSeek 的 API 和 Agent 框架,真的把这个“AI 毒舌投资人”给做出来了。它不仅会无情地拷问你的商业计划,还能调用联网搜索、分析市场数据,甚至帮你生成初步的代码框架。
本文将手把手带你从零开始,搭建一个属于你自己的“AI 毒舌投资人”Agent。无论你是想验证自己的副业点子,还是学习如何构建一个实用的 AI Agent,这篇文章都能给你一套完整的、可运行的代码和清晰的实现思路。我们将使用 Python、FastAPI,并深度集成 DeepSeek 的强大推理能力。
1. 项目核心概念与价值:为什么需要“毒舌投资人”?
在深入代码之前,我们首先要理解这个项目的核心价值。它不仅仅是一个聊天机器人,更是一个结构化的商业分析工具。
1.1 传统副业验证的痛点
很多开发者或创业者验证想法的方式很原始:找朋友聊聊、发个帖子问问、或者自己埋头就干。这通常会导致几个问题:
- 信息茧房:朋友往往出于情面给予鼓励,缺乏客观批判。
- 认知局限:个人对市场、竞品、商业模式的理解可能不全面。
- 效率低下:手动搜集资料、分析数据耗时耗力,容易半途而废。
- 缺乏系统性:思考是发散的,很难形成一个逻辑严密、可执行的商业计划。
1.2 “AI 毒舌投资人”的解决方案
我们的 AI Agent 旨在模拟一个经验丰富、言辞犀利、只关注投资回报率的真实投资人。它的核心工作模式是:
- 结构化提问:按照标准的商业计划书框架(如市场分析、用户画像、盈利模式、成本结构、风险控制)进行系统性提问。
- 批判性思维:不满足于表面答案,会持续追问“为什么”、“数据支撑是什么”、“你的壁垒在哪里”。
- 实时数据支持:通过联网搜索工具,获取最新的市场趋势、竞品信息、用户反馈,让分析基于事实而非空想。
- 可行性推演:帮助估算启动成本、预测现金流、分析关键成功因素和失败风险。
- 行动建议生成:在“拷问”结束后,能生成一份包含后续步骤、资源清单和风险提示的行动备忘录。
1.3 技术核心:DeepSeek Agent + 工具调用
本项目不是简单的 Prompt 工程,而是构建一个真正的AI Agent。Agent 的核心能力是“思考-行动-观察”的循环。我们将利用 DeepSeek-V4 模型强大的深度思考和推理能力,并结合Tool Calls(工具调用)功能,让 AI 能够主动使用联网搜索等工具来获取信息,从而做出更精准的判断。DeepSeek 官方提供了完善的 Agent 接入指南和像 Deep Code 这样的优秀示例,为我们构建复杂 Agent 提供了坚实基础。
2. 环境准备与核心技术栈
在开始编码前,请确保你的开发环境已就绪。本项目对新手友好,主要依赖 Python 生态。
2.1 基础环境要求
- 操作系统:Windows 10/11, macOS, 或 Linux (如 Ubuntu 20.04+)。本文示例在 macOS/Linux 环境下编写,Windows 用户请注意命令的微小差异(如使用
dir而非ls)。 - Python:版本 3.8 或更高。推荐使用 3.9+ 以获得最佳兼容性。
- 包管理工具:
pip(Python 自带)。 - 代码编辑器:VS Code (推荐,配合 Python 插件)、PyCharm 或任何你熟悉的编辑器。
- DeepSeek API Key:这是项目的核心。你需要前往 DeepSeek 开放平台 注册账号并获取 API Key。请妥善保管,不要泄露。
2.2 核心依赖库
我们将使用以下 Python 库:
openai:用于调用 DeepSeek API(因为 DeepSeek API 与 OpenAI API 格式兼容)。fastapi&uvicorn:用于构建一个简单的 Web 服务接口,方便我们通过浏览器或脚本与 Agent 交互。pydantic:用于数据验证和设置管理。python-dotenv:用于管理环境变量,安全地存储 API Key。requests:用于实现简单的联网搜索工具(示例)。
你可以通过以下命令一次性安装所有依赖:
# 创建并进入项目目录 mkdir ai-tough-investor && cd ai-tough-investor # 创建虚拟环境(推荐,避免包冲突) python -m venv venv # 激活虚拟环境 # macOS/Linux: source venv/bin/activate # Windows: # venv\Scripts\activate # 安装依赖 pip install openai fastapi uvicorn pydantic python-dotenv requests2.3 项目结构预览
我们先规划好项目目录,这有助于保持代码清晰:
ai-tough-investor/ ├── .env # 存储环境变量(API Key等) ├── .gitignore # Git忽略文件 ├── app/ │ ├── __init__.py │ ├── main.py # FastAPI 应用主入口 │ ├── agents/ │ │ ├── __init__.py │ │ └── tough_investor.py # “毒舌投资人”Agent核心逻辑 │ ├── tools/ │ │ ├── __init__.py │ │ └── web_search.py # 联网搜索工具实现 │ ├── config.py # 配置管理 │ └── schemas.py # 数据模型定义 ├── skills/ # 存放Agent Skills(高级功能,可选) │ └── business_analysis.md └── requirements.txt # 项目依赖列表接下来,我们一步步填充这些文件。
3. 核心配置与 DeepSeek API 接入
首先,我们需要安全地配置 DeepSeek API 的访问凭证。
3.1 创建配置文件与环境变量
在项目根目录创建.env文件,并填入你的 DeepSeek API Key:
# .env DEEPSEEK_API_KEY=sk-your-actual-api-key-here DEEPSEEK_BASE_URL=https://api.deepseek.com DEEPSEEK_MODEL=deepseek-chat # 或 deepseek-v4-pro 等,根据你的权限选择重要:务必把.env添加到.gitignore文件中,避免将密钥提交到代码仓库。
# .gitignore venv/ __pycache__/ *.pyc .env .DS_Store3.2 实现配置管理模块
创建app/config.py文件,使用pydantic来优雅地加载和管理配置:
# app/config.py from pydantic_settings import BaseSettings from typing import Optional class Settings(BaseSettings): """应用配置类,从环境变量加载配置""" deepseek_api_key: str deepseek_base_url: str = "https://api.deepseek.com" deepseek_model: str = "deepseek-chat" # 你可以在这里添加其他配置,比如服务器端口、日志级别等 app_port: int = 8000 app_host: str = "0.0.0.0" class Config: env_file = ".env" # 指定从 .env 文件加载 env_file_encoding = 'utf-8' # 创建全局配置实例 settings = Settings()注意:这里我们使用了pydantic-settings,如果你安装的是pydantic最新版(V2),它通常已包含。如果报错,可以运行pip install pydantic-settings单独安装。
3.3 初始化 DeepSeek 客户端
在app/main.py中,我们初始化 FastAPI 应用和 DeepSeek 客户端:
# app/main.py from fastapi import FastAPI, HTTPException from openai import OpenAI from app.config import settings import logging # 配置日志 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # 初始化 FastAPI 应用 app = FastAPI(title="AI Tough Investor API", description="一个毒舌的AI投资人助手") # 初始化 OpenAI 客户端(兼容DeepSeek API) # 注意:DeepSeek API 兼容 OpenAI SDK 的调用方式 client = OpenAI( api_key=settings.deepseek_api_key, base_url=settings.deepseek_base_url, ) @app.get("/") async def root(): return {"message": "AI Tough Investor 服务已启动", "status": "healthy"} @app.get("/health") async def health_check(): """健康检查端点""" return {"status": "up"}至此,基础的服务框架和 API 配置就完成了。你可以运行uvicorn app.main:app --reload --host 0.0.0.0 --port 8000来启动服务,访问http://localhost:8000/docs可以看到自动生成的 API 文档。
4. 构建“毒舌投资人”Agent 核心逻辑
这是本项目最核心的部分。我们将创建一个具有“人格”和“专业能力”的 Agent。
4.1 定义 Agent 的系统指令(System Prompt)
系统指令决定了 AI 的行为模式。我们的“毒舌投资人”需要具备批判性、结构化思维和商业知识。在app/agents/tough_investor.py中,我们首先定义这个核心指令:
# app/agents/tough_investor.py import logging from typing import List, Dict, Any, Optional from openai import OpenAI from app.config import settings logger = logging.getLogger(__name__) # “毒舌投资人”的系统指令 TOUGH_INVESTOR_SYSTEM_PROMPT = """ 你是一个经验丰富、言辞犀利、以结果为导向的风险投资人。你的名字是“犀牛资本”的合伙人。 你的核心任务是帮助创业者(用户)打磨他们的副业或创业想法,但你不会说任何客套话。 你的风格是直接、尖锐、注重数据和逻辑,目标是找出想法的所有潜在漏洞和风险。 请遵循以下原则进行对话: 1. **结构化分析**:每次评估一个想法,请按照以下框架逐步深入: a. **价值主张**:一句话说清楚解决什么痛点,为谁解决。 b. **市场规模**:要求提供或估算目标市场的规模、增长趋势。质疑数据的来源。 c. **用户获取**:追问具体的获客渠道、成本和转化率预测。 d. **盈利模式**:收入从哪里来?定价策略?客户生命周期价值(LTV)是多少? e. **成本结构**:启动和运营的主要成本是什么?边际成本如何? f. **竞争壁垒**:你的护城河是什么?技术?网络效应?还是先发优势? g. **关键风险**:列出最可能导致项目失败的3-5个风险。 2. **毒舌提问**:使用诸如“这想法烂大街了”、“你的数据是拍脑袋想的吗?”、“你凭什么觉得你能做成?”等尖锐但旨在激发深度思考的提问。避免温和的鼓励。 3. **要求证据**:对于任何主张(如“市场很大”、“用户喜欢”),要求提供数据、案例或逻辑推导证据。 4. **工具使用**:当你需要了解最新的市场信息、竞品动态或行业数据时,主动使用我提供的“联网搜索”工具。不要凭空臆测。 5. **输出结论**:在充分“拷问”后,给出一份简明的评估摘要,包括:可行性评分(1-10分)、最致命的短板、最优先要验证的假设、以及下一步行动建议。 现在,开始你的第一个项目评估。直接向用户提问:“说吧,你那个想赚钱的点子是什么?别啰嗦,直接说核心。” """这个 Prompt 设定了 Agent 的角色、行为规范和交互框架,是“毒舌”灵魂所在。
4.2 实现基础的对话函数
接下来,我们实现一个函数,用于与 DeepSeek 模型进行对话,并支持简单的对话历史管理:
# app/agents/tough_investor.py (续) class ToughInvestorAgent: def __init__(self, client: OpenAI): self.client = client self.model = settings.deepseek_model # 初始化对话历史,包含系统指令 self.conversation_history: List[Dict[str, str]] = [ {"role": "system", "content": TOUGH_INVESTOR_SYSTEM_PROMPT} ] def _add_message(self, role: str, content: str): """向对话历史中添加消息""" self.conversation_history.append({"role": role, "content": content}) def get_response(self, user_input: str) -> str: """ 处理用户输入,获取AI回复。 这是基础版本,尚未集成工具调用。 """ # 1. 将用户输入加入历史 self._add_message("user", user_input) try: # 2. 调用DeepSeek API response = self.client.chat.completions.create( model=self.model, messages=self.conversation_history, temperature=0.7, # 适当温度,保持一定创造性 max_tokens=2000, stream=False, # 非流式,先简单实现 ) # 3. 提取AI回复 ai_response = response.choices[0].message.content # 4. 将AI回复加入历史 self._add_message("assistant", ai_response) logger.info(f"AI Response generated. Token usage: {response.usage}") return ai_response except Exception as e: logger.error(f"调用DeepSeek API失败: {e}") return f"抱歉,犀牛资本的分析系统暂时宕机了。错误信息:{str(e)}。请检查你的网络和API配置。" def start_new_conversation(self): """开始一轮新的对话,清空历史(除系统指令)""" self.conversation_history = [ {"role": "system", "content": TOUGH_INVESTOR_SYSTEM_PROMPT} ] return "已开启新一轮拷问。说吧,你那个想赚钱的点子是什么?别啰嗦,直接说核心。"这个类封装了与 AI 对话的基本逻辑,并维护了对话上下文,使得 AI 能记住之前的讨论内容。
4.3 集成工具调用能力:让 Agent 能“联网搜索”
一个只会空谈的投资人是不合格的。我们需要赋予它获取实时信息的能力。我们将实现一个简单的联网搜索工具(示例使用 DuckDuckGo 的 HTML 抓取,实际生产环境建议使用 Serper、Exa 等付费 API 或官方搜索工具)。
首先,创建一个工具模块app/tools/web_search.py:
# app/tools/web_search.py import requests from typing import Dict, Any import logging from urllib.parse import quote_plus logger = logging.getLogger(__name__) def simple_web_search(query: str, max_results: int = 5) -> Dict[str, Any]: """ 一个简单的联网搜索工具(示例)。 注意:此示例使用 DuckDuckGo 的 HTML 响应,仅用于演示工具调用流程。 在实际项目中,你应该使用可靠的搜索 API(如 Serper、Exa、Google Custom Search)。 """ try: # 这是一个非常基础且可能不稳定的示例。实际请替换为可靠的搜索API。 url = f"https://html.duckduckgo.com/html/?q={quote_plus(query)}" headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36' } response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() # 简单提取文本(实际应用需要更复杂的HTML解析,如用BeautifulSoup) from html import unescape import re # 这是一个极其简化的文本提取,仅用于演示 text_content = re.sub('<[^<]+?>', ' ', response.text) text_content = unescape(text_content) text_content = ' '.join(text_content.split()[:500]) # 限制长度 result = { "query": query, "status": "success", "summary": f"关于 '{query}' 的搜索结果摘要(示例): {text_content[:300]}...", "note": "此为演示工具。真实项目请接入Serper/Exa等API获取结构化数据。" } logger.info(f"执行搜索: {query}") return result except Exception as e: logger.error(f"搜索工具执行失败: {e}") return { "query": query, "status": "error", "summary": f"搜索失败: {str(e)}", "note": "请检查网络或搜索服务配置。" } # 定义工具的描述,用于告诉AI这个工具能干什么 WEB_SEARCH_TOOL_DESCRIPTION = { "type": "function", "function": { "name": "simple_web_search", "description": "执行一次联网搜索,获取关于某个话题、公司、产品或市场的最新公开信息。当用户提到你不确定的事实、最新数据、竞品信息或市场趋势时,使用此工具。", "parameters": { "type": "object", "properties": { "query": { "type": "string", "description": "要搜索的关键词或问题,例如:'2024年中国咖啡市场规模'、'Notion AI 竞品分析'、'独立开发者变现模式'" } }, "required": ["query"] } } }然后,我们需要升级ToughInvestorAgent,使其支持在对话中调用工具。这涉及到处理 AI 返回的tool_calls信息。
# app/agents/tough_investor.py (升级版) import json # ... 保留之前的导入和 SYSTEM_PROMPT ... from app.tools.web_search import simple_web_search, WEB_SEARCH_TOOL_DESCRIPTION class ToughInvestorAgent: def __init__(self, client: OpenAI): self.client = client self.model = settings.deepseek_model self.conversation_history: List[Dict[str, Any]] = [ # 类型更宽泛 {"role": "system", "content": TOUGH_INVESTOR_SYSTEM_PROMPT} ] # 可用工具列表 self.available_tools = [WEB_SEARCH_TOOL_DESCRIPTION] # 工具名到实际函数的映射 self.tool_functions = { "simple_web_search": simple_web_search, } def _add_message(self, role: str, content: Any, **kwargs): """添加消息,支持 tool_calls 和 tool_call_id""" message = {"role": role, "content": content} if kwargs.get("tool_call_id"): message["tool_call_id"] = kwargs["tool_call_id"] if kwargs.get("name"): message["name"] = kwargs["name"] self.conversation_history.append(message) def _handle_tool_calls(self, tool_calls): """处理AI请求的工具调用""" tool_responses = [] for tool_call in tool_calls: func_name = tool_call.function.name func_to_call = self.tool_functions.get(func_name) if not func_to_call: response_content = f"错误:未知工具 {func_name}" else: try: # 解析AI传来的参数 arguments = json.loads(tool_call.function.arguments) logger.info(f"执行工具调用: {func_name},参数: {arguments}") # 调用工具函数 tool_result = func_to_call(**arguments) response_content = json.dumps(tool_result, ensure_ascii=False) except Exception as e: response_content = json.dumps({"error": str(e)}, ensure_ascii=False) logger.error(f"工具 {func_name} 执行异常: {e}") # 将工具执行结果作为一条消息加入历史 tool_responses.append({ "tool_call_id": tool_call.id, "role": "tool", "name": func_name, "content": response_content, }) return tool_responses def get_response(self, user_input: str) -> str: """处理用户输入,支持工具调用的完整流程""" self._add_message("user", user_input) final_response = "" max_iterations = 5 # 防止无限循环 current_iteration = 0 while current_iteration < max_iterations: current_iteration += 1 try: # 调用API,传入工具定义 response = self.client.chat.completions.create( model=self.model, messages=self.conversation_history, tools=self.available_tools, tool_choice="auto", # 让模型决定是否调用工具 temperature=0.7, max_tokens=2000, stream=False, ) message = response.choices[0].message # 检查AI是否想调用工具 if message.tool_calls: # 1. 将AI的“工具调用请求”加入历史 self.conversation_history.append({ "role": "assistant", "content": "", # 内容可能为空 "tool_calls": message.tool_calls }) # 2. 处理工具调用,获取结果 tool_responses = self._handle_tool_calls(message.tool_calls) # 3. 将所有工具执行结果加入历史 for resp in tool_responses: self._add_message(role=resp["role"], content=resp["content"], tool_call_id=resp["tool_call_id"], name=resp["name"]) # 继续循环,让AI基于工具结果生成最终回复 continue else: # AI 直接生成了最终文本回复 final_response = message.content self._add_message("assistant", final_response) break except Exception as e: logger.error(f"对话流程出错: {e}") final_response = f"系统处理对话时出错: {str(e)}" break if not final_response and current_iteration >= max_iterations: final_response = "分析过程过于复杂,已达到迭代上限。请简化你的问题或重新开始。" return final_response # start_new_conversation 方法保持不变 def start_new_conversation(self): self.conversation_history = [ {"role": "system", "content": TOUGH_INVESTOR_SYSTEM_PROMPT} ] return "已开启新一轮拷问。说吧,你那个想赚钱的点子是什么?别啰嗦,直接说核心。"现在,你的“毒舌投资人”已经具备了思考并主动使用联网搜索工具的能力!当它觉得需要查证市场数据或竞品信息时,会自动调用搜索工具。
5. 创建 Web API 与前端交互界面
为了让这个 Agent 更容易使用,我们通过 FastAPI 暴露几个简单的 HTTP 端点,并创建一个极简的前端页面。
5.1 完善 FastAPI 路由
更新app/main.py,集成我们的 Agent:
# app/main.py (更新版) from fastapi import FastAPI, HTTPException, Request from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from openai import OpenAI from app.config import settings from app.agents.tough_investor import ToughInvestorAgent import logging import uuid from typing import Dict logger = logging.getLogger(__name__) app = FastAPI(title="AI Tough Investor API", description="一个毒舌的AI投资人助手") client = OpenAI( api_key=settings.deepseek_api_key, base_url=settings.deepseek_base_url, ) # 内存中存储对话会话(生产环境应使用数据库) sessions: Dict[str, ToughInvestorAgent] = {} def get_or_create_agent(session_id: str) -> ToughInvestorAgent: """获取或创建一个Agent会话""" if session_id not in sessions: sessions[session_id] = ToughInvestorAgent(client) logger.info(f"创建新会话: {session_id}") return sessions[session_id] @app.get("/", response_class=HTMLResponse) async def read_root(): """返回一个简单的前端页面""" html_content = """ <!DOCTYPE html> <html> <head> <title>AI毒舌投资人</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> body { font-family: Arial, sans-serif; max-width: 800px; margin: 40px auto; padding: 20px; } #chatbox { border: 2px solid #333; border-radius: 10px; padding: 20px; height: 500px; overflow-y: auto; margin-bottom: 20px; background: #f9f9f9; } .message { margin: 10px 0; padding: 12px; border-radius: 8px; max-width: 80%%; } .user { background-color: #d1ecf1; align-self: flex-end; margin-left: auto; } .assistant { background-color: #f8d7da; align-self: flex-start; } .system { background-color: #fff3cd; font-style: italic; font-size: 0.9em; } #inputArea { display: flex; gap: 10px; } #userInput { flex-grow: 1; padding: 12px; border: 1px solid #ccc; border-radius: 6px; } button { padding: 12px 24px; background-color: #007bff; color: white; border: none; border-radius: 6px; cursor: pointer; } button:hover { background-color: #0056b3; } #controls { margin-top: 15px; display: flex; gap: 10px; } </style> </head> <body> <h1>🦏 AI毒舌投资人 (犀牛资本)</h1> <p><em>直接说出你的副业/创业点子,接受犀利的拷问吧!</em></p> <div id="chatbox"></div> <div id="inputArea"> <input type="text" id="userInput" placeholder="输入你的商业想法..." onkeypress="if(event.keyCode==13) sendMessage()"> <button onclick="sendMessage()">发送</button> </div> <div id="controls"> <button onclick="newSession()" style="background-color: #6c757d;">新对话</button> <button onclick="clearChat()" style="background-color: #dc3545;">清空记录</button> </div> <script> let sessionId = localStorage.getItem('sessionId') || generateSessionId(); localStorage.setItem('sessionId', sessionId); function generateSessionId() { return 'session_' + Math.random().toString(36).substr(2, 9); } function addMessage(role, content) { const chatbox = document.getElementById('chatbox'); const msgDiv = document.createElement('div'); msgDiv.className = 'message ' + role; msgDiv.innerHTML = `<strong>${role.toUpperCase()}:</strong><br>${content.replace(/\\n/g, '<br>')}`; chatbox.appendChild(msgDiv); chatbox.scrollTop = chatbox.scrollHeight; } async function sendMessage() { const input = document.getElementById('userInput'); const message = input.value.trim(); if (!message) return; addMessage('user', message); input.value = ''; try { const response = await fetch('/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ session_id: sessionId, message: message }) }); const data = await response.json(); addMessage('assistant', data.response); } catch (error) { addMessage('system', '请求失败: ' + error); } } async function newSession() { sessionId = generateSessionId(); localStorage.setItem('sessionId', sessionId); const response = await fetch('/new_session', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ session_id: sessionId }) }); const data = await response.json(); document.getElementById('chatbox').innerHTML = ''; addMessage('assistant', data.response); } function clearChat() { document.getElementById('chatbox').innerHTML = ''; } // 页面加载时,如果有历史会话,可以加载最后一条消息(这里简化,直接显示欢迎语) window.onload = function() { addMessage('assistant', '你好,我是犀牛资本的合伙人。说吧,你那个想赚钱的点子是什么?别啰嗦,直接说核心。'); } </script> </body> </html> """ return HTMLResponse(content=html_content) @app.post("/chat") async def chat(request: Request): """处理用户消息并返回AI回复""" data = await request.json() session_id = data.get("session_id", "default") message = data.get("message", "") if not message: raise HTTPException(status_code=400, detail="消息内容不能为空") agent = get_or_create_agent(session_id) response = agent.get_response(message) return {"session_id": session_id, "response": response} @app.post("/new_session") async def new_session(request: Request): """开始一轮新的对话""" data = await request.json() session_id = data.get("session_id", "default") agent = ToughInvestorAgent(client) # 创建新的Agent实例 sessions[session_id] = agent welcome_msg = agent.start_new_conversation() return {"session_id": session_id, "response": welcome_msg} @app.get("/health") async def health_check(): return {"status": "up", "model": settings.deepseek_model}5.2 运行与测试
- 启动服务:在项目根目录运行:
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 - 打开浏览器:访问
http://localhost:8000。 - 开始对话:在输入框中描述你的副业想法,例如:“我想做一个帮程序员接私活的平台”。
- 观察 Agent:你会收到一连串尖锐的提问,例如:“市面上已经有程序员客栈、码市、开源众包了,你的平台凭什么能吸引程序员和雇主?你的佣金模式是什么?预计第一年能撮合多少交易?” 如果它需要数据,可能会自动调用搜索工具(注意:示例的搜索工具功能有限,可能需要你替换为真正的搜索 API)。
6. 进阶功能与工程化建议
基础版本已经可以运行。要让这个“毒舌投资人”更强大、更实用,可以考虑以下进阶方向:
6.1 集成更强大的工具
- 专业搜索 API:将
simple_web_search替换为 Serper 、 Exa 或 Google Programmable Search 等服务的 API,获取结构化、高质量的搜索结果。 - 财务计算工具:实现一个工具,让 AI 可以调用它进行简单的财务测算,如计算毛利率、净现值(NPV)、投资回报率(ROI)。
- 竞品数据抓取:集成爬虫工具(遵守
robots.txt),获取竞品网站的基本信息、定价等。 - 文档生成工具:让 AI 能够将对话总结成一份标准的商业计划书大纲或一页纸项目简介。
6.2 实现记忆与知识库
当前的对话历史是临时的。可以:
- 持久化存储:使用 SQLite、PostgreSQL 或矢量数据库(如 Chroma, Weaviate)存储对话历史和项目分析结论。
- 长期记忆:为每个“商业想法”创建一个知识库,存储 AI 分析过程中产生的所有假设、数据和结论,方便后续回顾和迭代。
- 案例库:构建一个成功/失败的创业案例库,让 AI 在分析时能进行类比。
6.3 优化系统指令与流程
- 分阶段评估:将评估流程设计得更像真实的投资尽调,分为“初筛”、“深度问答”、“财务模型”、“最终建议”等阶段。
- 个性化“毒舌”程度:允许用户选择投资人的风格,如“温和导师”、“严厉拷问官”、“数据狂魔”。
- 多轮追问的深度控制:防止 AI 陷入无意义的细节纠缠,设置合理的追问深度限制。
6.4 工程化与部署
- 错误处理与重试:为 API 调用和工具调用增加完善的错误处理、重试和降级逻辑。
- 速率限制:为 API 接口添加速率限制,防止滥用。
- 异步处理:对于耗时的工具调用(如复杂搜索),使用
asyncio避免阻塞。 - Docker 化:创建
Dockerfile和docker-compose.yml,方便在任何环境部署。 - 部署到云服务器:使用 Nginx + Gunicorn 部署 FastAPI 应用,或直接部署到 Vercel、Railway 等 PaaS 平台。
7. 常见问题与排查思路
在开发和运行过程中,你可能会遇到以下问题:
| 问题现象 | 可能原因 | 解决思路 |
|---|---|---|
启动服务时报ModuleNotFoundError | 依赖未安装或虚拟环境未激活 | 1. 确认已激活虚拟环境 (source venv/bin/activate)。2. 运行 pip install -r requirements.txt安装所有依赖。 |
访问http://localhost:8000无响应 | 服务未启动或端口被占用 | 1. 检查终端是否成功启动 uvicorn。 2. 尝试更换端口 --port 8080。3. 检查防火墙设置。 |
| AI 回复内容空洞或不符合“毒舌”人设 | 系统指令 (Prompt) 不够强或模型温度设置不当 | 1. 仔细打磨TOUGH_INVESTOR_SYSTEM_PROMPT,指令要更具体、更强势。2. 调整 temperature参数(降低会更稳定,提高更有创造性)。3. 尝试更换更强大的模型,如 deepseek-v4-pro。 |
| 工具调用不生效,AI 从不搜索 | 1. 工具描述不够清晰。 2. API 未返回 tool_calls。3. 模型不支持工具调用。 | 1. 检查WEB_SEARCH_TOOL_DESCRIPTION中的description,确保它能诱使AI调用。2. 在 get_response方法中打印message对象,查看是否有tool_calls字段。3. 确认你使用的 DeepSeek 模型版本支持工具调用功能。 |
| 搜索工具返回错误或空结果 | 示例的 DuckDuckGo 抓取不稳定或被屏蔽 | 这是预期之内。请务必替换为可靠的搜索 API。注册 Serper 等服务的免费额度进行测试。 |
| 对话历史混乱,AI 忘记上下文 | 对话历史列表管理出错或 token 超长被截断 | 1. 检查_add_message逻辑是否正确。2. DeepSeek 模型有上下文长度限制。对于长对话,需要实现历史摘要或滑动窗口,只保留最近 N 轮对话。 |
| API 调用返回 401 或 429 错误 | API Key 错误、过期或超出速率限制 | 1. 检查.env文件中的DEEPSEEK_API_KEY是否正确。2. 前往 DeepSeek 平台查看额度和使用情况。 3. 在代码中增加请求间隔,避免频繁调用。 |
8. 最佳实践与安全须知
在进一步开发和实际使用本项目时,请牢记以下要点:
- API 密钥安全第一:永远不要将
.env文件或硬编码的 API Key 提交到公开的 Git 仓库。使用环境变量或密钥管理服务。 - 成本控制:DeepSeek API 调用会产生费用。在代码中加入用量监控和日志,避免意外的高额账单。可以为对话设置 token 数量上限。
- 工具调用的可靠性:联网搜索等工具可能返回不准确、过时或有偏见的信息。AI 的结论仅供参考,绝不能替代专业的商业、法律或财务建议。务必在关键决策点上进行人工核实。
- 内容审核与过滤:考虑在 AI 回复输出前加入一层内容过滤,防止生成不当或有害内容,尤其是在公开部署时。
- 用户体验优化:前端页面非常简陋。可以考虑使用更现代的框架(如 Vue.js, React)重构前端,增加消息流式输出(Streaming)、打字机效果、对话导出等功能。
- 拥抱迭代:AI Agent 的效果严重依赖于 Prompt 工程和工具设计。不要指望一次成功,要基于与它的实际对话记录,不断优化系统指令和工具描述。
通过这个项目,你不仅得到了一个能犀利拷问商业想法的 AI 伙伴,更重要的是,你实践了构建一个功能型 AI Agent 的完整流程:从设定角色、设计 Prompt、集成工具、到搭建服务。这个模式可以复用到无数场景,比如 AI 面试官、AI 产品经理、AI 代码评审员等等。希望这个“毒舌投资人”能成为你副业路上的第一块试金石,也祝你基于此框架,创造出更多有趣的 AI 应用。
🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度
