From ed55b9ad37c2945c16ee4c438c3f010443143003 Mon Sep 17 00:00:00 2001 From: yanqiangmiffy <1185918903@qq.com> Date: Wed, 25 Sep 2024 16:00:37 +0800 Subject: [PATCH] =?UTF-8?q?features@=E5=AE=8C=E6=88=90=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- api/apps/core/parser/views.py | 2 +- docs/quickstart.md | 185 +++++++++++++++++++++ docs/requirements-example.txt | 176 ++++++++++++++++++++ examples/rag/xunfei_rag.py | 159 +++++++++--------- gomate/modules/document/pdf_parser_fast.py | 38 ++++- gomate/version.py | 2 +- resources/install.png | Bin 0 -> 39833 bytes 8 files changed, 481 insertions(+), 84 deletions(-) create mode 100644 docs/requirements-example.txt create mode 100644 resources/install.png diff --git a/README.md b/README.md index 3a7623c..2563ba8 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,9 @@ GoMate框架的设计核心在于其**高度的可配置性和模块化**,使 可靠的输入,可信的输出 -## 🏗️ 更新记录 +## 🎉 更新记录 +- gomate打包构建,支持pip和source两种方式安装 - 添加[MinerU文档解析](https://github.com/gomate-community/GoMate/blob/main/docs/mineru.md) :一站式开源高质量数据提取工具,支持PDF/网页/多格式电子书提取`[20240907] ` - RAPTOR:递归树检索器实现 diff --git a/api/apps/core/parser/views.py b/api/apps/core/parser/views.py index 67166fc..a8a4d48 100644 --- a/api/apps/core/parser/views.py +++ b/api/apps/core/parser/views.py @@ -20,7 +20,7 @@ from gomate.modules.document.docx_parser import DocxParser from gomate.modules.document.excel_parser import ExcelParser from gomate.modules.document.html_parser import HtmlParser -from gomate.modules.document.pdf_parser import PdfSimParser +from gomate.modules.document.pdf_parser_fast import PdfSimParser from gomate.modules.document.ppt_parser import PptParser from gomate.modules.document.txt_parser import TextParser from gomate.modules.document.json_parser import JsonParser diff --git a/docs/quickstart.md b/docs/quickstart.md index e69de29..5c12961 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -0,0 +1,185 @@ +## GoMate快速上手教程 + +## 🛠️ 安装 + +### 方法1:使用`pip`安装 + +1. 创建conda环境(可选) + +```sehll +conda create -n gomate python=3.9 +conda activate gomate +``` + +2. 使用`pip`安装依赖 + +```sehll +pip install gomate +``` + +### 方法2:源码安装 + +1. 下载源码 + +```shell +git clone https://github.com/gomate-community/GoMate.git +``` + +2. 安装依赖 + +```shell +pip install -e . +``` + +## 🚀 快速上手 + +### 1 模块介绍📝 + +```text +├── applications +├── modules +| ├── citation:答案与证据引用 +| ├── document:文档解析与切块,支持多种文档类型 +| ├── generator:生成器 +| ├── judger:文档选择 +| ├── prompt:提示语 +| ├── refiner:信息总结 +| ├── reranker:排序模块 +| ├── retrieval:检索模块 +| └── rewriter:改写模块 +``` + + +### 2 导入模块 + +```python +import pickle +import pandas as pd +from tqdm import tqdm + +from gomate.modules.document.chunk import TextChunker +from gomate.modules.document.txt_parser import TextParser +from gomate.modules.document.utils import PROJECT_BASE +from gomate.modules.generator.llm import GLM4Chat +from gomate.modules.reranker.bge_reranker import BgeRerankerConfig, BgeReranker +from gomate.modules.retrieval.bm25s_retriever import BM25RetrieverConfig +from gomate.modules.retrieval.dense_retriever import DenseRetrieverConfig +from gomate.modules.retrieval.hybrid_retriever import HybridRetriever, HybridRetrieverConfig +``` + + +### 3 文档解析以及切片 + +```text +def generate_chunks(): + tp = TextParser()# 代表txt格式解析 + tc = TextChunker() + paragraphs = tp.parse(r'H:/2024-Xfyun-RAG/data/corpus.txt', encoding="utf-8") + print(len(paragraphs)) + chunks = [] + for content in tqdm(paragraphs): + chunk = tc.chunk_sentences([content], chunk_size=1024) + chunks.append(chunk) + + with open(f'{PROJECT_BASE}/output/chunks.pkl', 'wb') as f: + pickle.dump(chunks, f) +``` +>corpus.txt每行为一段新闻,可以自行选取paragraph读取的逻辑 + +`TextChunker`为文本块切块程序,主要特点使用[InfiniFlow/huqie](https://huggingface.co/InfiniFlow/huqie)作为文本检索的分词器,适合RAG场景。 + + +### 4 构建检索器 + +**配置检索器:** + +下面是一个混合检索器`HybridRetriever`配置参考,其中`HybridRetrieverConfig`需要由`BM25RetrieverConfig`和`DenseRetrieverConfig`配置构成。 + +```python +# BM25 and Dense Retriever configurations +bm25_config = BM25RetrieverConfig( + method='lucene', + index_path='indexs/description_bm25.index', + k1=1.6, + b=0.7 +) +bm25_config.validate() +print(bm25_config.log_config()) +dense_config = DenseRetrieverConfig( + model_name_or_path=embedding_model_path, + dim=1024, + index_path='indexs/dense_cache' +) +config_info = dense_config.log_config() +print(config_info) +# Hybrid Retriever configuration +# 由于分数框架不在同一维度,建议可以合并 +hybrid_config = HybridRetrieverConfig( + bm25_config=bm25_config, + dense_config=dense_config, + bm25_weight=0.7, # bm25检索结果权重 + dense_weight=0.3 # dense检索结果权重 +) +hybrid_retriever = HybridRetriever(config=hybrid_config) +``` + +**构建索引:** + +````python +# 构建索引 +hybrid_retriever.build_from_texts(corpus) +# 保存索引 +hybrid_retriever.save_index() +```` + +如果构建好索引之后,可以多次使用,直接跳过上面步骤,加载索引 +```text +hybrid_retriever.load_index() +``` + +**检索测试:** + +```python +query = "支付宝" +results = hybrid_retriever.retrieve(query, top_k=10) +print(len(results)) +# Output results +for result in results: + print(f"Text: {result['text']}, Score: {result['score']}") +``` + +### 5 排序模型 +```python +reranker_config = BgeRerankerConfig( + model_name_or_path=reranker_model_path +) +bge_reranker = BgeReranker(reranker_config) +``` +### 6 生成器配置 +```python +glm4_chat = GLM4Chat(llm_model_path) +``` + +### 6 检索问答 + +```python +# ====================检索问答========================= +test = pd.read_csv(test_path) +answers = [] +for question in tqdm(test['question'], total=len(test)): + search_docs = hybrid_retriever.retrieve(question, top_k=10) + search_docs = bge_reranker.rerank( + query=question, + documents=[doc['text'] for idx, doc in enumerate(search_docs)] + ) + # print(search_docs) + content = '\n'.join([f'信息[{idx}]:' + doc['text'] for idx, doc in enumerate(search_docs)]) + answer = glm4_chat.chat(prompt=question, content=content) + answers.append(answer[0]) + print(question) + print(answer[0]) + print("************************************/n") +test['answer'] = answers + +test[['answer']].to_csv(f'{PROJECT_BASE}/output/gomate_baseline.csv', index=False) +``` \ No newline at end of file diff --git a/docs/requirements-example.txt b/docs/requirements-example.txt new file mode 100644 index 0000000..7d7cb89 --- /dev/null +++ b/docs/requirements-example.txt @@ -0,0 +1,176 @@ +accelerate==0.34.2 +aiofiles==23.2.1 +aiohappyeyeballs==2.4.0 +aiohttp==3.10.6 +aiosignal==1.3.1 +annotated-types==0.7.0 +anyio==4.6.0 +async-timeout==4.0.3 +atlastk==0.13.3 +attrs==24.2.0 +beautifulsoup4==4.12.3 +bm25s==0.2.1 +certifi==2024.8.30 +cffi==1.17.1 +chardet==5.2.0 +charset-normalizer==3.3.2 +click==8.1.7 +cloudpickle==3.0.0 +codecov==2.1.13 +contourpy==1.3.0 +coverage==7.6.1 +cryptography==43.0.1 +cycler==0.12.1 +datasets==3.0.0 +datrie==0.8.2 +dill==0.3.8 +distro==1.9.0 +et-xmlfile==1.1.0 +exceptiongroup==1.2.2 +faiss-cpu==1.8.0.post1 +fastapi==0.115.0 +ffmpy==0.4.0 +filelock==3.16.1 +FlagEmbedding==1.2.11 +flake8==7.1.1 +flake8-docstrings==1.7.0 +fonttools==4.54.1 +frozenlist==1.4.1 +fsspec==2024.6.1 +future==1.0.0 +gradio==4.44.0 +gradio_client==1.3.0 +greenlet==3.1.1 +h11==0.14.0 +h5py==3.11.0 +hanziconv==0.3.2 +html2text==2024.2.26 +html_text==0.6.2 +httpcore==1.0.5 +httpx==0.27.2 +huggingface-hub==0.25.1 +hyperopt==0.2.7 +idna==3.10 +importlib_resources==6.4.5 +iniconfig==2.0.0 +jieba==0.42.1 +Jinja2==3.1.4 +jiter==0.5.0 +joblib==1.4.2 +jsonpatch==1.33 +jsonpointer==3.0.0 +kiwisolver==1.4.7 +langchain==0.3.0 +langchain-core==0.3.5 +langchain-huggingface==0.1.0 +langchain-openai==0.2.0 +langchain-text-splitters==0.3.0 +langsmith==0.1.128 +llvmlite==0.43.0 +loguru==0.7.2 +lxml==5.3.0 +lxml_html_clean==0.2.2 +markdown-it-py==3.0.0 +MarkupSafe==2.1.5 +matplotlib==3.9.2 +mccabe==0.7.0 +mdurl==0.1.2 +mpmath==1.3.0 +multidict==6.1.0 +multiprocess==0.70.16 +networkx==3.2.1 +nltk==3.9.1 +numba==0.60.0 +numpy==1.26.4 +nvidia-cublas-cu12==12.1.3.1 +nvidia-cuda-cupti-cu12==12.1.105 +nvidia-cuda-nvrtc-cu12==12.1.105 +nvidia-cuda-runtime-cu12==12.1.105 +nvidia-cudnn-cu12==9.1.0.70 +nvidia-cufft-cu12==11.0.2.54 +nvidia-curand-cu12==10.3.2.106 +nvidia-cusolver-cu12==11.4.5.107 +nvidia-cusparse-cu12==12.1.0.106 +nvidia-nccl-cu12==2.20.5 +nvidia-nvjitlink-cu12==12.6.68 +nvidia-nvtx-cu12==12.1.105 +openai==1.47.1 +openpyxl==3.1.5 +orjson==3.10.7 +packaging==24.1 +pandas==2.2.3 +pdfminer.six==20231228 +pdfplumber==0.11.4 +peft==0.12.0 +pillow==10.4.0 +pluggy==1.5.0 +protobuf==5.28.2 +psutil==6.0.0 +py4j==0.10.9.7 +pyarrow==17.0.0 +pycodestyle==2.12.1 +pycparser==2.22 +pydantic==2.9.2 +pydantic_core==2.23.4 +pydocstyle==6.3.0 +pydub==0.25.1 +pyflakes==3.2.0 +Pygments==2.18.0 +PyMuPDF==1.24.10 +PyMuPDFb==1.24.10 +pynndescent==0.5.13 +pyparsing==3.1.4 +PyPDF2==3.0.1 +pypdfium2==4.30.0 +pytest==8.3.3 +pytest-cov==5.0.0 +python-dateutil==2.9.0.post0 +python-docx==1.1.2 +python-magic==0.4.27 +python-multipart==0.0.10 +python-pptx==1.0.2 +pytz==2024.2 +PyYAML==6.0.2 +readability==0.3.1 +regex==2024.9.11 +requests==2.32.3 +rich==13.8.1 +ruff==0.6.7 +safetensors==0.4.5 +scikit-learn==1.5.2 +scipy==1.13.1 +semantic-version==2.10.0 +sentence-transformers==3.1.1 +sentencepiece==0.2.0 +shellingham==1.5.4 +six==1.16.0 +sniffio==1.3.1 +snowballstemmer==2.2.0 +soupsieve==2.6 +SQLAlchemy==2.0.35 +starlette==0.38.6 +sympy==1.13.3 +tenacity==8.5.0 +threadpoolctl==3.5.0 +tiktoken==0.7.0 +tokenizers==0.19.1 +tomli==2.0.1 +tomlkit==0.12.0 +torch==2.4.1 +tortoise==0.1.1 +tqdm==4.66.5 +transformers==4.44.2 +triton==3.0.0 +typer==0.12.5 +typing_extensions==4.12.2 +tzdata==2024.2 +umap-learn==0.5.6 +urllib3==2.2.3 +uvicorn==0.30.6 +websockets==12.0 +xgboost==2.1.1 +XlsxWriter==3.2.0 +xpinyin==0.7.6 +xxhash==3.5.0 +yarl==1.12.1 +zipp==3.20.2 diff --git a/examples/rag/xunfei_rag.py b/examples/rag/xunfei_rag.py index df663d9..edda83e 100644 --- a/examples/rag/xunfei_rag.py +++ b/examples/rag/xunfei_rag.py @@ -27,90 +27,91 @@ def generate_chunks(): pickle.dump(chunks, f) -if __name__ == '__main__': +# if __name__ == '__main__': - # test_path="H:/2024-Xfyun-RAG/data/test_question.csv" - # embedding_model_path="H:/pretrained_models/mteb/bge-m3" - # llm_model_path="H:/pretrained_models/llm/Qwen2-1.5B-Instruct" +# test_path="H:/2024-Xfyun-RAG/data/test_question.csv" +# embedding_model_path="H:/pretrained_models/mteb/bge-m3" +# llm_model_path="H:/pretrained_models/llm/Qwen2-1.5B-Instruct" - test_path = "/data/users/searchgpt/yq/GoMate_dev/data/competitions/xunfei/test_question.csv" - embedding_model_path = "/data/users/searchgpt/pretrained_models/bge-large-zh-v1.5" - llm_model_path = "/data/users/searchgpt/pretrained_models/glm-4-9b-chat" - # ====================文件解析+切片========================= - # generate_chunks() - with open(f'{PROJECT_BASE}/output/chunks.pkl', 'rb') as f: - chunks = pickle.load(f) - corpus = [] - for chunk in chunks: - corpus.extend(chunk) +test_path = "/data/users/searchgpt/yq/GoMate_dev/data/competitions/xunfei/test_question.csv" +embedding_model_path = "/data/users/searchgpt/pretrained_models/bge-large-zh-v1.5" +llm_model_path = "/data/users/searchgpt/pretrained_models/glm-4-9b-chat" +reranker_model_path = "/data/users/searchgpt/pretrained_models/bge-reranker-large" +# ====================文件解析+切片========================= +# generate_chunks() +with open(f'{PROJECT_BASE}/output/chunks.pkl', 'rb') as f: + chunks = pickle.load(f) +corpus = [] +for chunk in chunks: + corpus.extend(chunk) - # ====================检索器配置========================= - # BM25 and Dense Retriever configurations - bm25_config = BM25RetrieverConfig( - method='lucene', - index_path='indexs/description_bm25.index', - k1=1.6, - b=0.7 - ) - bm25_config.validate() - print(bm25_config.log_config()) - dense_config = DenseRetrieverConfig( - model_name_or_path=embedding_model_path, - dim=1024, - index_path='indexs/dense_cache' - ) - config_info = dense_config.log_config() - print(config_info) - # Hybrid Retriever configuration - # 由于分数框架不在同一维度,建议可以合并 - hybrid_config = HybridRetrieverConfig( - bm25_config=bm25_config, - dense_config=dense_config, - bm25_weight=0.7, # bm25检索结果权重 - dense_weight=0.3 # dense检索结果权重 - ) - hybrid_retriever = HybridRetriever(config=hybrid_config) - # 构建索引 - # hybrid_retriever.build_from_texts(corpus) - # 保存索引 - # hybrid_retriever.save_index() - # 加载索引 - hybrid_retriever.load_index() +# ====================检索器配置========================= +# BM25 and Dense Retriever configurations +bm25_config = BM25RetrieverConfig( + method='lucene', + index_path='indexs/description_bm25.index', + k1=1.6, + b=0.7 +) +bm25_config.validate() +print(bm25_config.log_config()) +dense_config = DenseRetrieverConfig( + model_name_or_path=embedding_model_path, + dim=1024, + index_path='indexs/dense_cache' +) +config_info = dense_config.log_config() +print(config_info) +# Hybrid Retriever configuration +# 由于分数框架不在同一维度,建议可以合并 +hybrid_config = HybridRetrieverConfig( + bm25_config=bm25_config, + dense_config=dense_config, + bm25_weight=0.7, # bm25检索结果权重 + dense_weight=0.3 # dense检索结果权重 +) +hybrid_retriever = HybridRetriever(config=hybrid_config) +# 构建索引 +# hybrid_retriever.build_from_texts(corpus) +# 保存索引 +# hybrid_retriever.save_index() +# 加载索引 +hybrid_retriever.load_index() - # ====================检索测试========================= - query = "支付宝" - results = hybrid_retriever.retrieve(query, top_k=10) - print(len(results)) - # Output results - for result in results: - print(f"Text: {result['text']}, Score: {result['score']}") +# ====================检索测试========================= +query = "支付宝" +results = hybrid_retriever.retrieve(query, top_k=10) +print(len(results)) +# Output results +for result in results: + print(f"Text: {result['text']}, Score: {result['score']}") - # ====================排序配置========================= - reranker_config = BgeRerankerConfig( - model_name_or_path="/data/users/searchgpt/pretrained_models/bge-reranker-large" - ) - bge_reranker = BgeReranker(reranker_config) +# ====================排序配置========================= +reranker_config = BgeRerankerConfig( + model_name_or_path=reranker_model_path +) +bge_reranker = BgeReranker(reranker_config) - # ====================生成器配置========================= - # qwen_chat = QwenChat(llm_model_path) - glm4_chat = GLM4Chat(llm_model_path) +# ====================生成器配置========================= +# qwen_chat = QwenChat(llm_model_path) +glm4_chat = GLM4Chat(llm_model_path) - # ====================检索问答========================= - test = pd.read_csv(test_path) - answers = [] - for question in tqdm(test['question'], total=len(test)): - search_docs = hybrid_retriever.retrieve(question, top_k=10) - search_docs = bge_reranker.rerank( - query=question, - documents=[doc['text'] for idx, doc in enumerate(search_docs)] - ) - # print(search_docs) - content = '\n'.join([f'信息[{idx}]:' + doc['text'] for idx, doc in enumerate(search_docs)]) - answer = glm4_chat.chat(prompt=question, content=content) - answers.append(answer[0]) - print(question) - print(answer[0]) - print("************************************/n") - test['answer'] = answers +# ====================检索问答========================= +test = pd.read_csv(test_path) +answers = [] +for question in tqdm(test['question'], total=len(test)): + search_docs = hybrid_retriever.retrieve(question, top_k=10) + search_docs = bge_reranker.rerank( + query=question, + documents=[doc['text'] for idx, doc in enumerate(search_docs)] + ) + # print(search_docs) + content = '\n'.join([f'信息[{idx}]:' + doc['text'] for idx, doc in enumerate(search_docs)]) + answer = glm4_chat.chat(prompt=question, content=content) + answers.append(answer[0]) + print(question) + print(answer[0]) + print("************************************/n") +test['answer'] = answers - test[['answer']].to_csv(f'{PROJECT_BASE}/output/gomate_baseline.csv', index=False) +test[['answer']].to_csv(f'{PROJECT_BASE}/output/gomate_baseline.csv', index=False) diff --git a/gomate/modules/document/pdf_parser_fast.py b/gomate/modules/document/pdf_parser_fast.py index 2cb078d..7adefad 100644 --- a/gomate/modules/document/pdf_parser_fast.py +++ b/gomate/modules/document/pdf_parser_fast.py @@ -11,10 +11,10 @@ """ import re from io import BytesIO - +from PyPDF2 import PdfReader as pdf2_read import fitz from tqdm import tqdm - +import logging class PdfParserUsingPyMuPDF(): """ @@ -63,6 +63,40 @@ def parse( return final_texts + final_tables +class PdfSimParser(object): + def parse(self, filename, from_page=0, to_page=100000, **kwargs): + self.outlines = [] + lines = [] + try: + self.pdf = pdf2_read( + filename if isinstance( + filename, str) else BytesIO(filename)) + for page in self.pdf.pages[from_page:to_page]: + lines.extend([t for t in page.extract_text().split("\n")]) + + outlines = self.pdf.outline + + def dfs(arr, depth): + for a in arr: + if isinstance(a, dict): + self.outlines.append((a["/Title"], depth)) + continue + dfs(a, depth + 1) + + dfs(outlines, 0) + except Exception as e: + logging.warning(f"Outlines exception: {e}") + if not self.outlines: + logging.warning(f"Miss outlines") + + return lines + + def crop(self, ck, need_position): + raise NotImplementedError + + @staticmethod + def remove_tag(txt): + raise NotImplementedError if __name__ == '__main__': pdf_parser = PdfParserUsingPyMuPDF() diff --git a/gomate/version.py b/gomate/version.py index 040a655..de54c15 100644 --- a/gomate/version.py +++ b/gomate/version.py @@ -1,3 +1,3 @@ """GoMate version file.""" -__version__ = '0.0.1' +__version__ = '0.0.13' diff --git a/resources/install.png b/resources/install.png new file mode 100644 index 0000000000000000000000000000000000000000..13d3fb8e383e2308a19f25ba9e9a00f088534d38 GIT binary patch literal 39833 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 literal 0 HcmV?d00001