一、个人任务
本周我的任务主要有以下两个
- 完善对话功能的后端接口
- 讨论前端页面的改进
二、任务1——完善对话功能的后端接口
1.由于一开始会给用户提示推荐的问题,所以我们准备了一个存储常见问题的表,每次用其中随机选取5个问题展示给用户
具体的后端代码如下
@app.route('/api/front/getRandomQues', methods=['GET'])
def getRandomQues():
"""
"""
db_conn = get_db_conn()
try:
# 从请求体中获取 user_id 和 new_password
# 使用用户 ID, content 和 type 构建插入反馈的语句
# 假设feedback表有user_id, content, type, created_at等字段
sql_str = """
SELECT
question
FROM
question
ORDER BY RAND()
LIMIT 5
"""
# 使用参数化查询来防止SQL注入
results = db_conn.get_all(sql_str)
data = []
for i in results:
data.append(i)
if not results:
return jsonify({'message': 'No records found for the given user_id'}), 200
return jsonify(data),200
except Exception as e:
print(e)
return msg(500, 'Internal Server Error')
2.由于侧边栏需要展示用户的历史问题,我们建立user_record表存储对应数据
后端代码逻辑如下:
@app.route('/api/front/get_PreRecords', methods=['GET'])
def getPreRecords():
"""
"""
db_conn = get_db_conn()
try:
# 从请求体中获取 user_id 和 new_password
user_id = request.args.get('user_id')
#
# if not user_id:
# return msg(400, 'User ID are required')
# 使用用户 ID, content 和 type 构建插入反馈的语句
# 假设feedback表有user_id, content, type, created_at等字段
sql_str = """
SELECT
u.user_id,r.question,r.type,r.record_id
FROM
user_record u
JOIN
records r ON u.record_id = r.record_id
WHERE
u.user_id = %s
"""
# u.user_id,u.record_id,question,type
# 使用参数化查询来防止SQL注入
args = (user_id,)
results = db_conn.get_all(sql_str, args)
marked_results1 = [
{'record_id': r[3], 'question': r[1], 'user_id': r[0], 'type': r[2]}
for r in results]
if not results:
return jsonify({'message': 'No records found for the given user_id'}), 200
return jsonify(marked_results1),200
except Exception as e:
print(e)
return msg(500, 'Internal Server Error')
前端效果如下:
3.对话效果,当用户输入病例X光图片并给出问题时,可以和模型进行对话,相应代码如下
@app.route('/api/front/setImageRecords', methods=['POST'])
def setImageRecords():
"""
根据用户 ID 重置用户密码
:param user_id: 用户的唯一标识符
:param new_password: 新密码
:return: JSON 格式的响应,包含操作结果
"""
db_conn = get_db_conn()
json_post_raw =request.json()
print("Start to process request")
json_post = json.dumps(json_post_raw)
request_data = json.loads(json_post)
try:
# 从请求体中获取 user_id 和 new_password
input_text = request.json.get('text')
input_image = request.json.get('image')
with open(input_image, 'rb') as image_file:
input_image_encoded = base64.b64encode(image_file.read()).decode('utf-8')
history = request.json.get('history')
type = request.json.get('type')
qtime = request.json.get('qtime')
user_id = request.json.get('user_id')
record_id =uuid.uuid4()
input_para = {
"max_length": 2048,
"min_length": 50,
"temperature": 0.8,
"top_p": 0.4,
"top_k": 100,
"repetition_penalty": 1.2
}
input_para.update(request_data)
is_zh = is_chinese(input_text)
input_data = generate_input(input_text, input_image_encoded, history, input_para)
input_image, gen_kwargs = input_data['input_image'], input_data['gen_kwargs']
with torch.no_grad():
answer, history, _ = chat(None, model, tokenizer, input_text, history=history, image=input_image, \
max_length=gen_kwargs['max_length'], top_p=gen_kwargs['top_p'], \
top_k=gen_kwargs['top_k'], temperature=gen_kwargs['temperature'],
english=not is_zh)
now = datetime.datetime.now()
atime = now.strftime("%Y-%m-%d %H:%M:%S")
num = db_conn.insert(
"INSERT INTO records (record_id,user_id, question, image,answer,q_time,a_time,type) VALUES (%s, %s, %s, %s,%s,%s, %s, %s)",
(record_id,user_id, input_text, input_image,answer,qtime,atime,type)
)
response = {
"result": answer,
"history": history,
"status": 200,
"time": atime
}
except Exception as e:
print(e)
return msg(500, 'Internal Server Error')
return response
4.存储用户反馈信息
@app.route('/api/front/get_PreRecords', methods=['GET'])
def getPreRecords():
"""
"""
db_conn = get_db_conn()
try:
# 从请求体中获取 user_id 和 new_password
user_id = request.args.get('user_id')
#
# if not user_id:
# return msg(400, 'User ID are required')
# 使用用户 ID, content 和 type 构建插入反馈的语句
# 假设feedback表有user_id, content, type, created_at等字段
sql_str = """
SELECT
u.user_id,r.question,r.type,r.record_id
FROM
user_record u
JOIN
records r ON u.record_id = r.record_id
WHERE
u.user_id = %s
"""
# u.user_id,u.record_id,question,type
# 使用参数化查询来防止SQL注入
args = (user_id,)
results = db_conn.get_all(sql_str, args)
marked_results1 = [
{'record_id': r[3], 'question': r[1], 'user_id': r[0], 'type': r[2]}
for r in results]
if not results:
return jsonify({'message': 'No records found for the given user_id'}), 200
return jsonify(marked_results1),200
except Exception as e:
print(e)
return msg(500, 'Internal Server Error')
5.获取用户某条历史记录
@app.route('/api/front/getSpePreRecords', methods=['GET'])
def getSpecPreRecords():
"""
"""
db_conn = get_db_conn()
try:
# 从请求体中获取 user_id 和 new_password
user_id = request.args.get('user_id')
type = request.args.get('type')
if not user_id :
return msg(400, 'User ID are required')
# 使用用户 ID, content 和 type 构建插入反馈的语句
# 假设feedback表有user_id, content, type, created_at等字段
sql_str = """
SELECT
user_id,record_id,question,answer,type
FROM
records
WHERE
user_id = %s and type = %s
order by q_time asc
"""
# 使用参数化查询来防止SQL注入
args = (user_id,type)
results = db_conn.get_all(sql_str, args)
# 处理结果,为每个元组添加'question'和'answer'的标记(这里假设它们是字符串)
marked_results1 = [
{'record_id':r[1], 'question': r[2], 'answer': '', 'type': r[4]}
for r in results]
marked_results2 = [
{'record_id': r[1], 'question': '', 'answer': r[3], 'type': r[4]}
for r in results
]
marked_results3=[]
for r in marked_results1:
marked_results3.append(r)
for result in marked_results2:
if result['record_id'] == r['record_id']:
marked_results3.append(result)
if not marked_results3:
return jsonify({'message': 'No records found for the given user_id'}), 200
return jsonify(marked_results3),200
except Exception as e:
print(e)
return msg(500, 'Internal Server Error')
三、任务2——讨论前端页面的改进
现阶段的前端页面如下:
经小组讨论,我们进一步优化的地方如下:
- 修改反馈信息部分的颜色配色和布局
- 统一全局字体为微软雅黑
- 初始对话页面太空旷,考虑加入一些符合用户友好的提示语
四、总结
1.接口功能完善
- 根据业务需求,扩展了对话接口的功能,如支持多轮对话、上下文记忆等,提升了用户体验。
- 增加了对接口使用情况的监控和日志记录功能,方便后续对接口性能和使用情况进行分析和优化。
2、讨论前端页面的改进
除了后端工作,我还积极参与了前端页面改进的讨论。我们团队讨论了以下几个方面:
- 用户体验:我们探讨了如何提升页面的加载速度、优化操作流程和增强交互性,以提升用户的整体体验。
- 页面布局:我们讨论了页面布局的合理性,包括页面元素的排列、颜色的搭配和字体的选择等,以确保页面的一致性和美观性。
- 功能需求:我们根据业务需求,讨论了前端页面需要增加或改进的功能点,并进行了初步的规划和设计。
- 协作机制:我们建立了前端和后端的协作机制,确保双方能够及时了解对方的进度和需求,以便更好地配合工作。