你想学习GraphRAG与各类应用(API服务、Web界面、本地大模型、数据库、工作流工具)的集成方法,我会按「基础集成(API/Web)→ 进阶集成(本地LLM/Neo4j)→ 场景化集成(工作流/知识库)」的逻辑,结合可直接运行的代码示例讲解,覆盖新手最常用的集成场景。

一、核心集成思路

GraphRAG本身是“图构建+检索+生成”的技术流程,集成的核心是:

  1. 把GraphRAG封装为可调用的模块/接口
  2. 让目标应用(如Web、本地LLM、工作流工具)调用该接口,完成“输入问题→图检索→LLM回答”的闭环;
  3. 适配不同应用的通信方式(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(对接任意应用)
  1. 启动API:终端执行 uvicorn app:app --reload --host 0.0.0.0 --port 8000
  2. 测试调用(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并启动
  1. 下载Neo4j Desktop(https://neo4j.com/download/),创建数据库,设置密码;
  2. 安装依赖: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。


六、集成注意事项

  1. 数据格式兼容:不同应用的输入输出格式需统一(如JSON),避免编码/格式错误;
  2. 性能优化:大规模数据下,先做向量检索筛选核心实体,再做图检索,提升效率;
  3. 离线部署:本地大模型+Neo4j+FastAPI可实现全离线部署,适合无网络环境;
  4. 错误处理:集成时增加异常捕获(如API超时、模型加载失败),保证稳定性。

总结

  1. GraphRAG集成的核心是封装为标准化API,对接任意应用(Web、本地LLM、数据库);
  2. 基础场景用「FastAPI+NetworkX+OpenAI」快速跑通,生产环境替换为「Neo4j+本地LLM」;
  3. 非开发人员可通过Streamlit快速搭建可视化界面,降低使用门槛。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐