首页 > 编程语言 >第11个项目:AI知识库系统Python源码

第11个项目:AI知识库系统Python源码

时间:2025-01-19 09:05:11浏览次数:3  
标签:11 lower para AI source 源码 import answer query

源码下载地址:https://download.csdn.net/download/mosquito_lover1/90285144

系统截图:

功能介绍:

支持本地化部署,支持上传pdf、word、txt等格式文件,支持对文件名和文件内容的检索。

核心源码:

from flask import Blueprint, render_template, redirect, url_for, flash, request, abort, send_file, jsonify

from flask_login import login_user, logout_user, login_required, current_user

from app.models import User, Article, Document, Question, QALog

from app import db

import os

from datetime import datetime, timedelta

from werkzeug.utils import secure_filename

from config import Config

from docx import Document as DocxDocument

from PyPDF2 import PdfReader

from pptx import Presentation

from openpyxl import load_workbook

import io

from sqlalchemy import or_, func

import requests

from bs4 import BeautifulSoup

import re

main = Blueprint('main', __name__)

def get_hot_questions(limit=3):

    """获取最近一周的热门问题"""

    one_week_ago = datetime.now() - timedelta(days=7)

   

    # 统计最近一周内的热门问题

    hot_questions = db.session.query(

        QALog.question,

        func.count(QALog.question).label('count')

    ).filter(

        QALog.created_at >= one_week_ago,

        QALog.source != '无匹配'  # 排除未找到答案的问题

    ).group_by(

        QALog.question

    ).order_by(

        func.count(QALog.question).desc()

    ).limit(limit).all()

   

    return hot_questions

def get_real_ip():

    """获取用户真实IP地址"""

    # 按优先级尝试不同的请求头

    headers_to_check = [

        'X-Forwarded-For',

        'X-Real-IP',

        'CF-Connecting-IP',  # Cloudflare

        'True-Client-IP'

    ]

   

    for header in headers_to_check:

        ip = request.headers.get(header)

        if ip:

            # X-Forwarded-For 可能包含多个 IP,取第一个

            return ip.split(',')[0].strip()

   

    # 如果没有代理头信息,则使用远程地址

    return request.remote_addr or '127.0.0.1'

@main.route('/', methods=['GET', 'POST'])

def index():

    answer = None

    query = None

    source = None

    source_id = None

   

    if request.method == 'POST':

        query = request.form.get('query', '').strip()

        if query:

            # 1. 首先尝试基础问答

            basic_answer = get_basic_answer(query)

            if basic_answer:

                answer = basic_answer

                source = "基础问答"

            else:

                # 2. 搜索预设问答

                questions = Question.query.all()

                for q in questions:

                    if query.lower() in q.question.lower():

                        answer = q.answer

                        source = "预设问答"

                        source_id = q.id

                        break

                    if q.keywords and any(k.strip().lower() in query.lower() for k in q.keywords.split(',')):

                        answer = q.answer

                        source = "预设问答"

                        source_id = q.id

                        break

               

                # 3. 如果没找到,搜索文章内容

                if not answer:

                    articles = Article.query.all()

                    for article in articles:

                        if query.lower() in article.content.lower():

                            paragraphs = article.content.split('\n')

                            for para in paragraphs:

                                if para.strip() and query.lower() in para.lower():

                                    answer = para.strip()

                                    source = "文章"

                                    source_id = article.id

                                    break

                            if answer:

                                break

               

                # 4. 如果还没找到,搜索文档内容

                if not answer:

                    documents = Document.query.all()

                    for doc in documents:

                        file_path = os.path.join(Config.UPLOAD_FOLDER, doc.filename)

                        if os.path.exists(file_path):

                            content = extract_text_from_file(file_path, doc.file_type.lower())

                            if content and query.lower() in content.lower():

                                paragraphs = content.split('\n')

                                for para in paragraphs:

                                    if para.strip() and query.lower() in para.lower():

                                        max_length = 500

                                        if len(para) > max_length:

                                            start = para.lower().find(query.lower())

                                            start = max(0, start - 100)

                                            end = min(len(para), start + max_length)

                                            para = '...' + para[start:end] + '...'

                                        answer = para.strip()

                                        source = "文档"

                                        source_id = doc.id

                                        break

                                if answer:

                                    break

           

            if not answer:

                answer = "抱歉,我没有找到相关的答案。"

                source = "无匹配"

           

            # 记录问答日志

            qa_log = QALog(

                question=query,

                answer=answer,

                source=source,

                source_id=source_id,

                ip_address=get_real_ip(),

                created_at=datetime.now()  # 使用当前时间

            )

            db.session.add(qa_log)

            db.session.commit()

    # 获取热门问题

    hot_questions = get_hot_questions()

   

    # 只有管理员才能看到文章列表

    articles = None

    if current_user.is_authenticated:

        articles = Article.query.order_by(Article.created_at.desc()).all()

   

    return render_template('index.html',

                         articles=articles,

                         answer=answer,

                         query=query,

                         hot_questions=hot_questions)

@main.route('/login', methods=['GET', 'POST'])

def login():

    if request.method == 'POST':

        username = request.form.get('username')

        password = request.form.get('password')

       

        if not username or not password:

            flash('请输入用户名和密码')

            return redirect(url_for('main.login'))

       

        user = User.query.filter_by(username=username).first()

        if user is None:

            flash('用户名不存在')

            return redirect(url_for('main.login'))

       

        if not user.check_password(password):

            flash('密码错误')

            retur

标签:11,lower,para,AI,source,源码,import,answer,query
From: https://blog.csdn.net/mosquito_lover1/article/details/145235321

相关文章

  • Chromium CDP 开发(十三):为自己的Domain建立CustomCDPHandler
    引言在开发ChromiumCDP(ChromeDevToolsProtocol)时,除了创建PDL和JSON文件来定义自定义的CDPDomain和指令外,还需要编写对应的Handler实现文件,以便使这些自定义指令能够被正确执行。本章将详细介绍如何为自定义的CDPDomain创建和实现Handler文件custom_cdp_ha......
  • 深入HDFS——数据上传源码
    引入就如RPC篇章里提到的观点一样,任何一种能广为传播的技术,都是通过抽象和封装的思想,屏蔽底层底层复杂实现,提供简单且强大的工具,来降低使用门槛的。HDFS的风靡自然也是如此。通过前面深入了NameNode和DataNode的启动源码,我们已经是略有体会,但重启毕竟属于工作时几乎遇不到的......
  • MESED: A Multi-modal Entity Set Expansion Dataset with Fine-grained Semantic Cla
    MESED:AMulti-modalEntitySetExpansionDatasetwithFine-grainedSemanticClassesandHardNegativeEntities译文论文题目:MESED:AMulti-modalEntitySetExpansionDatasetwithFine-grainedSemanticClassesandHardNegativeEntities论文链接:https://ar......
  • 【LLM】Openai-o1及o1类复现方法
    note可以从更为本质的方案出发,通过分析强化学习的方法,看看如何实现o1,但其中的核心就是在于,如何有效地初始化策略、设计奖励函数、实现高效的搜索算法以及利用强化学习进行学习和优化。文章目录note一、Imitate,Explore,andSelf-Improve:AReproductionReportonS......
  • springboot694大学生租房系统(论文+源码)_kaic
    摘要伴随着全球信息化发展,行行业业都与计算机技术相衔接,计算机技术普遍运用于各大行业,大学生租房系统便是其中一种。实施计算机系统来管理可以降低大学生租房管理的成本,使整个大学生租房的发展和服务水平有显著提升。本论文主要面向大学生租房管理中出现的一些常见问题,将......
  • 【人工智能】:搭建本地AI对话系统——Ollama、LobeChat和Go语言的全方位实践指南
    前言随着自然语言处理(NLP)技术的快速发展,越来越多的企业和个人开发者寻求在本地环境中运行大型语言模型(LLM),以确保数据隐私和提高响应速度。Ollama作为一个强大的本地运行框架,支持多种先进的LLM,并提供了易于使用的API接口。本文将详细介绍如何通过Ollama构建一个高效、安全......
  • springboot692基于web的智慧养老平台(论文+源码)_kaic
    摘要首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计......
  • 团体程序设计天梯赛-练习集——L1-011 A-B
    前言相对来说,这道题就比较简单了,但是这道题整整有20分呢,巨肥L1-011A-B本题要求你计算A−B。不过麻烦的是,A和B都是字符串——即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。输入格式:输入在2行中先后给出字符串A和B。两字符串的长度都不......
  • AI轻松将照片转为街头艺术与涂鸦风格,效果惊艳
    如果你曾想过将照片转化为街头艺术或涂鸦风格,那么img4you提供的在线工具将为你提供一个创意十足的解决方案。这个工具操作简单,用户只需要上传一张照片,选择自己喜爱的街头艺术或涂鸦风格,普通的照片就能瞬间变成充满现代感和艺术气息的街头作品。体验转换街头艺术或涂鸦风格http......
  • 基于php的旅游网站旅游系统广西旅游网站php+mysql毕业设计php源码获取课程设计毕设指
    一、功能介绍该网站主题是旅游相关,实现了旅游景点、美食以及酒店的预定功能,并且实现了在线论坛。前台功能首页:旅游信息、酒店信息、美食信息旅游美食:列表、详情、下单酒店:列表、详情、下单景点:列表、详情、下单购物车、去下单、订单信息、评论在线论坛用户中心:我的订......