魔改QAnything1.4.1(支持es向量和ollama)

改造目的和内容

  • 向量存储使用elasticsearch-8
    • 方便分布式部署
    • 添加额外属性,检索向量可以附加查询条件,甚至可以配置全文检索
  • LLM语言模型添加支持ollama
    • 默认vllm对系统资源要求太大
    • 充分利用ollama支持的guff和模型可以动态切换
  • 支持在win10下运行
  • 改造后不支持mac

修改后下载地址

修改的文档地址
https://pan.baidu.com/s/1UrQyjUBHcmus5o4U_16-tw?pwd=vsc9
修改后的代码地址
https://pan.baidu.com/share/init?surl=zjYZy8XwPERVJyhvOkhSUQ&pwd=q6iw

QANYTHING开发环境搭建(vscode)

  • 使用vscode打开

    [图片上传失败...(image-462917-1724240365110)]

  • 使用conda创建qanything的python环境

  • 创建launch.json

    • 添加
      {
          "name": "Python: sanic_api",
          "type": "debugpy",
          "request": "launch",
          "module": "qanything_kernel.qanything_server.sanic_api",
          "env": {
              "PYTHONPATH": "${workspaceRoot}",
              "PYTHONIOENCODING": "utf-8"
          },
          "args": [
              "--host",
              "0.0.0.0",
              "--port",
              "32000",
              "--model_size",
              "3B",
              // "--use_cpu",
          ],
          "jinja": true
      },
    
  • 创建setting.json

    • 添加
    {
      "python.defaultInterpreterPath": "/home/你的路径/anaconda3/envs/qanything-python/bin/python",
      "python.autoComplete.extraPaths": ["."],
      "python.terminal.activateEnvironment": true,
      "python.analysis.extraPaths": [
          "."
      ]
    }
    

离线环境遇到问题

QANYTHING功能使用说明

  • 我的系统是ubuntu22.04

  • debug启动qanything(第一次启动需要联网,下载向量模型和3b的语言模型)

    [图片上传失败...(image-6c4e7b-1724240365110)]

    [图片上传失败...(image-57fc02-1724240365110)]

    [图片上传失败...(image-179aea-1724240365110)]

  • QANYTHING功能

    • 知识库
      • 文件集
      • 问答集
    • bots对话
      • 建立不同知识库的对话内容

QANYTHING源代码分析

QAnything-1.4.1
    qanything_kernel
        configs            配置相关
        connector 
            database       存储元数据的关系型数据库
            embedding      向量模型(生产向量和获取向量)
            llm            调用LLM语言模型
            rerank         二次向量检索评分
        core               主要业务代码
        dependent_server   依赖的百度ocr
        qanything_server   服务器启动和API路由定义
        utils

QANYTHING源代码修改

  • FAISS修改为elasticsearch-8

    • 修改配置
    qanything_kernel
      configs
          model_config.py  添加以下内容
              # ES bm25检索相关配置
              HYBRID_SEARCH = True  # 是否启用es的BM25检索
              ES_BM25_SEARCH_SIZE = 50
    
              ES_HOST_LOCAL = 'https://localhost:19200/'
              ES_CLOUD_ID = None
              ES_USER = 'elastic'
              ES_PASSWORD = 'TWv-cYWmVjX1VTf+avsV'
              ES_API_KEY = None
              ES_CONNECT_PARAMS = None
              ES_SIGNATURE = 'qanything/bm25_v240320'
              ES_INDEX_NAME = 'qanything'
    
              # EMBEDDING_TYPE = 'FAISS'
              EMBEDDING_TYPE = 'ES'
    
    • 添加es_client.py文件
      • 添加包base_embedding
        • 添加base_store.py,给es和faiss添加公共的父类
              class BaseEmbeddingStore(ABC):
                  def __init__(self, mysql_client: KnowledgeBaseManager, embeddings):
                      self.mysql_client: KnowledgeBaseManager = mysql_client
                      self.embeddings = embeddings
                      self.kb_ids: List[str] = []
                  
                  @abstractmethod
                  async def search(self, kb_ids, query, filter: Optional[Union[Callable, Dict[str, Any]]] = None,
                                  top_k=VECTOR_SEARCH_TOP_K):
                      pass
          
                  @abstractmethod
                  def merge_docs(self, docs):
                      pass
          
                  @abstractmethod
                  async def add_document(self, docs):
                      pass
          
                  @abstractmethod
                  def delete_documents(self, kb_id, file_ids=None):
                      pass
          
      • 添加包es,和添加es_client.py
        • es_client.py实现的功能是faiss_client.py的elasticsearch版本,业务逻辑两者是一致的。
      • faiss/faiss_client.py 的class FaissClient(BaseEmbeddingStore)改为继承BaseEmbeddingStore
      • 添加的文件和包结构
      qanything_kernel
          connector
              database
                  base_embedding
                      base_store.py
                  es
                      es_client.py
      
      • 修改qanything_kernel/core/local_doc_qa.py
        • 添加支持es判断,创建es的client对象
          [图片上传失败...(image-950cc5-1724240365110)]
        • 添加修改添加文档可插入es
          [图片上传失败...(image-aa8892-1724240365111)]
        • 添加修改查询文档从es
          [图片上传失败...(image-a7b76f-1724240365111)]
        • 删除修改
          [图片上传失败...(image-2b0e38-1724240365111)]
          [图片上传失败...(image-8892f8-1724240365111)]
  • 修改支持win10

    • 修改qanything_kernel/connector/embedding/embedding_onnx_backend.py
      • 修改目的是支持win10
      • 修改内容
        [图片上传失败...(image-a02a8e-1724240365111)]
      inputs_onnx = {k: np.asarray(v, np.int64) for k, v in inputs_onnx.items()}
      
    • 修改qanything_kernel/connector/rerank/rerank_onnx_backend.py
      • 修改目的是支持win10
      • 修改内容
        [图片上传失败...(image-d3d65b-1724240365111)]
        inputs = {self.session.get_inputs()[0].name: np.asarray(batch['input_ids'], np.int64),
                      self.session.get_inputs()[1].name: np.asarray(batch['attention_mask'], np.int64)}
      
        if 'token_type_ids' in batch:
            inputs[self.session.get_inputs()[2].name] = np.asarray(batch['token_type_ids'], np.int64)
      
    • 修改qanything_kernel/qanything_server/sanic_api.py
      • 注解以下判断操作系统代码
        [图片上传失败...(image-a6040f-1724240365111)]
    • 修改qanything_kernel/core/local_doc_qa.py
    • 注释以下代码(偷懒不判断win系统,以下去除mac的支持功能了,调整好可以支持mac)
      [图片上传失败...(image-7c5092-1724240365111)]
  • 修改支持ollama

    • 添加文件qanything_kernel/connector/llm/llm_for_ollama.py

    • 文件qanythin_kernel/qanything_server/sanic_api.py添加以下参数
      [图片上传失败...(image-818d1e-1724240365111)]

    • 修改文件qanything_kernel/core/local_doc_qa.py,添加内容
      [图片上传失败...(image-3c60d9-1724240365111)]

    • 修改qanything_kernel/qanything_server/sanic_api.py
      [图片上传失败...(image-894134-1724240365111)]
      [图片上传失败...(image-6c74c1-1724240365111)]
      [图片上传失败...(image-b18fd2-1724240365111)]
      [图片上传失败...(image-deaa96-1724240365111)]

    • .vscode/launch.json添加启动支持ollama的启动
      [图片上传失败...(image-cd5a5d-1724240365111)]

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容