目录
一、项目背景和目的
1.1智能问答系统介绍:
智能问答系统(QA)是信息检索系统的一种高级形式,用准确简洁的自然语言回答用户所提出的问题,是NLP领域一个备受关注并具有广泛发展前景的方向。
智能问答系统主要由问题理解、知识检索、答案生成3个部分组成,其中问题理解包括问题分类、关键词提取、知识检索包括结构化与非结构化的信息检索,答案生成包括答案提取和答案验证,核心问题就是处理好对问题的理解以及问题与答案之间的匹配程度。
1.2项目背景:
在数字化时代,信息的快速传播与获取成为提升效率、促进学习与交流的关键因素。人们在学习过程中常遇到各种疑问,而资源有限,难以即时响应所有学生的个性化问题。传统的问答方式,如面对面咨询、邮件沟通等,往往效率低下,不能满足即时性和广泛性的需求。此外,信息分散在不同渠道,缺乏统一管理和有效分类,导致资源浪费和重复劳动。
1.3项目目的:
1.提高效率与便捷性:通过建立统一的线上平台,随时随地提出问题,可以灵活作答,不受时间和地点限制,显著提升问答的效率和便捷性。 2.资源整合与管理:集中管理问题与答案资源,形成知识库,便于信息的检索、分类和存储,减少信息冗余,提高知识利用价值。3.个性化学习支持:通过智能匹配和推荐机制,提供更多个性化的资源和解答。
问答系统示例视频:
5分钟做一个Ai智能问答系统,直接省下200万。老板乐开花 | feat. MaxKB 项目演示与体验
二、数据来源
问答数据来源自行编写还有百度爬取,实时天气数据来源OpenWeather 。
问答数据集:
openweather网站:
三、智能问答系统代码实现
3.1 代码实现准备
3.1.1项目目录结构展示
文件名称/
├── satatic
| ├── css
| └── js
| └──images
|
└── templates/
| ├── chat.html
| └── calculation.html
| ├── weather.html
| └── qa_page.html
| └── fqa.html
├── app.py
├── qa.txt
3.1.2所要用的库
pip install flask
3.2后端代码
app.py代码
-
问答系统:通过
load_qa_pairs
函数从文件中加载问题答案对,并通过qa
路由提供API接口,接受GET请求,参数为问题,返回答案的JSON格式数据。 -
天气查询:通过
weather_query
路由提供API接口,接受GET请求,参数为城市名,使用OpenWeather API查询天气信息,并返回包含天气描述、温度、湿度和风速的JSON格式数据。 -
计算器:通过
calculate
路由提供一个简单的计算器功能,接受GET和POST请求。GET请求返回一个表单页面,用户输入数字和操作符后提交POST请求,服务器计算结果并返回到同一个页面显示。 -
静态页面:应用还提供了几个静态页面,包括问答页面、天气页面、首页和疑难解答页面,分别通过
qa_page
、weather_page
、home
和fqa
路由访问。这些页面使用了Jinja2模板引擎进行渲染。
from flask import Flask, request, jsonify, render_template
import requests
import csv
app = Flask(__name__)
# 问答系统
def load_qa_pairs(filename):
qa_pairs = {}
with open(filename, mode='r', encoding='utf-8') as file:
reader = csv.reader(file, delimiter='|')
for row in reader:
if len(row) == 2:
question, answer = row
qa_pairs[question.strip()] = answer.strip()
return qa_pairs
# 加载问题答案对
qa_pairs = load_qa_pairs('qa.txt')
@app.route('/qa', methods=['GET'])
def qa():
question = request.args.get('question')
if not question:
return jsonify({"error": "缺少问题参数"}), 400
answer = qa_pairs.get(question, "对不起,我不知道答案。")
return jsonify({"answer": answer})
@app.route('/qa_page')
def qa_page():
return render_template('qa_page.html')
# 天气
@app.route('/weather')
def weather_page():
# 返回包含查询天气页面内容的模板
return render_template('weather.html')
#openweather api_key
api_key = '你的api_key'
@app.route('/')
def home():
return render_template('chat.html')
@app.route('/weather_query', methods=['GET'])
def weather_query():
city = request.args.get('city')
if not city:
return jsonify({'error': '城市名称不能为空'}), 400
url = f'http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric'
response = requests.get(url)
data = response.json()
if response.status_code != 200:
return jsonify({'error': '无法获取天气信息,请检查城市名称'}), response.status_code
weather_data = {
'description': data['weather'][0]['description'],
'temperature': data['main']['temp'],
'humidity': data['main']['humidity'],
'wind_speed': data['wind']['speed']
}
return jsonify(weather_data)
# 处理计算请求
@app.route('/calculate', methods=['GET'])
def index():
return render_template('calculate.html')
@app.route('/calculate', methods=['POST'])
def calculate():
try:
num1 = float(request.form['num1'])
num2 = float(request.form['num2'])
operation = request.form['operation']
if operation == 'add':
result = num1 + num2
elif operation == 'subtract':
result = num1 - num2
elif operation == 'multiply':
result = num1 * num2
elif operation == 'divide':
if num2 != 0:
result = num1 / num2
else:
result = 'Error: Division by zero'
else:
result = 'Invalid operation'
return render_template('calculate.html', result=result)
except ValueError:
return render_template('calculate.html', result='Invalid input')
#疑难解答
@app.route('/fqa')
def fqa():
return render_template('fqa.html')
if __name__ == '__main__':
app.run(debug=True)
3.3前端代码
3.3.1主页面上方界面代码解释
1.HTML结构:
<div class="speak_window"> 定义了一个容器,用于包裹整个“说话窗口”的内容。
<div class="speak_box"> 是“说话窗口”内部的盒子,进一步组织内容布局。
<div class="answer"> 用于呈现回答或信息的区域。
2.图标引用:
初始注释掉的代码尝试直接使用硬编码的路径来引用图片,而实际使用的代码<div class="icon left"><img src="{{ url_for('static',filename='images/ai.png') }}"></div>则是正确的Flask方式来动态引用静态文件。url_for('static', filename='...')是Flask提供的辅助函数,用于生成静态文件的URL,确保在不同环境和部署配置下都能正确找到资源。
3.3.2底部界面代码解释
1.输入提示与按钮:
<div id="subText"></div> 为空div,可能用于动态显示额外的文本信息,比如输入提示或错误信息。<a id="btn" οnclick="change()" style="color: blue;"></a> 是一个可点击的链接,默认颜色为蓝色,用于触发change()函数,可能是用来切换输入模式或显示更多功能(如表情面板切换)。
2.键盘图标链接:
同样采用了正确的Flask静态资源引用方式展示键盘图标,允许用户点击后跳转到指定页面("xx"为占位符,应替换为实际链接)。
3.聊天输入区域:
<input type="text" onKeyUp="key_up()" placeholder="说点什么吧~~~" /> 创建了一个文本输入框,用户可以在此输入消息。onKeyUp事件监听键盘按键抬起的动作,并调用key_up()函数,这通常用于实现实时监听用户输入或执行特定逻辑。
输入框的placeholder属性设定了默认提示信息:“说点什么吧~~~”。
4.发送消息按钮:
<button onClick="send_message()">发送</button> 提供了一个发送按钮,点击时调用send_message()函数,用于发送用户输入的消息。
5.JavaScript逻辑:
使用jQuery的$(document).keydown监听键盘事件,当按下回车键(keyCode为13)时,自动调用send_message()函数发送消息,模拟了聊天界面常见的回车发送消息功能。
$('.chat_box input').focus(); 确保页面加载后,光标自动聚焦在输入框中,提升用户体验。
3.3.3主页面四大模块代码解释
结构解释
1.图标列表(.icon-list)
2.文字和链接(.pecture-text)
四、页面展示和总结
页面展示:
计算功能页面:
天气查询页面:
问答系统页面:
疑问解答页面:
总结:问答系统项目开发涉及到多个技术领域和步骤,从数据收集和预处理到模型选择和系统集成,都需要综合考虑技术选型和功能需求。在开发过程中,持续的测试和优化是确保系统稳定性和用户满意度的关键。