使用 Easysearch 打造企业内部知识问答系统
每个新员工都曾在某个时刻面对过这样的挑战:初入公司,同事们分享的文档资料犹如知识的海洋,但其中往往夹杂着冗长的内容,版本也可能过时。面对这样的背景,我们可以利用 Easysearch 结合大型语言模型(LLM)构建一个内部知识的问答系统。
这个系统可以被形象地称为“智慧问答者”,它犹如一位经验丰富的同事,随时准备解答你的疑惑。那么,如何实现这个系统呢?让我们深入了解其开发框架。
一、开发框架概述
整个框架可以分为四个核心部分:数据源、大模型应用、大模型和QA场景。数据源可以是多种多样的,如PDF、Word文档、文本文件等。在本次示例中,我们主要使用PDF文档作为数据源。大模型应用则是与大型语言模型进行交互的部分,它负责生成我们需要的答案。大模型是整个系统的核心,负责执行相关任务。而QA场景则是基于大模型的引擎,构建一个交互界面,方便用户提问和获取答案。
二、数据准备
在本次示例中,我们使用的资料是“INFINI 产品安装手册.pdf”。为了充分利用这份手册,我们使用LangChain的document_loaders来加载文件。这个工具集成了多种数据源格式,可以轻松加载我们的PDF文件。通过PyPDFLoader类处理PDF文件,我们可以将文档内容存储在一个列表中,为后续处理做好准备。
三、文本分割
由于文件内容可能很长,我们将其分割成更小的块进行处理。这样做的好处是,在运行时只需检索与问题最相关的部分。LangChain提供了文本分割工具,非常方便。我们将文档分割成每块包含1000个字符的块,每块之间有200个字符的重叠。这种重叠有助于减少将语句与其相关的上下文分离的可能性。
四、向量库Easysearch的应用
完成文本分割后,我们将这些文本块转换成向量的形式,并存储在一个向量数据库中。在本示例中,我们使用mxbai-embed-large模型来生成向量。然后,我们将这些向量和原始内容存入Easysearch。这样,当员工提问时,系统可以迅速找到最匹配的答案。本地模型的部署可以使用各种工具,如ollama,根据个人的喜好进行选择。
这个内部知识的问答系统旨在为员工提供一个便捷、高效的工具,帮助他们快速找到所需的信息,提高工作效率。 模型嵌入与检索:从文本到答案的旅程
第一步:文本嵌入
我们需要定义嵌入模型,将文本信息转化为数学表达。这里,我们使用的是来自langchain_community的OllamaEmbeddings模型。通过简单的代码:
```python
from langchain_community.embeddings import OllamaEmbeddings
ollama_emb = OllamaEmbeddings(model="mxbai-embed-large")
```
我们已经成功引入了嵌入模型,准备将文本转化为向量。
第二步:文本向量的存储
接下来,我们将文本向量存储到EasySearch集群中。为此,我们定义了EcloudESVectorStore来存储这些向量。我们的EasySearch集群位于`192.168.56.3:9200`,使用用户名“admin”和密码“e5ac1b537785ae27c187”。我们将向量存储在名为“infini”的索引中。
通过以下代码段:
```python
from langchain_community.vectorstores import EcloudESVectorStore
ES_URL = "192.168.56.3:9200"
USER = "admin"
PASSWORD = "e5ac1b537785ae27c187"
indexname = "infini"
chunked_documents = ... 你的文档块数据
docsearch = EcloudESVectorStore.from_documents(chunked_documents, ollama_emb, es_url=ES_URL, user=USER, password=PASSWORD, index_name=indexname, verify_certs=False)
```
我们成功将文本块转换成了向量,并存入到了EasySearch集群的“infini”索引中。在索引中,我们可以清晰地看到,文本块的原始内容被存储在“text”字段,而对应的向量表示则存储在“vector”字段。
检索与答案生成
现在,我们进入到了最关键的步骤:检索及生成答案。在这个步骤中,我们将使用一个生成式大模型,并创建一个RetrievalQA链来生成问题的答案。这个链主要包含两大组成部分:LLM和retriever。
---
5. 构建检索准备模型与检索链
让我们深入探索如何准备模型和构建检索链。想象一下,我们正在启动一个智能问答系统,而其中的核心环节正是如何有效地从海量的信息中检索出与用户问题相关的答案。
检索到的内容需要经过合并和去重,然后与原始问题一起提交给qwen2模型,生成最终的答案。虽然这里主要使用了向量检索,但我们也完全可以结合全文检索,这正是easysearch检索库的一大优势。
接下来,我们来到前端展示环节。这里,我们将创建一个Flask应用来接收用户的问题并生成答案。使用之前构建的RetrievalQA链,我们可以快速获取相关文档并生成答案。然后,我们将这些信息返回给用户,呈现在一个精心设计的网页上。这个网页通过index.html进行答案的渲染和呈现,让用户能够直观地看到答案并与系统进行交互。
整个过程融合了深度学习、自然语言处理和Web开发等多个技术领域的知识,为用户提供了一个高效、便捷的智能问答体验。 6. Q&A系统的UI实现之旅
利用Flask框架,我们轻松搭建了一个交互式问答系统。在Flask APP的初始化后,我们的主路由开始接收用户的请求。当用户通过表单提交问题时,我们的应用会捕获这个POST请求。在接收到请求后,我们从表单中提取用户的问题,并将其传递给QA链进行处理。这个强大的链式系统,结合了大模型的能力,会迅速生成答案并返回给前端。前端收到答案后,将其渲染到模板页面,呈现在用户面前。这个过程对于用户来说几乎是无缝的,一切都取决于我们的后端计算效率。想象一下,只需要通过简单的提问,就可以轻松获取知识,这是多么便捷的体验!
让我们模拟一下用户与系统的互动。用户提问后,系统会迅速响应,回答的速度取决于我们的服务器性能。这种实时的互动体验,无疑提升了用户的满意度。我们还可以对系统进行内容校验。比如,通过搜索关键词“LOGGING_ES_ENDPOINT”,我们可以验证答案的准确性。如果答案令人满意,那么整个系统就达到了预期的效果。我们还可以根据需求调整模板中的提示词或者更换其他大模型,以满足更多样化的需求。
这次示例展示了基于LangChain、easysearch和大模型的内部知识问答系统的开发过程。你是否觉得这个过程简单易懂?如果你有任何疑问或需要进一步的交流,请随时联系我。我们期待与你共同探索更多的可能性!
这个问答系统不仅展示了技术的魅力,更展现了用户体验至上的设计理念。无论是对于开发者还是用户来说,这都是一次愉快的体验。让我们期待更多的技术与创意的碰撞,带来更多的惊喜和可能性!
文章从网络整理,文章内容不代表本站观点,转账请注明【蓑衣网】