LLM-RAG项目 P33 对话页面渲染和Alpinejs导入
接下来,开始做对话功能,跟知识库管理的操作类似,也是先渲染页面。但是,也有不一样的地方,就是在模板当中显示数据,要使用js来处理,而不是直接用模板的for循环。
代码示例
1、新建模块并修改蓝图
# apps/chat/__init__.py
from flask import Blueprint
bp = Blueprint('chat', __name__, url_prefix='/chat', template_folder='../templates/')
from . import views
2、新建视图文件
# apps/chat/views.py from flask import render_template, request, Response from extensions.ext_database import db from . import bp from config import LLM_MODELS from apps.dataset.models import Dataset
3、渲染视图
页面上要给用户提供模型、知识库选择框,把数据传到模板文件。
# apps/chat/views.py
@bp.route('/', endpoint='index')
def index():
dataset_objs = Dataset.query.order_by(Dataset.id.desc()).all()
data = {
'llm_models': list(LLM_MODELS.keys()),
'datasets': [{'id': obj.id, 'name': obj.name} for obj in dataset_objs],
}
return render_template('chat/index.html', **data)
4、页面动态显示数据
要实现在页面无刷新对话效果,就要用js异步发送和接收数据,这里用一个跟Vue.js语法类似的轻量级js框架。
# apps/templates/chat/index.html
<link rel="stylesheet" href="{{ url_for('static', filename='app.css') }}">
<div class="flex h-screen" x-data="app()">
<!-- 模型选择 -->
<div class="mt-4">
<label for="model-select" class="block mb-2 text-gray-800 font-medium">选择对话模型:</label>
<select id="model-select" class="w-full px-3 py-2 rounded border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500">
<template x-for="model_name in llmModels" :key="model_name">
<option :value="model_name" x-text="model_name"></option>
</template>
</select>
</div>
<!-- 知识库选择 -->
<div class="mt-6">
<div class="text-gray-800 mb-2 font-medium">选择知识库:</div>
<div class="flex flex-col space-y-2 overflow-y-auto h-28 p-3 border border-gray-300 rounded">
<div class="grid grid-cols-2 gap-2">
<template x-for="dataset in datasets" key="dataset.id">
<label class="flex items-center space-x-2">
<input type="checkbox" :value="dataset.id" class="form-checkbox h-4 w-4 text-blue-600">
<span class="text-gray-800" x-text="dataset.name"></span>
</label>
</template>
</div>
</div>
</div>
<script>
function app(){
llmModels = JSON.parse('{{ llm_models | tojson }}')
return {
llmModels: llmModels,
datasets: JSON.parse('{{ datasets | tojson }}')
}
</script>
这节课内容不多,可能大家比较陌生的就是 Alpinejs,有兴趣的同学,可以去参考官网,或者借助GPT工具了解更多用法。
本文链接:http://www.chenhuax.com/edu/note/767
版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!