本文来自欧巴Godwin的博客 ,引用必须注明出处!
用LangChain读取Word和PDF的文字内容是好的,但如果内容包含表格则读取出来的内容完全没法看。用ChatGPT往往是做企业知识库,所以会出现一个场景,即员工想让ChatGPT讲解包含表格的内容。
要达到效果,本文的做法是:
1、用pandoc把Doc文档转为MarkDown而且是GitHub模式,是重点,因为MarkDown可以作为文本被embedding并且输出内容包含原汁原味的表格<Table>标签
2、用"\n## "作为MarkDown文件的切割符,用TXTLoader读取MD文件并embedding
3、这里只用embedding而不用ChatGPT,本文只做整体表格输出,不做表格格单元具体分析
直接贴出Doc表格和embedding输出的MarkDown表格对比:
1、先贴出pandoc的命令,用pandoc把Doc转为MD文件:
pandoc -s test.docx -t gfm -o test.md
2、贴出Python源码:
import os
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chromafrom langchain.document_loaders.pdf import PDFMinerLoader
from langchain.document_loaders import TextLoader
from langchain.document_loaders import UnstructuredMarkdownLoader# 1、把MD文件当做TXT加载
loader = TextLoader(".\\单文件\\test.md","UTF-8")
pages = loader.load_and_split()# 2、拆分文件
text_splitter = CharacterTextSplitter(separator = "\n## ",chunk_size = 500, #chunk_size = 1000,chunk_overlap = 0
)# 切割加载的 document
split_docs = text_splitter.split_documents(pages)
print(f'documents:{len(split_docs)}')
#print("拆分后的文档:" + str(split_docs))# 3、将文件embedding
os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxx"
os.environ["OPENAI_API_BASE"] = "https://yyyyyyyyyyy.openai.azure.com/"
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002", deployment="lk-text-embedding-ada-002", chunk_size=1)print("开始embedding")# 4、将拆分后的文本embeddings后存储到Vector数据库
vectordb = Chroma.from_documents(split_docs, embedding=embeddings, persist_directory="./")
vectordb.persist()result_list=vectordb.search("岗位设置是什么",'similarity')
print(result_list[0])
3、运行代码终端输出的内容,把内容贴到txt文件另保存为.md,再上传到有道云笔记这类支持MD格式的软件即可看到上图MD格式内容:
page_content='岗位设置\n\n根据项目研发过程主要分为需求整理、项目研发、生产发布三个阶段。明确工作职责,逐步实现产品经理、项目经理、软件工程师师、测试工程师、运维工程师的岗位设置。\n\n<table>\n<colgroup>\n<col style="width: 16%" />\n<col style="width: 56%" />\n<col style="width: 27%" />\n</colgroup>\n<thead>\n<tr class="header">\n<th><strong>岗位</strong></th>\n<th><strong>工作内容</strong></th>\n<th><strong>责任</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr class="odd">\n<td>产品经理</td>\n<td><p>1、负责分析需求、整理需求,编写需求文档。</p>\n<p>2、绘制界面原型demo等,设计功能使用的具体描述、行为者、前置条件、后置条件、UI描述、业务流程/子流程/分支流程,界面
说明等,完成大部分的前端设计,小部分的后端设计。</p>\n<p>3、对项目组成员详细讲解需求。</p>\n<p>4、项目过程中维护和跟踪需求状态。</p></td>\n<td><p>1、对产品需求的真实
度负责。</p>\n<p>2、对产品整体风格负责。</p>\n<p>3、对项目整体设计流程负责。</p>\n<p>4、对需求的生命周期负责。</p></td>\n</tr>\n<tr class="even">\n<td>项目经理</td>\n<td><p>1、选定项目组成员,成立项目组,安排任务分工。</p>\n<p>2、制定研发主计划,包括需求,设计,编码,测试这几个阶段的计划。</p>\n<p>3、评估项目研发投入的资源。</p>\n<p>4、制定项目组开发进度表, 对组内人员工作进度监控。</p>\n<p>5、对文档的质量进行检查、把关。</p>\n<p>6、组织需求评审、技术评审等会议。</p></td>\n<td><p>1、对项目资源
有效使用负责。</p>\n<p>2、对各岗位沟通协调工作负责。</p>\n<p>3、对项目的进度负责。</p>\n<p>4、对系统总体设计、详细设计文档质量负责。</p>\n<p>5、对项目组会议质量负责。</p></td>\n</tr>\n<tr class="odd">\n<td>软件工程师</td>\n<td><p>1、负责把产品需求分解为研发任务。</p>\n<p>2、负责系统的模块设计。</p>\n<p>3、负责模块的代码编写、维护
。</p>\n<p>4、负责技术文档的编写、维护。</p>\n<p>5、负责与测试工程师的交互,处理测试工程师的问题。</p>\n<p>6、对项目组成员进行技术指导。</p></td>\n<td><p>1、对研发任
务的有效性负责。</p>\n<p>2、对模块设计的有效性负责。</p>\n<p>3、对模块的开发效率和代码质量负责。</p>\n<p>4、对技术文档的完整性、实时性、可读性负责。</p></td>\n</tr>\n<tr class="even">\n<td>测试工程师</td>\n<td><p>1、根据需求分析和系统总体设计,编写测试文档和测试用例。</p>\n<p>2、对系统的功能、性能、异常进行测试。</p>\n<p>3、编写测试报告。</p>\n<p>4、组织SIT、UAT等各类测试活动。</p></td>\n<td><p>1、对测试的质量负责。</p>\n<p>2、对测试报告负责。</p>\n<p>3、对各类测试活动的质量负责。</p></td>\n</tr>\n<tr class="odd">\n<td>运维工程师</td>\n<td><p>1、保障线上环境的正常运行,处理线上的各种问题;</p>\n<p>2、监控线上系统,分析和预防线上系统出现问题;</p>\n<p>3、构建自动化运维平台,提高运维效率;</p>\n<p>4、规范运维流程,定期提交汇总报告;</p>\n<p>5、\n周期做数据备份,测试数据备份的正确性和完整性,以增强服务器的安全性。</p></td>\n<td><p>1、对线上环境的稳定性负责。</p>\n<p>2、对服务器的安全性负责。</p>\n<p>3、对数据备份的正确性和完整性负责。</p></td>\n</tr>\n</tbody>\n</table>' metadata={'source': '.\\单文件\\test.md'}