现有的商业智能 (BI) 工具和数据分析软件功能强大,但操作复杂,需要专业的知识和技能才能有效使用,不适合快速、临时的查询和分析。用户无法用自然语言直接询问数据问题,而是必须通过复杂的图表配置和公式编写来获取信息。
- 不想在本地部署agent,做一个基于分布式部署的股票分析助手。
- 调用云端mcp服务,也,查询股票可以分析股票。
- 支持多轮对话,也可以记录历史对话。
- 模块1:MCP Server,自定义工具,股票查询,其他天气或外部【工具,查询类型】
- 模块2:Fast API后端服务,提供后端的业务逻辑【接口,非工具类型】
- 查询股票,可以是mcp
- 用户注册,不推荐是mcp
- 用户登录,不推荐是mcp
- 模块3:Streamlit实现前端页面
-
main_mcp.py- MCP Server 主程序 (模块1) -
main_server.py- Fast API Web服务主程序 (模块2) -
./routers/- FastAPI路由(每个模块fastapi服务)chat.py- 聊天路由stock.py- 股票数据路由user.py- 用户管理路由data.py- 数据管理路由
-
./api/- API接口模块(底层api、外部api,fastmcp服务)autostock.py- 股票数据接口(付费接口)news.py- 新闻数据接口saying.py- 名言/语录接口tool.py- 工具类接口
-
./services/- 业务服务层(具体业务实现代码)chat.py- 聊天服务stock.py- 股票服务user.py- 用户服务
-
./models/- 数据模型data_models.py- Pydantic和typing数据模型定义orm.py- 关系型数据库关系映射
-
REAME.md- 项目说明文档(注意文件名拼写应为README.md) -
./agent/- 智能Agent模块(工作流、openai-agent代码)stock_agent.py- 股票分析智能代理db_agent.py- 数据库操作代理csv_agent.py- CSV文件处理代理excel_agent.py- Excel文件处理代理vison_agent.py- 视觉分析代理summary_agent.py- 摘要生成代理
-
./demo - Streamlit 前端页面 (模块3)
- ./demo/chat/` - 聊天功能演示
chat.py- 聊天主程序chat_list.py- 聊天列表管理
./demo/stock/- 股票功能演示stock_info.py- 股票信息stock_kline.py- K线图数据stock_search.py- 股票搜索stock_rank.py- 股票排名stock_board.py- 板块数据stock_industry.py- 行业数据stock_favorite.py- 收藏功能stock_min_data.py- 分钟数据
./demo/user/- 用户管理演示user_login.py- 用户登录user_register.py- 用户注册user_info.py- 用户信息user_list.py- 用户列表user_delete.py- 用户删除user_reset.py- 密码重置
./demo/mcp/- MCP协议演示mcp_list.py- MCP列表mcp_debug.py- MCP调试
./demo/data/- 数据管理演示data_list.py- 数据列表data_manage.py- 数据管理
- ./demo/chat/` - 聊天功能演示
-
./templates/- 模板文件chat_start_system_prompt.jinjia2- 聊天系统提示模板(Jinja2格式)
-
./assert/- 资源文件conversations.db*- 对话记录数据库sever.db- 服务器数据库chat-message- 聊天消息数据
-
./test/- 单元测试文件test_agent.py- 代理测试test_autostock.py- 自动化股票测试test_jinja2_template.py- 模板测试test_mcp.py- MCP协议测试
mcp = FastMCP.from_fastapi(app=app) # 导入fastapi 服务
async def setup():
await mcp.import_server(news_mcp, prefix="") # 定义mcp 服务
await mcp.import_server(saying_mcp, prefix="")
await mcp.import_server(tool_mcp, prefix="")
mcp server 非常灵活,可以来源比较多样;
- @mcp.tool: 在函数加注解,定义为mcp 服务 -> 通过mcp client调用
- 从fastapi导入(灵活): 从fast api 导入为mcp 服务 -> 通过http、mcp client调用
- 从外部 openapi json 导入:导入外部其他的程序api json
# 前后端交互的http接口,与业务相关的api
# http://127.0.0.1:8000/docs#/
app.include_router(user_routers)
app.include_router(chat_routers)
app.include_router(data_routers)
app.include_router(stock_routers)
# 底层的股票http接口,底层相关的api
# http://127.0.0.1:8000/stock/docs#/
app.mount("/stock", stock_app)
- 底层数据库,models
- 业务代码,services
- fastapi路由,routers
Streamlit 不是强制的,但是推荐掌握一下。帮助理解前后端如何交互。
- 模块进行划分:用户管理模块、股票管理模块、对话模块(主要模块)
- 对话模块:
- 历史对话记录,对话切换
- 大模型历史状态管理的过程
- AdvancedSQLiteSession:主要依赖openai-agent的服务,不是很透明,比较简单
- 自己实现:历史对话也输入给大模型,基于历史输入继续对话(限制最后10条历史对话作为输入,如果对话太长大模型忘记最开始信息)
- 对话:
- 1.python main_mcp.py
- 2.python main_server.py
- 3.streamlit run demo/streamlit_demo.py
- 注:本人也尝试在阿里云服务器端进行部署,可进行公网访问。
-
- 什么是前后端分离?
-
答:前后端分离就是:前端和后端是两个独立程序,通过API通信,各自独立开发、部署、运行。在这个项目中具体体现为: ·后端——main_server.py,端口8000。 ·Fast API服务,只负责提供数据接口(REST API) ·通过routers暴露 /user、/chat、/data、/stock 等API端点 ·不关心页面怎么渲染,只返回JSON数据 ——main_mcp.py,端口8900. ·跑MCP/SSE服务,供Agent对话时调用工具,但走的是不同的协议(SSE而非HTTP REST) ·前端——demo目录下的streamlit页面 ·独立的Streamlit应用,负责UI展示和用户交互 ·通过requests库调用后端API获取数据,例如 requests.post("http://127.0.0.1:8000/user/login") ·不关心数据从哪来、怎么处理、只管展示
-
2.历史对话如何存储,以及如何将历史对话作为大模型的下一次输入?
-
答:在开发大模型应用(如 Chatbot)时,由于 LLM 本身是无状态(Stateless)的,它不会记得你上一句话说了什么。
[ {"role": "user", "content": "你好,请问今天天气怎么样?"}, {"role": "assistant", "content": "今天天气晴朗,温度约为 25°C。"}, {"role": "user", "content": "那我适合去爬山吗?"} ]
- 只保留最近的 K 轮对话。当新对话进入时,移除最旧的一条。这能保证模型始终记得最近的语境,同时控制成本。【滑动窗口——丢弃最旧的消息,保留最近的N条】
- 当对话过长时,调用大模型对之前的历史做一个“简短摘要”。【摘要压缩——用LLM把旧对话总结成一段话,大幅缩减Token】
- 从历史对话中检索到相关的信息 + 最近的K条 作为历史。【重要性过滤——只保留关键信息(用户指令、重要结论),丢弃过程细节】