FastGPT 引申:奥运选手知识图谱构建与混合检索应用
目录
- FastGPT 引申:奥运选手知识图谱构建与混合检索应用
- 第一部分:数据构建流程
- 1. 数据抽取与预处理
- 2. 向量化处理
- 3. 知识图谱构建
- 4. 数据持久化
- 第二部分:混合检索应用
- 1. 用户查询处理
- 2. 混合检索技术细节
- 3. 返回结果示例
- 4. 性能指标
FastGPT 引申:奥运选手知识图谱构建与混合检索应用
第一部分:数据构建流程
1. 数据抽取与预处理
目标:从奥运官网抓取土耳其射击选手信息
工具链:
- Firecrawl:动态网页抓取
- Unstructured.io:PDF/HTML解析
- Mistral-7B:信息抽取模型
# 数据抓取与清洗
from camel.tools import FirecrawlScraper, TextCleaner
scraper = FirecrawlScraper(api_key="fc_123")
raw_data = scraper.scrape(url="olympics.com/tr/shooting")
cleaner = TextCleaner()
structured_text = cleaner.clean(
raw_data,
chunk_strategy="section", # 按章节分块
keep_headers=True # 保留标题结构
)
信息抽取结果示例:
{
"athlete": "Yusuf Dikeç",
"nationality": "Turkey",
"event": "10m Air Pistol",
"medal": "Silver",
"game": {"year":2024, "location":"Paris"}
}
2. 向量化处理
技术栈:
- Mistral Embed:生成768维向量
- Qdrant:向量数据库存储
from camel.embeddings import MistralEmbed
from qdrant_client import QdrantClient
embedder = MistralEmbed(model="large-v2")
qdrant = QdrantClient(host="localhost", port=6333)
# 批量生成向量
vectors = [embedder.encode(text) for text in structured_text]
# 向量存储
qdrant.upsert(
collection_name="olympic_docs",
points=[
{"id": idx, "vector": vec, "payload": {"text": text}}
for idx, (vec, text) in enumerate(zip(vectors, structured_text))
]
)
3. 知识图谱构建
Neo4j节点关系建模:
// 节点定义
CREATE (:Athlete {
id: "ATH_TR_001",
name: "Yusuf Dikeç",
nationality: "Turkey"
})
CREATE (:Event {
id: "EVT_10MAP",
discipline: "10m Air Pistol"
})
CREATE (:Game {
id: "OG_2024",
year: 2024,
location: "Paris"
})
// 关系建立
MATCH (a:Athlete {id:"ATH_TR_001"}), (e:Event {id:"EVT_10MAP"})
CREATE (a)-[:WON_MEDAL {
type: "Silver",
score: 243.7
}]->(e)
MATCH (e:Event {id:"EVT_10MAP"}), (g:Game {id:"OG_2024"})
CREATE (e)-[:BELONGS_TO]->(g)
索引优化:
CREATE INDEX FOR (a:Athlete) ON (a.nationality)
CREATE INDEX FOR (g:Game) ON (g.year)
4. 数据持久化
存储类型 | 技术方案 | 数据示例 |
---|---|---|
原始文本 | MongoDB (分片集群) | HTML/PDF原始文档 |
向量数据 | Qdrant (分布式部署) | 768维向量+文本元数据 |
图谱数据 | Neo4j (因果集群) | 节点+关系网络 |
第二部分:混合检索应用
1. 用户查询处理
输入:“查找2024年获得射击奖牌的土耳其选手”
智能体协作流程:
-
查询解析智能体(Mistral-7B)
from camel.agents import QueryAnalyzer analyzer = QueryAnalyzer(model="mistral-7b") parsed = analyzer.parse( "查找2024年获得射击奖牌的土耳其选手", params={"max_entities":3} ) # 输出: {'nationality':'Turkey', 'year':2024, 'sport':'Shooting'}
-
混合检索执行
from camel.retrievers import HybridRetriever
retriever = HybridRetriever(
vector_db="qdrant",
graph_db="neo4j",
fusion_ratio=0.65, # 向量检索权重
semantic_threshold=0.7
)
results = retriever.search(
query_text="查找2024年获得射击奖牌的土耳其选手",
vector_top_k=50,
graph_depth=3
)
2. 混合检索技术细节
向量检索阶段:
- Qdrant执行ANN搜索,返回Top50候选文本
- 语义相似度计算:余弦相似度 > 0.7
图谱验证阶段:
// 自动生成的Cypher查询
MATCH (a:Athlete)-[r:WON_MEDAL]->(e:Event)-[:BELONGS_TO]->(g:Game)
WHERE a.nationality = "Turkey"
AND g.year = 2024
AND e.discipline CONTAINS "Shooting"
RETURN a.name, r.type, e.discipline
结果融合算法:
# 综合得分计算
final_score = 0.65 * cosine_sim + 0.35 * graph_confirmation
3. 返回结果示例
{
"hybrid_results": [
{
"type": "融合记录",
"data": {
"text": "Yusuf Dikeç在巴黎奥运会10米气手枪项目以243.7环获得银牌",
"graph_verified": {
"athlete": "Yusuf Dikeç",
"medal": "Silver",
"event": "10m Air Pistol",
"game": "2024巴黎奥运会"
},
"confidence": 0.92
},
"sources": [
"qdrant_doc:789",
"neo4j_path:ATH_TR_001->EVT_10MAP"
]
},
{
"type": "关联信息",
"data": "该选手在2023世界杯同一项目获得金牌",
"confidence": 0.85
}
]
}
4. 性能指标
指标 | 纯向量检索 | 纯图谱查询 | 混合检索 |
---|---|---|---|
响应时间(ms) | 120 | 80 | 150 |
准确率(%) | 68 | 75 | 89 |
可解释性评分 | 2.1/5 | 4.7/5 | 4.5/5 |
复杂查询支持度 | 不支持嵌套查询 | 支持3跳查询 | 支持5跳推理 |
混合检索完整流程:
前端请求→查询分析→并行检索→结果融合→智能验证→最终输出