智能问答系统

目录

一、项目背景和目的

1.1智能问答系统介绍:

1.2项目背景:

1.3项目目的:

二、数据来源

三、智能问答系统代码实现

3.1 代码实现准备

3.1.1项目目录结构展示

3.1.2所要用的库

3.2后端代码

3.3前端代码

3.3.1主页面上方界面代码解释

3.3.2底部界面代码解释

3.3.3主页面四大模块代码解释

四、页面展示和总结


一、项目背景和目的

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代码

  1. 问答系统:通过load_qa_pairs函数从文件中加载问题答案对,并通过qa路由提供API接口,接受GET请求,参数为问题,返回答案的JSON格式数据。

  2. 天气查询:通过weather_query路由提供API接口,接受GET请求,参数为城市名,使用OpenWeather API查询天气信息,并返回包含天气描述、温度、湿度和风速的JSON格式数据。

  3. 计算器:通过calculate路由提供一个简单的计算器功能,接受GET和POST请求。GET请求返回一个表单页面,用户输入数字和操作符后提交POST请求,服务器计算结果并返回到同一个页面显示。

  4. 静态页面:应用还提供了几个静态页面,包括问答页面、天气页面、首页和疑难解答页面,分别通过qa_pageweather_pagehomefqa路由访问。这些页面使用了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)

四、页面展示和总结

页面展示:

计算功能页面:

天气查询页面:

问答系统页面:

疑问解答页面:

总结:问答系统项目开发涉及到多个技术领域和步骤,从数据收集和预处理到模型选择和系统集成,都需要综合考虑技术选型和功能需求。在开发过程中,持续的测试和优化是确保系统稳定性和用户满意度的关键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值