graphRAG用微软和openai自家的产品使用起来非常丝滑流畅,但如果想用第三方的大模型API或者本地部署LLM,就要折腾不少了,可不仅仅是修改配置文件这么简单。我用了一种通过venv环境隔离+修改python graphrag包源码的方法,关键的几个步骤点记录下来:
后端用flask启动一个兼容openai api格式的LLM聊天和文本embedding的HTTP接口 参考openai的官方接口文档:https://platform.openai.com/docs/guides/chat-completions/response-format https://platform.openai.com/docs/guides/embeddings/what-are-embeddings
LLM和embedding模型部署在本地,flask后端参考代码示例
@app.route('/chat/completions', methods=['POST'])
def get_chat_completions():
data = request.get_json()
messages = data.get('messages')
adapter = app.config['adapter']
with torch.no_grad():
response = adapter.model.chat(
adapter.tokenizer, messages, stream=False)
print(response)
res = {"choices": [{"message": {"content": response, "role": "assistant"}}],
"model": app.config['model_path']}
return jsonify(res)
@app.route('/embeddings', methods=['POST'])
def get_embeddings():
data = request.get_json()
text = data.get('input')
response = app.config['ebd'].encode([text])
res = {"data": [{"object": "embedding",
"index": 0, "embedding": response[0].tolist()}],
"model": app.config['ebd_path']}
return jsonify(res)
为了让graphRAG能使用openai以外的API接口,需要修改python graphrag和openai库的源码,为了python环境隔离,修改源码不会影响到其他项目,创建一个venv虚拟环境
python -m venv grag-local
source grag-local/bin/activate
然后去grag-local/lib和grag-local/lib64(这两个目录应该是软连接的)修改graphrag和openai的源码
把 grag-local/lib/python3.11/site-packages/openai/resources/embeddings.py
中的 return self._post("/embeddings",
修改为完整的http本地路径
继续在 resources
目录下搜索,把 /chat/completions
也都换成完整的http路径
豆包修改embedding注释diao
params = {
"input": input,
"model": model,
"user": user,
"dimensions": dimensions,
# "encoding_format": encoding_format,
}
# if not is_given(encoding_format) and has_numpy():
# params["encoding_format"] = "base64"
项目settings.yaml里面的api_base也需要修改成本地主机名,127.0.0.1:port的形式,豆包的话模型名称换成相应的接入点
python -m graphrag.index –root .
原始的prompt翻译成中文,示例换成液压行业的例子,由于原始的prompt太过于冗长和复杂,即使是人类也很难读懂 格式错误的输出会导致构建失败,因此对prompt做了精简
查询示例:python -m graphrag.query –root . “液压马达和液压泵的区别是什么” –method local
使用豆包构建text1245(不含cnki论文)的graphrag花费了约1300万个token,进行一次local查询大约需要6000token(选择题),一次global查询可能需要50万个token
参考:https://www.cnblogs.com/theseventhson/p/18285058