改造目的和内容
- 向量存储使用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)
- 从github下载QANYTHING-1.4.1源代码 https://github.com/netease-youdao/QAnything/releases
image-11.png
-
使用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": [ "." ] }
离线环境遇到问题
- tiktoken 联网下载
- 下载https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken
- cl100k_base.tiktoken复制到QANYTHING-1.4.1目录下
- 重命名cl100k_base.tiktoken为9b5ad71b2ce5302211f9c61530b329a4922fc6a4
- export TIKTOKEN_CACHE_DIR=./
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
- 添加base_store.py,给es和faiss添加公共的父类
- 添加包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)]
- 添加支持es判断,创建es的client对象
- 添加包base_embedding
-
修改支持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)]
- 修改qanything_kernel/connector/embedding/embedding_onnx_backend.py
-
修改支持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)]