GraphRAG与其他应用集成教程
GraphRAG集成的核心是封装为标准化API,对接任意应用(Web、本地LLM、数据库);基础场景用「FastAPI+NetworkX+OpenAI」快速跑通,生产环境替换为「Neo4j+本地LLM」;非开发人员可通过Streamlit快速搭建可视化界面,降低使用门槛。
·
你想学习GraphRAG与各类应用(API服务、Web界面、本地大模型、数据库、工作流工具)的集成方法,我会按「基础集成(API/Web)→ 进阶集成(本地LLM/Neo4j)→ 场景化集成(工作流/知识库)」的逻辑,结合可直接运行的代码示例讲解,覆盖新手最常用的集成场景。
一、核心集成思路
GraphRAG本身是“图构建+检索+生成”的技术流程,集成的核心是:
- 把GraphRAG封装为可调用的模块/接口;
- 让目标应用(如Web、本地LLM、工作流工具)调用该接口,完成“输入问题→图检索→LLM回答”的闭环;
- 适配不同应用的通信方式(API、函数调用、CLI等)。
二、基础集成:GraphRAG封装为API服务(对接任意应用)
将GraphRAG核心逻辑封装成REST API,是最通用的集成方式(Web、APP、小程序都能调用),以下用FastAPI实现。
步骤1:安装依赖
pip install fastapi uvicorn pydantic # API框架
pip install networkx pyvis openai python-dotenv # GraphRAG基础依赖
步骤2:完整API代码(GraphRAG+FastAPI)
# app.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import networkx as nx
from langchain.text_splitter import RecursiveCharacterTextSplitter
import spacy
from openai import OpenAI
import os
from dotenv import load_dotenv
# 初始化FastAPI应用
app = FastAPI(title="GraphRAG API")
# 加载环境变量和基础组件
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
nlp = spacy.load("zh_core_web_sm") # 中文实体提取模型
# 初始化知识图谱(可替换为Neo4j,后续进阶部分会讲)
G = nx.DiGraph()
# 定义请求体格式
class GraphRAGQuery(BaseModel):
query: str # 用户问题
raw_text: str = "" # 可选:新增文本数据(用于更新图谱)
# ---------------------- 核心GraphRAG函数 ----------------------
# 1. 文本分割
def split_text(text):
splitter = RecursiveCharacterTextSplitter(
chunk_size=200, chunk_overlap=20, separators=["。", ",", "\n"]
)
return splitter.split_text(text)
# 2. 实体/关系提取+图谱构建
def build_graph(chunks):
for chunk in chunks:
doc = nlp(chunk)
# 提取实体
entities = [ent.text for ent in doc.ents]
for ent in entities:
G.add_node(ent, type="实体")
# 提取关系(示例:手动规则,进阶可换LLM)
if "出发" in chunk and "大王庙" in chunk and "大南山" in chunk:
G.add_edge("大南山精华线", "出发地", relationship="出发地")
if "海拔" in chunk and "斧头石顶" in chunk:
G.add_edge("斧头石顶", "海拔", relationship="海拔")
if "耗时" in chunk and "大南山" in chunk:
G.add_edge("大南山精华线", "耗时", relationship="耗时")
# 3. 图检索
def graph_retrieval(query_entity):
if query_entity not in G.nodes:
return "未找到相关实体信息"
results = []
for neighbor in G.neighbors(query_entity):
rel = G[query_entity][neighbor]["relationship"]
results.append(f"{query_entity} {rel} {neighbor}")
return "\n".join(results)
# 4. LLM回答生成
def generate_answer(query, retrieval_res):
prompt = f"""仅基于以下检索信息回答问题,不要编造:
检索信息:{retrieval_res}
用户问题:{query}
"""
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
# ---------------------- API接口 ----------------------
@app.post("/graphrag/query")
async def graphrag_query(data: GraphRAGQuery):
try:
# 1. 若传入新文本,先更新图谱
if data.raw_text:
chunks = split_text(data.raw_text)
build_graph(chunks)
# 2. 从用户问题中提取核心实体(示例:取第一个名词实体)
query_doc = nlp(data.query)
query_entities = [ent.text for ent in query_doc.ents]
if not query_entities:
return {"answer": "未识别到问题中的实体,请补充关键信息"}
# 3. 图检索
retrieval_res = graph_retrieval(query_entities[0])
# 4. 生成回答
answer = generate_answer(data.query, retrieval_res)
return {
"query": data.query,
"retrieval_results": retrieval_res,
"answer": answer,
"graph_nodes": list(G.nodes) # 返回当前图谱节点(可选)
}
except Exception as e:
raise HTTPException(status_code=500, detail=f"接口异常:{str(e)}")
# 启动API(终端运行:uvicorn app:app --reload --host 0.0.0.0 --port 8000)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
步骤3:调用API(对接任意应用)
- 启动API:终端执行
uvicorn app:app --reload --host 0.0.0.0 --port 8000; - 测试调用(Postman/浏览器/代码):
输出示例:# test_api.py import requests url = "http://localhost:8000/graphrag/query" data = { "query": "大南山精华线的出发地是哪里?", "raw_text": "惠州大南山精华线从大王庙出发,全程14公里,耗时6-8小时。" } response = requests.post(url, json=data) print(response.json()){ "query": "大南山精华线的出发地是哪里?", "retrieval_results": "大南山精华线 出发地 大王庙", "answer": "大南山精华线的出发地是大王庙。", "graph_nodes": ["大南山精华线", "大王庙", "14公里", "6-8小时"] }
三、进阶集成1:GraphRAG + 本地大模型(替代OpenAI)
用Ollama调用本地LLM(如Llama3、Qwen),摆脱API费用,适合离线部署。
步骤1:安装Ollama并下载模型
# 安装Ollama(官网:https://ollama.com/)
# 下载Llama3-8B模型(轻量,适合本地)
ollama pull llama3
步骤2:修改LLM生成函数(替换OpenAI)
# 替换原generate_answer函数
import requests
def generate_answer_local(query, retrieval_res):
prompt = f"""仅基于以下检索信息回答问题,不要编造:
检索信息:{retrieval_res}
用户问题:{query}
"""
# 调用Ollama本地API
response = requests.post(
"http://localhost:11434/api/chat",
json={
"model": "llama3",
"messages": [{"role": "user", "content": prompt}],
"stream": False
}
)
return response.json()["message"]["content"]
四、进阶集成2:GraphRAG + Neo4j(大规模数据)
替换NetworkX为Neo4j(工业级图数据库),支持百万级节点/关系,适合生产环境。
步骤1:安装Neo4j并启动
- 下载Neo4j Desktop(https://neo4j.com/download/),创建数据库,设置密码;
- 安装依赖:
pip install neo4j。
步骤2:Neo4j替代NetworkX的核心代码
from neo4j import GraphDatabase
# 连接Neo4j
class Neo4jGraph:
def __init__(self, uri, user, password):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def close(self):
self.driver.close()
# 添加节点和关系
def add_relation(self, source, rel, target):
def _tx(tx):
tx.run(
"MERGE (a:Entity {name:$source}) "
"MERGE (b:Entity {name:$target}) "
"MERGE (a)-[r:RELATION {name:$rel}]->(b)",
source=source, rel=rel, target=target
)
with self.driver.session() as session:
session.execute_write(_tx)
# 图检索
def retrieve(self, query_entity):
def _tx(tx):
result = tx.run(
"MATCH (a:Entity {name:$entity})-[r:RELATION]->(b:Entity) "
"RETURN a.name + ' ' + r.name + ' ' + b.name AS res",
entity=query_entity
)
return [record["res"] for record in result]
with self.driver.session() as session:
res = session.execute_read(_tx)
return "\n".join(res) if res else "未找到相关信息"
# 初始化Neo4j连接
neo4j_graph = Neo4jGraph("bolt://localhost:7687", "neo4j", "你的密码")
# 替换原build_graph和graph_retrieval函数
def build_graph_neo4j(chunks):
for chunk in chunks:
doc = nlp(chunk)
if "大王庙" in chunk and "大南山精华线" in chunk and "出发" in chunk:
neo4j_graph.add_relation("大南山精华线", "出发地", "大王庙")
def graph_retrieval_neo4j(query_entity):
return neo4j_graph.retrieve(query_entity)
五、场景化集成:GraphRAG + Streamlit(快速搭建Web界面)
用Streamlit构建可视化Web界面,非开发人员也能使用GraphRAG。
步骤1:安装Streamlit
pip install streamlit
步骤2:Web界面代码
# graphrag_web.py
import streamlit as st
import requests
# 设置页面
st.title("GraphRAG 问答系统")
st.sidebar.title("配置")
api_url = st.sidebar.text_input("API地址", "http://localhost:8000/graphrag/query")
# 用户输入
query = st.text_input("请输入问题", "大南山精华线的耗时是多少?")
raw_text = st.text_area("可选:新增文本数据", "惠州大南山精华线从大王庙出发,全程14公里,耗时6-8小时。")
# 提交按钮
if st.button("获取回答"):
with st.spinner("正在检索并生成回答..."):
response = requests.post(
api_url,
json={"query": query, "raw_text": raw_text}
)
if response.status_code == 200:
res = response.json()
st.subheader("回答:")
st.write(res["answer"])
st.subheader("图谱检索结果:")
st.code(res["retrieval_results"])
st.subheader("当前图谱节点:")
st.write(res["graph_nodes"])
else:
st.error(f"请求失败:{response.text}")
步骤3:启动Web界面
streamlit run graphrag_web.py
打开浏览器访问 http://localhost:8501,即可可视化使用GraphRAG。
六、集成注意事项
- 数据格式兼容:不同应用的输入输出格式需统一(如JSON),避免编码/格式错误;
- 性能优化:大规模数据下,先做向量检索筛选核心实体,再做图检索,提升效率;
- 离线部署:本地大模型+Neo4j+FastAPI可实现全离线部署,适合无网络环境;
- 错误处理:集成时增加异常捕获(如API超时、模型加载失败),保证稳定性。
总结
- GraphRAG集成的核心是封装为标准化API,对接任意应用(Web、本地LLM、数据库);
- 基础场景用「FastAPI+NetworkX+OpenAI」快速跑通,生产环境替换为「Neo4j+本地LLM」;
- 非开发人员可通过Streamlit快速搭建可视化界面,降低使用门槛。
更多推荐


所有评论(0)