AI 时代,如何从海量私有文档(非公开)中快速提取精准信息成为了许多企业和个人的迫切需求。
本文介绍了一款基于 Qwen2.5-14B 大语言模型(换成 DeepSeek 原理一致)与 Elasticsearch 搜索引擎构建的大数据知识库智能问答系统。
该系统结合了向量检索技术、检索增强技术(RAG)和生成式 AI,能够高效处理多格式文档并为用户提供准确、自然的回答。
以下将从实测效果、环境要求、整体架构、代码解读以及改进展望五个方面详细阐述该系统的实现方案。
该系统导入《一本书讲透 Elasticsearch》21章(纸质书 483页,63.8万字)全部内容。
经过多次实测,能够有效应对多样化的用户查询,展现出强大的信息检索与回答生成能力。
例如,当用户输入与知识库文档相关的具体问题时,系统能够迅速定位相关内容并生成连贯、准确的回答。
这种能力得益于 Elasticsearch 的高效检索以及 Qwen2.5-14b 的上下文理解与生成能力。
在实际测试中,系统对常见文档格式(如 PDF、Word、Excel、txt 等)中的内容表现出良好的覆盖率。
针对技术文档中的专业术语的相关问题,系统能精准提取并以自然语言形式呈现给用户。
这种实测效果证明了系统在知识管理与智能问答场景中的实用价值。
为确保系统的正常运行和高效性能,以下是所需的软硬件环境与版本要求:
Ollama:
用于管理和运行 Qwen2.5-14b 大语言模型。
C:\Users\Administrator>ollama list
NAME ID SIZE MODIFIED
qwen2.5:14b 7cdf5a0187d5 9.0 GB 3 months ago
qwen2:72b 14066dfa503f 41 GB 7 months ago
qwen2:7b e0d4e1163c58 4.4 GB 7 months ago
FSCrawler 2.10:
用于将本地文档(如 PDF、DOC、XLS、PPT、TXT)爬取并索引到 Elasticsearch。
Elasticsearch 8.15.3:
核心搜索引擎,负责存储和检索向量化的文档数据。
Kibana 8.15.3:
可视化工具,用于监控和管理 Elasticsearch 的状态与索引。
向量化模型:
SentenceModel('shibing624/text2vec-base-chinese'),专为中文文本设计的句子嵌入模型,用于将查询和文档转化为向量表示。
对话客户端:
Gradio,提供基于 Web 的交互界面,方便用户输入查询并查看回答。
地址:https://github.com/gradio-app/gradio
这些组件共同构成了系统的技术基础,确保了从数据摄取到回答生成的完整流程。
系统的架构设计清晰地分为多个层次和流程,以下基于提供的两张架构图进行详细解读:
上述架构图展示了一个垂直的层次结构,描述了系统的核心组件及其连接关系,自上而下解读如下:
箭头从上到下连接各层,表明数据从用户界面流向大语言模型,再经过向量化、检索,最终基于文档数据生成回答。
如下水平流程图展示了查询的处理过程:
综合两图来看,系统采用经典的 RAG(Retrieval-Augmented Generation) 架构:
用户查询首先通过向量化模型(shibing624/text2vec-base-chinese
)转化为向量,在 Elasticsearch 中检索相关文档,随后将查询与检索结果传递给 Qwen2.5-14b 生成最终回答。
Gradio 提供友好界面,FSCrawler 确保数据摄取的自动化,而公网接口则扩展了系统的应用场景。
检索增强生成(RAG)简单来说就是先从一大堆文档中找到跟用户问题相关的内容,然后用大语言模型把这些内容整理成自然、易懂的回答。
以下是实现该系统的一般步骤与代码思路,具体代码放到死磕Elasticsearch知识星球。
使用 FSCrawler 扫描本地文件并索引到 Elasticsearch:
fscrawler --config_dir /path/to/config job_name
配置文件需指定文档路径和 Elasticsearch 索引名称。
利用 shibing624/text2vec-base-chinese
对文档和查询进行向量化:
from text2vec import SentenceModel
model = SentenceModel('shibing624/text2vec-base-chinese')
# 文档向量化并存入 Elasticsearch
for doc in documents:
vector = model.encode(doc['text'])
es.index(index='knowledge_base', body={'text': doc['text'], 'vector': vector})
将用户查询向量化并在 Elasticsearch 中执行相似性搜索,这里本质做的是关键词匹配+向量检索的组合方式。
将查询和检索结果传递给 Qwen2.5-14b 生成回答:
from ollama import Client
ollama = Client()
context = "\n".join([doc['_source']['text'] for doc in results['hits']['hits']])
prompt = f"根据以下内容回答问题:\n{context}\n问题:{query}"
response = ollama.generate(model='qwen2.5:14b', prompt=prompt)
answer = response['text']
通过 Gradio 实现交互:
import gradio as gr
def qa_system(query):
# 查询处理、检索、生成逻辑
return answer
interface = gr.Interface(fn=qa_system, inputs="text", outputs="text")
interface.launch()
上述步骤展示了从数据摄取到回答生成的完整流程,体现了系统的模块化设计。
为进一步提升系统性能与用户体验,可考虑以下改进方向:
text2vec
,提高向量表示的语义准确性。基于 Qwen2.5-14b 与 Elasticsearch 的大数据知识库智能问答系统,通过向量检索与生成式 AI 的检索增强 RAG 结合,为用户提供了高效、精准的信息获取途径。
无论是技术架构的清晰性,还是实测效果的可靠性,该系统都展现了检索增强RAG 在知识管理领域的巨大潜力。
仅抛砖引玉,期待大家结合自己业务场景进行深入留言、交流讨论。
视频讲解地址:https://t.zsxq.com/E1toS
Elasticsearch 大数据存储与检索系统化实战直播课
Elasticsearch 8.X 向量检索和普通检索能否实现组合检索?如何实现?
高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索
更短时间更快习得更多干货!
和全球超2000+ Elastic 爱好者一起精进!
elastic6.cn——ElasticStack进阶助手
抢先一步学习进阶干货!