从零到一:基于Ollama与Neo4j的GraphRAG本地实践与图谱可视化
1. 环境准备与工具安装在开始构建GraphRAG本地知识图谱之前我们需要先准备好必要的工具和环境。这里假设你使用的是Windows系统并且已经安装了Python 3.8或更高版本。如果你还没有安装Python建议先去官网下载安装。首先需要安装的是Anaconda这是一个非常方便的Python环境管理工具。安装完成后我们可以创建一个专门的conda环境来运行GraphRAGconda create -n graphrag python3.10 conda activate graphrag接下来安装Ollama这是一个强大的本地大模型运行框架。Ollama的安装非常简单pip install ollama安装完成后我们需要下载并运行一些基础模型。这里推荐使用llama2作为基础语言模型nomic-embed-text作为嵌入模型ollama pull llama2 ollama pull nomic-embed-text对于知识图谱存储和可视化我们需要安装Neo4j。Neo4j提供了社区版可以直接从官网下载安装包。安装过程中记得设置好用户名和密码这些信息后面会用到。最后我们需要克隆GraphRAG的源代码仓库git clone https://github.com/microsoft/graphrag cd graphrag pip install -r requirements.txt注意在Windows系统上可能会遇到一些路径相关的问题建议将所有项目都放在用户目录下的短路径中避免使用包含中文或空格的路径。2. GraphRAG配置与模型加载成功安装所有依赖后接下来就是配置GraphRAG使其能够正确使用本地部署的Ollama模型。这是整个过程中最容易出错的环节需要特别注意。首先修改graphrag目录下的settings.yaml文件。这个文件控制着GraphRAG的核心参数。我们需要修改以下几个关键部分llm: provider: openai model: llama2 api_base: http://localhost:11434/v1 temperature: 0.3 max_tokens: 4096 embedding: provider: openai model: nomic-embed-text api_base: http://localhost:11434/api这里有几个关键点需要注意api_base的地址必须正确指向本地Ollama服务的端口默认是11434llm部分的api_base需要以/v1结尾而embedding部分的api_base需要以/api结尾模型名称必须与Ollama中实际下载的模型名称完全一致接下来需要修改.env文件这个文件控制着一些环境变量GRAPHRAG_API_KEYollama GRAPHRAG_CLAIM_EXTRACTION_ENABLEDTrue提示如果后续运行中出现模型加载失败的问题可以尝试先单独测试Ollama服务是否正常工作。可以通过命令行运行ollama list来查看已安装的模型或者运行ollama run llama2来直接与模型交互。3. 代码适配与问题排查即使完成了上述配置直接运行GraphRAG可能还是会遇到各种问题。这是因为GraphRAG默认是为云端API设计的需要进行一些代码修改才能适配本地Ollama服务。第一个需要修改的文件是graphrag/llm/openai/openai_embeddings_llm.py。找到embeddings_create方法将其替换为以下内容async def embeddings_create(self, input, **kwargs): args { model: self.configuration.model, **(kwargs.get(model_parameters) or {}), } embedding_list [] for inp in input: embedding ollama.embeddings(modelnomic-embed-text, promptinp) embedding_list.append(embedding[embedding]) return embedding_list第二个需要修改的文件是graphrag/query/llm/oai/embedding.py。找到_embed_with_retry方法修改其实现def _embed_with_retry(self, chunk, **kwargs): try: embedding ollama.embeddings( modelnomic-embed-text, promptchunk )[embedding] return embedding, len(chunk) except Exception as e: self._reporter.error( messageError embedding chunk, details{self.__class__.__name__: str(e)}, ) raise修改完成后建议先运行一个简单的测试脚本来验证配置是否正确import ollama response ollama.embeddings( modelnomic-embed-text, promptThis is a test sentence. ) print(len(response[embedding])) # 应该输出768如果遇到Columns must be same length as key错误可以尝试调整settings.yaml中的chunk_size参数将其设置为300或更小。这是因为本地模型的上下文窗口可能比云端模型小。4. Neo4j配置与数据导入当GraphRAG能够正常运行后下一步就是将生成的知识图谱导入Neo4j进行可视化和查询。首先确保Neo4j服务已经启动。可以在命令行中运行neo4j console服务启动后在浏览器中访问http://localhost:7474使用安装时设置的用户名和密码登录。在GraphRAG生成知识图谱之前我们需要在Neo4j中创建一个新的数据库停止Neo4j服务打开Neo4j的conf目录通常在安装目录下编辑neo4j.conf文件取消注释并修改以下行dbms.default_databasegraphrag保存文件并重新启动Neo4j服务现在可以运行GraphRAG来生成知识图谱了。GraphRAG支持多种数据源这里以处理PDF文档为例from graphrag import GraphRAG graphrag GraphRAG() graphrag.add_document(path/to/your/document.pdf) graphrag.build() # 这会花费一些时间取决于文档大小和硬件性能构建完成后数据会自动导入到Neo4j中。回到Neo4j的Web界面在查询框中输入MATCH (n) RETURN n LIMIT 50这样就可以看到导入的知识图谱节点了。Neo4j提供了丰富的可视化选项可以通过调整节点大小、颜色和布局来更好地理解知识图谱的结构。提示如果数据量很大可视化可能会比较卡顿。这时可以使用Neo4j的过滤功能先查看特定类型的节点或关系。例如只查看某个主题相关的节点MATCH (n:Concept)-[r]-(m) WHERE n.name CONTAINS 人工智能 RETURN n, r, m5. 常见问题与优化建议在实际使用过程中可能会遇到各种问题。下面列出一些常见问题及其解决方法模型加载失败确保Ollama服务正在运行ollama serve检查settings.yaml中的模型名称是否与Ollama中的完全一致尝试降低模型的temperature参数内存不足减少chunk_size参数的值使用更小的基础模型关闭其他占用内存的程序Neo4j连接问题检查Neo4j服务是否启动确认bolt端口默认7687没有被防火墙阻止在settings.yaml中正确设置Neo4j的连接参数知识图谱质量不高尝试不同的基础模型组合调整GraphRAG的提取参数对输入文档进行预处理去除无关内容为了提高系统性能可以考虑以下优化措施为Ollama和Neo4j分配更多内存使用SSD存储对频繁查询的结果建立索引定期清理Neo4j中的旧数据对于大规模知识图谱建议采用增量构建的方式而不是一次性处理所有文档。GraphRAG支持增量更新可以只处理新增或修改的文档部分。6. 进阶应用与扩展成功搭建基础系统后可以进一步探索GraphRAG和Neo4j的高级功能。一个实用的扩展是为知识图谱添加全文检索功能。Neo4j提供了全文索引支持可以显著提高查询效率CREATE FULLTEXT INDEX entitySearch FOR (n:Entity) ON EACH [n.name, n.description]GraphRAG生成的图谱可以与其他数据源结合。例如可以将公司内部数据库中的结构化数据导入Neo4j与GraphRAG生成的语义网络进行关联。对于需要长期维护的知识图谱建议建立定期更新的自动化流程。可以编写脚本定时检查新文档自动触发GraphRAG处理并更新Neo4j中的数据。Neo4j还提供了强大的图算法库可以用来分析知识图谱的结构特征CALL gds.pageRank.stream({ nodeProjection: Concept, relationshipProjection: RELATED }) YIELD nodeId, score RETURN gds.util.asNode(nodeId).name AS name, score ORDER BY score DESC LIMIT 10这个查询会返回知识图谱中最重要的概念节点基于PageRank算法计算得出。最后可以考虑将整个系统容器化使用Docker来管理Ollama、GraphRAG和Neo4j服务。这样可以简化部署流程也便于在不同环境间迁移。