那么第二篇文章,我就可以开始实现整个框架了!
项目名称:“易速鲜花”内部员工知识库问答系统。
项目介绍:“易速鲜花”作为一个大型在线鲜花销售平台,有自己的业务流程和规范,也拥有针对员工的SOP手册。新员工入职培训时,会分享相关的信息。但是,这些信息分散于内部网和HR部门目录各处,有时不便查询;有时因为文档过于冗长,员工无法第一时间找到想要的内容;有时公司政策已更新,但是员工手头的文档还是旧版内容。
这个是我们所知道的项目的名称和介绍,基于上述需求,根据小册,我需要开发一套基于各种内部知识手册的 “Doc-QA” 系统。这个系统将充分利用LangChain框架,处理从员工手册中产生的各种问题。这个问答系统能够理解员工的问题,并基于最新的员工手册,给出精准的答案。
框架分为三个部分,数据源,大模型应用,用例。具体的流程分为五步,加载,分割,嵌入,检索,生成答案。加载文档分割是比较好理解的,我们只需要碎片化所有文档。
向量数据库的储存也就是“嵌入” 这是我第一次了解到这个概念,那我对于这个概念的理解,每一个词都有一个向量也就是数值代表着它,例如西红柿和番茄,她们向量表示就很接近,与白菜的向量表示很远。因为这两个概念在语义上有明显的不同。那它的优点就是可以把我们的文字,转换为计算机能读懂的语言。关于向量之间的对比吗,我们可以用常用的向量距离或相似度计算方法有欧氏距离和余弦相似度。
接下来就是检索生成答案,
- LLM是大模型,负责回答问题。
- retriever(vectorstore.as_retriever())负责根据问题检索相关的文档,找到具体的“嵌入片”。这些“嵌入片”对应的“文档块”就会作为知识信息,和问题一起传递进入大模型。本地文档中检索而得的知识很重要,因为从互联网信息中训练而来的大模型不可能拥有“易速鲜花”作为一个私营企业的内部知识。
这个图将整个流程作为思维导图,我觉得整体是非常清晰的。但对于将问答以html的形式表示出来,对于数学系的我来说有些陌生
<body>
<div class="container">
<div class="header">
<h1>易速鲜花内部问答系统</h1>
<img src="{{ url_for('static', filename='flower.png') }}" alt="flower logo" width="200">
</div>
<form method="POST">
<label for="question">Enter your question:</label><br>
<input type="text" id="question" name="question"><br>
<input type="submit" value="Submit">
</form>
{% if result is defined %}
<h2>Answer</h2>
<p>{{ result.result }}</p>
{% endif %}
</div>
</body>
所以我想要在笔记中写一下有关html的代码。
这是最后的整体效果!感觉上是会了,已经迫不及待想要自己做一个内部问答系统!