GraphRAG 不使用微软和OpenAI的API

GraphRAG 使用第三方大模型API or 本地LLM

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