首页 > 其他分享 >听说ChatGPT o1推理模型即将问世,传统问答系统是否还有存在的必要?毕业设计:基于知识图谱的智能问答系统,最全设计流程(内附源代码和部署在服务器上的链接)

听说ChatGPT o1推理模型即将问世,传统问答系统是否还有存在的必要?毕业设计:基于知识图谱的智能问答系统,最全设计流程(内附源代码和部署在服务器上的链接)

时间:2024-09-22 14:50:17浏览次数:3  
标签:答案 图谱 知识 系统 用户 查询 毕业设计 源代码 问答

  OpenAI隆重推出全新一代的o1模型,该模型在多个领域展现出了非凡的能力,标志着人工智能技术的又一次飞跃。该模型专门解决比此前的科学、代码和数学模型能做到的更难的问题,实现复杂推理。那来看看并体验以下我们传统的问答系统的设计流程和具体面貌吧!!!

1.1 系统架构设计

1.1.1 系统架构概述

  本系统架构采用基于Flask框架的B/S架构模式,旨在实现基于知识图谱的智能问答系统。系统前端与用户交互,负责问题输入和结果显示;后端则负责接收用户输入并进行问题分类、解析、知识图谱查询和大模型调用。后端系统与Neo4j图数据库进行交互,以检索知识图谱中的实体和关系,同时集成文心一言大模型,作为知识图谱未能检索到答案时的备选方案。最后将该系统部署在服务器上,为用户提供了更加高效的智能问答服务。简略系统架构如图1-1所示。

图1-1 简略系统架构图

系统整体设计注重扩展性、模块化和性能优化,通过合理的模块划分,使得系统在功能扩展和维护时更加灵活。同时,系统针对高并发场景和大规模数据查询进行了相应的性能优化。详细系统架构如图1-2所示。

图1-2 详细系统架构图

1.1.2 前端架构设计

前端部分主要采用HTML、CSS、JavaScript技术栈进行开发,提供用户友好的界面,支持用户与智能问答系统的交互。前端架构图如图1-3所示。

图1-3 前端架构图

前端主要实现以下功能:

登录/注册功能: 实现用户身份验证,支持用户创建新账户或登录已有账户。通过安全的身份认证机制确保用户数据的隐私和安全性,登录后可以保存用户的查询历史和偏好设置。

用户输入界面: 包含问题输入框和发送按钮,用户通过该界面输入自然语言问题。

结果显示: 问题答案以文本的形式显示在页面上,用户可以即时获取反馈。

知识图谱可视化展示: 使用JavaScript库(Echarts)实现知识图谱的动态可视化,展示查询到的实体和关系。

导航栏: 提供两个主要功能的切换,分别为“问答机器人”和“知识图谱”视图。

为了优化用户体验,前端还采用了异步加载技术,避免页面刷新时重新加载图谱数据,从而提升系统的响应速度。同时,登录注册功能确保了系统的个性化服务。

1.1.3 后端架构设计

后端由Flask框架构建,负责处理来自前端的请求,解析用户问题,并将查询结果返回给前端。后端架构图如图1-4所示。

1-4 后端架构图

后端模块分为以下主要部分:

API接口: 提供标准化的RESTful接口,与前端进行数据交互,支持用户问题的提交和答案的返回。

问题分类与解析模块: 接收到用户问题后,首先对问题进行分类(如实体查询、关系查询等),然后解析问题中的核心实体和意图,生成相应的查询语句。

知识图谱查询模块: 使用AnswerSearcher类与Neo4j数据库交互,根据解析后的查询语句,从知识图谱中检索相关实体或关系,并将结果返回给前端。

大模型调用模块: 当知识图谱中没有找到相应答案时,系统调用文心一言大模型,生成相关的答案。

后端架构注重模块化,确保各功能模块之间解耦,便于扩展和维护。同时,通过缓存策略和数据库连接池优化查询性能,降低响应时间。

1.1.4 知识图谱模块设计

知识图谱是智能问答系统的核心数据支撑部分,存储了与目标领域相关的实体及其关系。系统使用Neo4j图数据库来存储知识图谱,图数据库具有天然的实体关系存储和查询优势,能够高效处理复杂的关系网络。

数据存储: 知识图谱的数据以节点(实体)和边(关系)的形式存储,节点可以表示人、物体、事件等实体,边则表示实体之间的关联关系。

AnswerSearcher类设计: 该类负责与Neo4j图数据库的交互,通过生成Cypher查询语句,将解析后的用户问题转化为对知识图谱的查询操作。AnswerSearcher类还包含对查询结果的处理逻辑,将图数据库返回的节点和关系数据格式化为用户可理解的文本答案。

查询优化: 通过对常用查询语句进行优化和索引机制,提升查询效率,确保在大规模数据集上依然能够快速响应。

1.1.5 算法模块设计

算法模块是整个智能问答系统的核心逻辑部分,负责对用户输入的问题进行理解和处理。该模块包括三个子模块:

问题分类器: 负责对用户输入的问题进行分类,判断问题的类型(如实体查询、关系查询、列表查询等)。分类器使用预训练模型或者规则匹配的方式,将问题划分为不同的处理类型。

问题解析器: 对分类后的问题进行进一步解析,提取问题中的实体、关系和意图信息。解析器使用自然语言处理(NLP)技术,将自然语言问题转化为可操作的查询语言。

答案搜索器: 根据问题解析器提供的查询语句,调用知识图谱查询模块,获取相关的实体或关系,并将结果转化为用户可以理解的答案。如果知识图谱中没有匹配的答案,则调用大模型生成答案。

该模块的设计保证了系统能够高效、准确地理解用户输入,并生成合理的查询请求或答案。

1.1.6 大模型集成设计

为了提高系统的鲁棒性和回答能力,当知识图谱中没有查询到对应答案时,系统将回退到大模型(文心一言)进行答案生成:

调用逻辑: 系统通过API调用文心一言大模型,输入用户的问题,由模型生成答案。该模块的调用逻辑被设计为知识图谱查询后的备选方案,仅在知识图谱返回为空时启动。

回退机制: 当用户的问题不属于知识图谱中的实体或关系时(如某些主观性问题或超出知识图谱领域的问题),回退机制会自动触发大模型调用,生成更灵活、更自然的回答。

通过集成大模型,系统具备了更强的应答能力,不再局限于结构化数据,提升了智能问答系统的全面性。

1.1.7 系统架构优势

模块化设计: 各模块功能明确,独立性强,便于后期功能扩展和系统维护。

扩展性强: 知识图谱和大模型的结合使得系统不仅能处理结构化数据,还能处理非结构化问题,增强了系统的回答范围。

高效查询: 通过优化图数据库的查询效率,结合缓存和索引机制,确保大规模数据集下的高效性能。

灵活应答: 大模型的集成保证了在知识图谱未能匹配答案时,系统依然能够提供高质量的答案,提高了用户体验。

该系统架构设计充分考虑了性能、扩展性和易维护性,为基于知识图谱的智能问答系统的稳定、高效运行提供了有力支撑。

1.1.8 云服务器部署设计

该系统最终部署在云服务器上,利用云端的计算和存储资源,以实现高效的服务响应和良好的用户体验。云服务器部署设计图如图1-5所示。

图1-5 云服务器部署设计图

具体的部署流程如下:

服务器配置: 选择高性能云服务器,安装所需的开发环境和依赖,包括Python、Flask框架、Neo4j数据库以及其他必要组件。

负载均衡: 针对大规模用户访问,部署了负载均衡机制,确保系统在高并发情况下依然保持稳定的性能。

云服务器的部署提升了系统的可用性、扩展性和稳定性,为用户提供了更加高效的智能问答服务。

1.2 前端设计

前端设计是用户与系统直接交互的重要组成部分,涉及用户的登录注册、问答机器人功能以及知识图谱的可视化展示。该部分采用了HTML、CSS、JavaScript技术栈,并通过Flask框架与后端实现数据交互,确保了系统的安全性、用户体验及互动性。以下是前端设计的详细阐述。

1.2.1 用户登录功能

用户登录功能提升了系统的安全性,并为用户提供了个性化体验。通过登录注册功能,用户可以创建和管理账户,个性化配置系统功能,并保存查询历史等信息,增强了系统的用户友好性。

用户注册的原型图如图1-6所示。

图1-6 用户注册的原型图

用户输入信息: 用户在注册页面输入用户名、密码、邮箱等基本信息。

Flask接收表单数据: 前端表单通过POST请求将用户输入的数据发送至后端,后端通过Flask处理表单。

合法性验证: 在后端,系统对用户输入的数据进行合法性验证。例如,检查密码长度是否符合要求,用户名是否已经存在于数据库中等。

信息存储: 使用MySQL数据库存储用户注册信息。后端使用SQL语句将经过验证的用户信息写入数据库,并确保信息安全。

用户登录的原型图如图1-7所示。

图1-7 用户登录的原型图

用户输入验证信息: 用户在登录页面输入用户名和密码。

Flask处理登录请求: 前端通过POST请求将登录信息发送至后端,Flask接收并处理这些数据。

验证登录信息: 后端通过SQL查询验证用户输入的用户名和密码是否与数据库中的信息匹配。如果验证通过,系统将用户信息保存在session中,标记用户已登录。

个性化服务: 用户登录后,可以访问个人账户管理功能,查看历史查询记录,修改个人信息,或配置个性化设置,提升了交互性和用户体验。

通过登录注册模块,系统确保了用户数据的安全性,并通过会话管理实现了用户登录状态的持久性,提升了用户对系统的信任感与满意度。

1.2.2 问答机器人

问答机器人是系统的核心功能之一,前端通过输入框和结果展示区实现人机对话。系统不仅依赖知识图谱进行答案检索,还引入了文心一言大模型作为补充,在知识图谱中无法找到答案时为用户提供智能回复。

Flask路由: 定义一个POST请求的Flask路由,接收用户问题。系统通过ChatBotGraph类执行分类、解析、搜索和调用文心一言大模型。返回的答案通过Flask传递给前端。

前端交互逻辑: 前端通过JavaScript的askQuestion()函数获取用户输入,并通过AJAX向Flask路由发送POST请求,提交问题。系统返回的答案(无论是知识图谱检索的结果,还是文心一言生成的答案)都会在对话框中展示。

问答系统前端页面可视化如图1-8所示。

图1-8 问答系统前端可视化

输入框和发送按钮: 用户通过输入框输入问题并点击发送按钮,或通过快捷键提交问题,交互流畅。

结果展示: 系统处理问题后,在页面上显示答案。若知识图谱检索无果,则会显示由文心一言模型生成的智能回答,保证用户始终能获得反馈。

系统不仅利用知识图谱回答结构化问题,还借助大模型提升了处理复杂问题或推理问题的能力,实现了更为全面的智能问答体验。

1.2.3 知识图谱可视化

知识图谱可视化模块为用户提供了直观的图形界面,用户可以通过图形化的方式浏览系统中的实体和关系,了解信息的结构和关联。该功能主要使用Echarts库实现力导向图(Force-Directed Graph)布局。

前端知识图谱可视化如图1-9所示:

图1-9 知识图谱的可视化

力导向图布局: 使用force布局模拟节点间的吸引力和排斥力,确保图谱节点的自然分布。节点之间的边表示实体间的关系,节点之间根据连接强度保持合理的距离和排布,避免图谱过于拥挤。

图例(Legend): 显示不同类型节点的分类及颜色标识,帮助用户快速区分不同类别的实体。

提示框(Tooltip): 鼠标悬停在节点或边上时,显示该节点或边的详细信息。例如,悬停在节点上时可以显示该实体的名称、属性等信息,悬停在边上时可以显示关系类型。

边符号(EdgeSymbol): 自定义边的符号样式,使得不同关系之间更加直观,例如可以使用箭头来表示方向性关系。

样式配置: 使用ItemStyle、Label和Link等配置项自定义图谱的视觉效果,优化节点、边和标签的展示效果,提升图谱的可读性和美观度。

知识图谱可视化展示不仅提升了用户对系统内部结构和数据的理解,还增强了系统的交互性和可操作性,为用户提供了直观的知识探索体验。

1.3 后端设计

后端设计是智能问答系统的核心,负责处理用户请求、管理数据、构建知识图谱、调用问答逻辑及与大模型(文心一言)的交互。后端使用了Flask框架来提供API接口服务,结合数据库和知识图谱进行数据存储与查询,同时调用智能问答相关算法和大模型为用户提供答案。

1.3.1 API接口设计

API接口设计是后端与前端交互的桥梁,通过HTTP请求接收前端发送的问题,并返回相应的答案。后端采用了RESTful风格的API接口,主要实现以下功能:

用户登录/注册接口:用于处理用户登录和注册请求。前端通过POST请求提交用户信息(如用户名、密码),后端验证并在MySQL数据库中存储或检索信息。

登录接口会验证用户名和密码的正确性,并将登录成功的用户信息保存在session中,实现会话管理。

注册接口通过验证用户输入信息的合法性(如用户名是否重复)后,将新用户信息存储到MySQL数据库。

问答接口:接收用户输入的问题,执行问题分类、解析、检索等操作,并返回答案。

Flask接收POST请求,解析用户问题并调用后端的ChatBotGraph类进行问题处理。处理流程包括问题分类、解析以及调用知识图谱或文心一言大模型获取答案,最后将答案返回给前端。

知识图谱查询接口:负责将用户的自然语言问题转化为与知识图谱的查询请求,并返回图谱节点及其关系。

通过SQL或Cypher查询语句与Neo4j数据库交互,检索出相关实体和关系。

生成的查询结果在后端通过适当的格式化后返回给前端,用于可视化展示。

接口设计细节:

安全性:在API接口中,使用JWT(JSON Web Token)等技术对用户的身份进行认证,确保数据交互的安全性。

错误处理:为所有接口设计了错误处理机制,当接口处理失败时,系统会返回明确的错误信息,并引导用户解决问题。

1.3.2 知识图谱构建

(1)数据获取与处理

网站分析与链接爬取首先,针对目标网站寻医问药网(http://jib.xywy.com/)进行结构化分析,识别页面中的关键信息。例如,以“高血压”为例,分析页面结构并提取疾病简介、病因、预防、症状、检查、治疗、并发症、饮食保健等字段。通过这样的分析,我们能够确定每个疾病页面的基本结构,从而为后续数据爬取提供可靠的依据。网站如图1-10所示。

图1-10 寻医问药网站

网络爬虫设计该爬虫程序通过与MongoDB数据库交互,将抓取的数据进行持久化存储,爬虫通过请求页面HTML内容,使用BeautifulSoup解析出所需的疾病相关数据。具体数据字段包括疾病的各种属性,如症状、治疗方式等。数据库如图1-11所示。

图1-11 MongoDB数据库

数据存储为了存储爬取的数据,创建了一个空的字典data = {},用来存储每次爬取的数据,并根据字段(如疾病名称、症状、治疗方式等)作为键值对,将结构化数据存储在MongoDB中。这些数据随后将用于知识图谱的构建。

2)构建数据库

实体、关系与属性定义在构建知识图谱时,首先定义了相关的实体、关系和属性,确保数据的组织符合医学领域的实际需求。

实体属性:包括疾病、诊断检查项目、医疗科室、药品、食物、疾病症状等医学相关实体。

关系类别:定义实体之间的关系类别,例如:疾病与症状的关系、疾病与药品的关系、疾病与科室的治疗关系、疾病与饮食相关的关系

属性类型:为每个实体定义了多个属性,如:疾病名称、疾病简介、疾病病因、预防措施、治疗方式、治愈周期、治愈概率等

数据读取:为了将收集到的数据结构化处理,使用Python编写脚本读取JSON格式数据集。读取后,将数据转换为Python字典对象,解析每个疾病的详细信息(如疾病名称、症状、治疗方式等)。随后,数据会按类别存储在对应的列表或字典中,以便在构建知识图谱时使用。

数据分类:将疾病的基本属性存储在一个疾病字典中。将疾病与其他实体(如症状、药物)的关系提取出来,构建不同类别的关系列表。

3)创建知识图谱节点和关系

读取数据文件逐行读取已经处理好的JSON数据文件,提取疾病的各项属性。根据字段内容,将属性分为三类:

疾病属性:如疾病的名称、病因、症状等,存储在disease_dict字典中。

关系信息:如果该字段表示疾病与其他实体的关系(如疾病与药物),则将关系存储到相应的关系表中。

其他实体:对于非疾病的实体(如药品、检查项目等),将其存储在特定的实体列表中,待后续创建实体节点时使用。

创建知识图谱实体节点在构建知识图谱时,创建不同类型的实体节点和关系节点。

疾病实体节点:这是知识图谱中的中心节点,包含每个疾病的详细属性信息。属性包括疾病名称、病因、症状、治疗方式等。

普通实体节点:这些节点包括药品、食物等,与疾病有直接关系,但不包含详细属性,只需保存实体名称。

使用Neo4j图数据库存储知识图谱。在Neo4j中,节点使用标签区分实体类型(如疾病、药品等),边用于表示实体之间的关系。通过编写Cypher查询语言的脚本,逐步将实体和关系导入Neo4j,形成结构化的图数据。Neo4j数据库中的知识图谱如图1-12所示。

图1-12 Neo4j数据库

知识图谱为系统提供了结构化的医学数据支持,使得系统能够快速查询和分析疾病相关信息,并进行高效的医学知识推理。

1.3.3 问答机器人

问答机器人模块负责处理用户的自然语言问题,并通过知识图谱或大模型(文心一言)提供智能答案。该模块是系统的核心功能之一,涉及复杂的算法和大规模数据的检索与计算。

实现流程图如图1-13所示。

图1-13 问答系统实现流程图

ChatBotGraph类:该类是问答机器人模块的核心,负责问题的分类、解析、查询以及与知识图谱和大模型的交互。

classifier(问题分类器):接收用户输入的自然语言问题并进行分类。例如,识别出是关于某个实体的询问、时间问题、还是关系查询问题。分类的准确性直接影响后续步骤的处理。

parser(问题解析器):将分类后的问题解析为可供知识图谱查询或调用大模型的结构化查询语句。例如,“某公司推出了哪些产品?”可以解析为Cypher查询。

searcher(答案检索器):执行解析后的查询语句,与知识图谱数据库交互,检索出符合条件的实体和关系。如果知识图谱中没有找到对应的答案,系统会调用文心一言大模型进行智能生成。

chat_main方法: 该方法是问答机器人的主要入口,接收用户输入的问题。问题会先经过分类、解析和知识图谱查询,如果查询结果为空,则调用文心一言模型生成答案,并返回给用户。如果模型无法生成有效答案,系统会返回错误提示或引导用户重新提问。

文心一言大模型集成:当知识图谱无法提供答案时,系统通过API接口调用文心一言大模型,生成符合上下文的答案。文心一言是一个预训练的语言模型,擅长回答复杂的推理问题或未知领域的开放性问题。大模型的回答生成基于输入的上下文及问题,模型会综合考虑上下文和已知信息,生成合乎逻辑的自然语言答案。系统将大模型生成的答案返回给用户。

系统实现了对自然语言问题的精准回答,结合知识图谱和大模型的双重保障,提升了系统在复杂问题场景下的应答能力。

1.4 算法设计

该智能问答系统核心算法涉及三个主要模块:问题分类器、问题解析器以及答案搜索器。每个模块都有其独特的功能,确保从用户输入的问题到最终答案的生成过程顺畅且高效。下面详细阐述各个模块的设计与实现。

1.4.1 问题分类器设计

问题分类器的主要任务是根据用户的输入,将其归类为不同的问题类型。通过分类,系统能够理解用户的查询是关于疾病的哪一类问题,如疾病症状、预防措施、治疗方法等。问题分类器设计图如图1-14所示。

图1-14 问题分类器设计流程图

分类器的设计遵循以下步骤:

数据预处理在分类器的构建过程中,首先需要准备特征词文件,其中包含不同类别的问题关键词,例如与疾病相关的词汇(如“感冒”、“糖尿病”)以及疑问词(如“症状”、“预防”)。系统通过读取这些特征词文件,将不同类别的特征词存储在多个列表中,作为后续问题分类的基础。

AC自动机的构建分类器利用Aho-Corasick(AC)自动机进行多模式匹配。AC自动机可以将大量的特征词构建为一棵特征词树,以便在用户输入的问题中快速定位特征词。构建的AC树通过将所有特征词加入到特征词字典中,并将每个词与其对应的类别一一对应(如“感冒”对应“疾病”)。通过AC自动机,系统能够迅速识别出用户问题中包含的特征词。

问题类型识别在分类阶段,系统对用户的输入进行特征词过滤。用户的问题通过AC自动机进行扫描,系统会输出与输入匹配的特征词及其对应类别。接下来,系统还会依据疑问词列表(如“症状”、“预防”等)来确定问题的具体类型。例如,对于问题“如何预防感冒?”,系统会识别出“感冒”是疾病实体,“预防”属于预防类疑问词,因此将问题归类为“疾病预防”类型。

分类器输出分类器最终会输出一个包含问题类型及相关实体的数据结构,如:

{

    "args": {"感冒": ["disease"]},

    "question_type": ["disease_prevent"]

}

此结构将传递给问题解析器进行进一步处理。

1.4.2 问题解析器设计

问题解析器的作用是将问题分类器的输出进行进一步处理,解析问题中的实体及其关系,并生成相应的查询语句。解析器通过关键词匹配和规则推理,能够将自然语言问题转换为计算机能够理解的结构化查询语言。问题解析器设计图如图1-15所示。

图1-15 问题解析器设计流程图

实体字典构建在解析过程中,解析器首先通过build_entitydict函数,将问题分类器输出的实体类型与实体名进行重新组织,生成按实体类型划分的字典。例如,输入“感冒”对应的字典格式为:

{

    "disease": ["感冒"]

}

这一字典结构有助于解析器根据实体类型进行后续的处理。

解析主函数解析器的核心功能由parser_main函数实现。该函数根据分类器的输出数据,识别问题的类型和实体,并调用不同的解析规则。解析器会依据不同的实体和疑问词构造相应的Cypher查询语句,用以检索知识图谱中的相关信息。例如,对于“感冒”+“预防”这一组合,系统将生成查询语句以查找有关感冒的预防信息。

SQL查询构建解析器利用sql_transfer函数生成Cypher查询语句。该函数根据问题类型和涉及的实体构造出相应的查询语句。例如,针对“如何预防感冒”这一问题,系统可能生成如下Cypher查询:

MATCH (m:Disease) WHERE m.name="感冒" RETURN m.name, m.prevent

这个查询语句将从图数据库中检索“感冒”的预防措施。解析器的灵活性体现在能够根据不同的问题类型(如症状查询、药品查询等)生成不同的查询语句。

查询类型的解析解析器通过遍历所有可能的查询类型,并根据问题分类器提供的结果来判断具体的查询需求。不同类型的查询会调用不同的解析逻辑,以确保生成的查询语句准确无误。

1.4.3 答案搜索器设计

答案搜索器负责执行由问题解析器生成的查询语句,访问图数据库并返回查询结果。答案搜索器不仅仅进行数据库查询,还需要将查询结果进行格式化处理,并根据查询类型返回合适的答案。答案搜索器设计图如图1-16所示。

图1-16 答案搜索器设计流程图

与图数据库连接在初始化阶段,答案搜索器通过py2neo库连接到Neo4j图数据库。系统确保连接的稳定性,并设定字符长度等限制参数,以规范生成答案的格式。

查询执行search_main函数是答案搜索的核心。该函数接收一个由Cypher查询语句组成的列表,并逐个执行这些查询。对于每个查询,系统会调用Neo4j的run方法,执行Cypher语句并获取结果。查询结果被存储在answers列表中,系统会根据查询的内容进行排序和筛选。

答案模板化为了提升用户体验,答案搜索器会对查询结果进行模板化处理。answer_prettify函数根据查询类型选择适合的答案模板,并将查询结果填充至模板中。例如,如果查询的是疾病的症状,系统会从数据库中提取出症状名称,并将其插入预定义的答案模板中。

例如,针对问题“感冒的症状有哪些?”,模板化处理可能生成如下答案:

“感冒的主要症状包括:发热、咳嗽、咽喉痛。”模板化处理确保了答案的结构化和可读性,用户可以迅速获取到关键信息。

返回结果最终,答案搜索器会将所有查询结果返回给用户。若找不到合适的答案,系统将返回一个默认的初始答案,如“很抱歉,暂时无法找到相关信息,请您稍后再试。”。这一模块设计保证了无论用户输入什么问题,系统都能够提供一个合适的反馈,提升用户体验。

1.5 系统部署设计

1.5.1 系统部署环境与技术栈

在本系统的部署过程中,选择了阿里云的云服务器作为基础架构,以确保系统的高可用性和可扩展性。系统的技术栈主要包括以下几个部分:

操作系统: 选择基于 Linux 的 CentOS 7 作为操作系统,以支持稳定的运行环境。

Web 服务器: 使用 Nginx 作为反向代理服务器,提供高效的静态资源服务,并处理客户端请求的路由。

后端框架: 采用 Flask 框架进行后端开发,提供 API 接口并处理前端请求。

数据库: 选择 MongoDB 和 Neo4j 作为数据库系统,分别用于存储爬取的数据和知识图谱信息。

前端技术: 前端部分使用 HTML、CSS 和 JavaScript 技术栈进行开发,确保用户界面的友好性与交互性。

其他工具: 使用宝塔面板(BT Panel)进行服务器的管理与配置,简化了系统的安装、配置和维护过程。

1.5.2 云服务器配置与部署流程

云服务器配置与部署流程图如图1-17所示。

图1-17 云服务器配置与部署流程图

云服务器实例创建登录阿里云管理控制台,选择“云服务器 ECS”并创建新的实例。

选择合适的配置如 CPU、内存、存储等,本系统选用的是2核2G的服务器,存储40G。

选择操作系统在创建实例时选择 CentOS 7 操作系统,并通过Workbench远程连接。

安装宝塔面板:使用 SSH 连接到云服务器。执行以下命令安装宝塔面板:wget -O install.sh http://download.bt.cn/install/install.sh根据提示完成宝塔面板的安装,并记下管理地址、用户名和密码。

配置 Nginx 和 SSL登录宝塔面板,选择“软件商店”安装 Nginx。在“网站”管理界面添加新的站点,配置域名和根目录。

部署 Flask 应用:在宝塔面板的“文件”管理器中上传 Flask 应用的代码文件。在“网站”界面中,设置 Flask 的运行参数,指定 Python 环境和启动文件。

数据库配置:安装并配置 Neo4j 数据库。创建所需的数据库和表结构,并导入初始数据。

测试与监控:启动 Flask 应用,访问配置的域名进行测试,确保系统正常运行。

使用宝塔面板的监控工具,实时监测服务器的性能指标,如 CPU、内存和带宽使用情况。

通过以上步骤,系统成功部署在阿里云的服务器上,能够高效稳定地为用户提供智能问答服务。

1.6源代码

下面所示代码为App.py中的全部代码:

# 导入Flask 模板
from flask import redirect, jsonify
# 导入要用到的数据库 第三方库
from flask_sqlalchemy import SQLAlchemy
from question_classifier import *
from question_parser import *
from answer_search import *
from flask import Flask, render_template, request
import json
app = Flask(__name__)  # 创建一个 Flask 应用程序实例
from flask import Flask, render_template
# 在这里获取data和links数据
from neo4j import GraphDatabase

# Neo4j数据库连接参数

uri = "neo4j://localhost:7687"
username = "neo4j"
password = "neo4j"

# 生成并保存知识图谱数据和 HTML 页面

# 定义登录页面的路由
@app.route('/login', methods=["GET", "POST"])
def login():
    error = None
    if request.method == 'POST':
        # 从网页获取表单输入数据
        id = request.form.get('user_name')
        pwd = request.form.get('user_passwd')

        # 从数据库中查询用户信息
        a = User.query.filter_by(id=int(id)).first()

        try:
            # 检查密码是否匹配以及用户ID是否匹配
            if a.name == pwd and int(id) == a.id:
                return render_template('index.html')
        except:
            error = "密码错误"  # 设置密码错误提示信息

    return render_template('logi.html', error=error)  # 将错误信息传递给模板
# 连接数据库的配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:neo4j@localhost:3306/information?charset=utf8mb4'
db = SQLAlchemy(app)


# 创建好用户信息的表格的信息
class User(db.Model):
    __tablename__ = "information_user"
    id = db.Column(db.Integer, primary_key=True, comment="用户id")
    name = db.Column(db.String(20), nullable=False, comment="用户姓名")


# 执行所有的创建表格的语句
with app.app_context():
    db.create_all()



# 定义注册页面的路由
@app.route('/res', methods=["GET", "POST"])
def res():
    if request.method == 'POST':
        error1 = None
        id = request.form.get('user_name')
        passwd = request.form.get('user_passwd')
        pwd_q = request.form.get('user_passwd_to')

        # 从数据库中查询用户信息
        a = User.query.filter_by(id=id).first()
        b = User.query.filter_by(id=id).all()
        print(a)

        if pwd_q != passwd:
            return '密码不一致!请返回重新输入!'

        # 如果用户不存在,则将用户信息添加到数据库中
        if a is None:
            user = User(id=int(id), name=passwd)
            db.session.add(user)
            db.session.commit()
            return redirect('login')

        # 如果用户存在,则返回"已存在该用户"
        if int(id) == a.id:
            error1 = "已存在该用户"
            return render_template('res.html', error=error1)

    return render_template('res.html')


@app.route('/')
def index():
    return redirect('/login')


import requests
import json
from flask import Flask, request, jsonify

API_KEY = "pNc5RNDHTD8JUect6vHwzUeo"
SECRET_KEY = "bEt79N0oRAlyX6fH7JVThfBuPr7Z0HCK"


class LargeModel:
    def query_large_model(self, question):
        access_token = self.get_access_token()
        url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=" + access_token
        payload = json.dumps({"messages": [{"role": "user", "content": question}]})
        headers = {'Content-Type': 'application/json'}
        res = requests.post(url, headers=headers, data=payload).json()
        return res['result']

    def get_access_token(self):
        url = "https://aip.baidubce.com/oauth/2.0/token"
        params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
        return requests.post(url, params=params).json().get("access_token")


class ChatBotGraph:
    def __init__(self):
        self.classifier = QuestionClassifier()
        self.parser = QuestionPaser()
        self.knowledge_searcher = AnswerSearcher()
        self.large_model = LargeModel()

    def chat_main(self, sent):
        answer = '非常抱歉,没能理解您的问题,我的词汇量有限,请输入更加标准的词语'

        res_classify = self.classifier.classify(sent)

        if not res_classify:
            large_model_answer = self.large_model.query_large_model(sent)
            return large_model_answer
        res_sql = self.parser.parser_main(res_classify)
        final_answers = self.knowledge_searcher.search_main(res_sql)
        if not final_answers:
            return answer
        else:
            return '\n'.join(final_answers)



chatbot = ChatBotGraph()


@app.route('/ask', methods=['POST'])
def ask_question():
    question = request.json.get('question')
    if question:
        answer = chatbot.chat_main(question)
        return jsonify({'answer': answer})
    else:
        return jsonify({'error': 'No question provided'})


if __name__ == '__main__':
    app.run(debug=True)

1.7系统部署

我已经使用阿里云的服务器将该项目部署在上面,链接如下:

114.55.55.24:5000,有效期为一年,登录注册功能可能有些bug,登录之后需要构建知识图谱,所以需要花费一些时间,请耐心等待。

标签:答案,图谱,知识,系统,用户,查询,毕业设计,源代码,问答
From: https://blog.csdn.net/pta6666/article/details/142436240

相关文章

  • python+flask计算机毕业设计家庭财务管理系统APPy(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今社会,随着家庭经济活动的日益复杂和多元化,个人及家庭对于财务管理的需求日益增长。传统的手工记账方式已难以满足现代家庭对财务透明......
  • python+flask计算机毕业设计基于物联网技术的水质实时监测系统设计与实现(程序+开题+论
    文件加密系统的设计与实现tp835本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着工业化进程的加速和人口的不断增长,水资源的保护与监测日益成为全球关注的重大课题。水质污染问题不仅......
  • python+flask计算机毕业设计快递代取小程序(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今社会,随着电子商务的蓬勃发展,快递业务量急剧增长,成为了人们日常生活中不可或缺的一部分。然而,随之而来的“取件难”问题也日益凸显,尤......
  • python+flask计算机毕业设计+Vue的残疾人再就业系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会经济的快速发展与人口老龄化的加剧,残疾人群体作为社会的重要组成部分,其就业问题日益凸显。传统就业市场往往因信息不对称、技能不......
  • python+flask计算机毕业设计+vue的服装售后服务系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展,服装行业作为其中的重要组成部分,其售后服务质量已成为影响消费者购买决策的关键因素之一。传统的服装售后服务模式......
  • python+flask计算机毕业设计教师工作量统计系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在高等教育快速发展的今天,教师作为教育的核心力量,其工作量的准确统计与评估成为了高校管理中不可或缺的一环。传统的教师工作量统计方式往......
  • python+flask计算机毕业设计基于微信小程序的垃圾分类系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加快和居民生活水平的提高,垃圾产生量急剧增加,垃圾分类成为解决城市垃圾处理难题、促进资源循环利用的关键举措。然而,传统......
  • python+flask计算机毕业设计体检预约小程序(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着健康意识的不断提升和医疗技术的快速发展,人们对健康管理的需求日益增长。传统的体检预约方式往往存在流程繁琐、信息不对称、预约效率......
  • python+flask计算机毕业设计基于物联网技术的水质实时监测系统设计与实现(程序+开题+论
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着工业化进程的加速和人口的不断增长,水资源的污染问题日益严峻,成为制约经济社会可持续发展的重大瓶颈。传统的水质监测方法存在时效性差......
  • python+flask计算机毕业设计数据库加密系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,数据已成为企业和个人最宝贵的资产之一。然而,数据泄露和非法访问的风险也随之急剧增加,给个人隐私、企业安全乃至国......