F1数据聊天助手
一个交互式聊天界面,用于使用OpenF1 API查询一级方程式数据。该项目使用LangChain、Ollama、ChromaDb进行矢量搜索,并使用模型上下文协议(MCP)为F1数据查询创建自然语言界面。
使用的技术
F1数据聊天助手结合了多种人工智能技术:
- 朗链代理 -协调工具选择和响应生成
- 奥拉马LLM (llama3.2:1b)-增强自然语言理解和生成能力
- MCP(模型上下文协议) -提供对OpenF1 API工具的标准化访问
- ChromaDB矢量存储 -F1知识文档的语义搜索
- Neo4j图形数据库 -结构化关系查询
- DuckDuckGo搜索 -实时互联网搜索当前F1信息
代理根据用户的查询在这些工具之间进行智能选择,以提供准确、全面的F1信息。
需求
- Python 3.8+
- Ollama在当地安装
- Neo4j数据库(桌面或服务器)
- 所需的Python包(请参阅
requirements.txt)
安装
- 克隆存储库:
git clone https://github.com/yourusername/ollama-f1-chat.git
cd ollama-f1-chat- 创建并激活虚拟环境:
python -m venv .venv
# On Windows
.venv\Scripts\activate
# On Unix or MacOS
source .venv/bin/activate- 安装依赖项:
pip install -r requirements.txt- 确保Ollama使用所需型号运行:
ollama run llama3.2:1b用法
运行主应用程序:
python source/main.py示例查询:
- “在会话1204中显示驾驶员16的汽车数据”
- “1082会议1205的天气怎么样?”
- “告诉我关于第3圈的车手55会话1204”
项目结构
核心应用程序
source/main.py-LangChain代理编排的主要应用入口点source/ui_window.py-聊天界面UI实现source/f1mcp/mcp_openf1_tools.py-用于OpenF1 API集成的模型上下文协议(MCP)服务器
知识系统
chroma_db/-用于F1文档语义搜索的ChromaDB矢量数据库documents/-知识库文件(F1事实、比赛历史、驾驶员信息)
- knowledge.txt -F1常识和事实 - sample_f1_2023.txt -2023赛季信息 - sample_f1_2024.txt -2024赛季信息
助手实用程序
source/helpers/helper.py-ChromaDB摄取工具,用于将文档加载到矢量数据库中source/helpers/neo4j_ingestion.py-基于LLM的Neo4j知识图生成器
配置
requirements.txt-Python依赖关系.env-环境变量(Neo4j凭证、API密钥)
知识检索组件
1. 矢量搜索(ChromaDB)
应用程序使用 ChromaDB 作为矢量数据库,以实现对公式1文档的语义搜索。当用户提问时,系统:
- 使用嵌入(句子转换/全MiniLM-L6-v2)从存储的F1文档中检索相关上下文
- 将此上下文注入LLM提示中,以提供准确的历史信息
- 存储来自的文档
documents/目录作为分块嵌入向量
辅助工具: source/helpers/helper.py -生成嵌入并将文档(.txt、.md、.pdf)中的数据加载到ChromaDB矢量存储中的独立脚本。
2. 互联网搜索(DuckDuckGo)
对于离线知识库或OpenF1 API中不可用的当前一级方程式新闻和信息,代理使用 DuckDuckGo搜索 作为后备工具。这使得:
- 实时F1新闻和更新
- 当前车手排名和车队信息
- 最近的比赛结果和锦标赛更新
3. 知识图谱(Neo4j)
该系统与 Neo4j 以知识图的形式存储和查询结构化的F1关系:
图形架构:
(Driver)-[:DROVE_FOR]->(Team)有赛季和积分(Driver)-[:WON]->(Race)随着年份(Race)-[:HELD_AT]->(Circuit)(Race)-[:PART_OF]->(Season)
使用案例:
- “2023年,哪些车手为法拉利车队效力?”
- “显示2022赛季的所有比赛”
- “摩纳哥有哪些赛道举办比赛?”
辅助工具: source/helpers/neo4j_ingestion.py -使用Ollama LLM从非结构化文本中提取F1实体(车手、车队、比赛、赛道、赛季),并自动构建知识图。
