NLP(六十一)使用Baichuan-13B-Chat模型构建智能文档问答助手
在文章NLP(六十)Baichuan-13B-Chat模型使用体验中,我们介绍了Baichuan-13B-Chat模型及其在向量嵌入和文档阅读上的初步尝试。
本文将详细介绍如何使用Baichuan-13B-Chat模型来构建智能文档问答助手。
文档问答流程
智能文档问答助手的流程图如下:
文档加载(Document Loading):加载文档,文档格式为URL,PDF,Database。本项目暂时先支持txt文件,后续将支持更多文件格式;
文档划分(Splitting):将文档按照特定格式进行划分,形成文档片段。本项目采用的文档划分方式为LangChain中的RecursiveCharacterTextSplitter,参考网址为:https://python.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/recursive_text_splitter。
文档存储(Storage):将划分后的文档进行向量嵌入,再插入至向量数据库。本项目采用的储存方式为ElasticSearch及向量数据库Milvus。
文档召回:对于输入query,从文档存储中召回相关文档片段。本项目采用的召回方式为ElasticSearch中的内置BM25相似度算法及Milvus中的向量距离。
问答输出:对于召回文档和输入query,构建合适的Prompt,利用大模型(LLM)输出最终答案。
下面讲介绍细节。本项目已在Github上开源,项目网址为:https://github.com/percent4/document_qa_with_llm 。
环境搭建
本项目开发的Web框架为Flask,API接口两个:文件上传接口和文档问答接口。文件上传接口如下:
文档召回采用ElasticSearch和Milvus相结合的方式,设置ElasticSearch和Milvus召回最相似文本数量为2。
ElasticSearch中创建的index为docs,mapping结构如下:
1 |
|
其中source代表上传文档名称,cont_id为文本片段编号,content为文本片段。content
字段采用的analyzer为ik_smart
,该analyzer可较好地对中文进行分词。
Milvus创建的collection为docs_qa,schema如下:
embeddings
字段为Baichuan-13B-Chat模型的文本向量嵌入,向量维度为512,范数为1(即单位向量),搜索距离度量采用IP
,即两个向量的内积。
大模型采用Baichuan-13B-Chat,主要用于文本片段的向量嵌入和文档问答。关于Baichuan-13B-Chat模型的部署和使用,可参考文章NLP(六十)Baichuan-13B-Chat模型使用体验。
文档问答
本文使用的文档为《封神》耗资30亿,第一部上映第次日,北京文化跌停
,访问网址为:https://m.jrj.com.cn/madapter/stock/2023/07/22141537710254.shtml
,将其文本内容保存为txt文件,并通过文件上传接口,将数据内容插入至ES和Milvus。
我们的问题(输入query)为:封神第一部什么时候上映的?
,对其进行向量嵌入,在ES和Milvus中召回的相似文本为:
1 |
|
大模型文档问答的Prompt为:
1 |
|
输出答案为:
1 |
|
更多测试内容可参考本项目的Github网址。
总结
本项目的Github网址为:https://github.com/percent4/document_qa_with_llm ,后续将持续优化这个项目,提升文档问答的方便性和智能性。
本文详细介绍了如何使用Baichuan-13B-Chat模型来构建智能文档问答助手,希望能给读者们一些启发。
欢迎关注我的公众号NLP奇幻之旅,原创技术文章第一时间推送。欢迎关注我的知识星球“自然语言处理奇幻之旅”,笔者正在努力构建自己的技术社区。