基于LLM智能问答系统【阿里云:天池比赛】

张开发
2026/4/8 8:07:02 15 分钟阅读

分享文章

基于LLM智能问答系统【阿里云:天池比赛】
天池比赛:基于LLM智能问答系统学习赛https://tianchi.aliyun.com/competition/entrance/532172/information项目介绍:从数据库及pdf文档中检索出用户问题对应的答案关键技术:基于GPT模型的Text2Sql,向量召回排序、文本生成、NER实体识别关键优化项:动态SQL链路优化sql样例中对数据库字段的覆盖度,语义检索链路如下:GPT指令优化:调整指令中的角色、样例、输出结果格式pdf文件拆分:长度调整、pdf文件内容标准化(去掉空格,特殊字符处理)query处理:去停用词(根据/知道/什么...)、去掉截止日期技术流程:使用Qwen识别问题中的公司名实体,有公司名的走语义检索,无公司名的走结构化召回1)结构化召回:Qwen根据问题动态生成sql(先微调使用最佳的case生成指令),执行sql获取结果数值,把结果数值与问题给到Qwen生成最终结果2)语义检索:先识别出pdf文件中对应的公司名称根据问题中的公司名称找到对应的招股说明书pdf文件把pdf文件切分成段N个文本段、为每个文本段生成向量集合A把问题生成向量B使用余弦相似度比较2类向量并排序得到top5,把top5合并成一个文本T把问题与文本T生成提示词送给Qwen生成结果后续优化项包括不限于:1)提升召回率-主要是语义召回,可以考虑适当增加向量返回的结果数量,比如从top5提升到top8。2)提升召回率-优化向量相似度匹配:考虑使用专业的向量模型生成向量,比如bge等3)提升准确率:主要是语义召回:可以优化提示词+对问题及检索的文本进行归一化、适当考虑增加精排进一步提升准确率4)模型微调:动态生成sql这块可以使用微调后的模型5)模型切换:现在使用的是Qwen-7B-Chat,可以尝试使用参数更大模型或金融相关的专业模型得分:综合:78.49结构化召回:89.05语义:62.65排名:31/3502说明:本文源码下载:https://download.csdn.net/download/love254443233/90106437参考的baseline代码=大模型说的队(源码FinQwen)Tongyi-EconML/FinQwen: FinQwen: 致力于构建一个开放、稳定、高质量的金融大模型项目,基于大模型搭建金融场景智能问答系统,利用开源开放来促进「AI+金融」。https://github.com/Tongyi-EconML/FinQwen关键源码:提取实体:import csv import pandas as pd import numpy as np import re import copy from modelscope import AutoModelForCausalLM, AutoTokenizer, snapshot_download from modelscope import GenerationConfig model_dir = '/data/nfs/baozhi/models/Qwen-7B-Chat' # Note: The default behavior now has injection attack prevention off. tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True) new_question_file_dir = 'intermediate/A01_question_classify.csv' new_question_file = pd.read_csv(new_question_file_dir,delimiter = ",",header = 0) company_file_dir = 'files/AF0_pdf_to_company.csv' company_file = pd.read_csv(company_file_dir,delimiter = ",",header = 0) company_data_csv_list = list() company_index_list = list() company_name_list = list() for cyc in range(len(company_file)): company_name_list.append(company_file[cyc:cyc+1]['公司名称'][cyc]) company_data_csv_list.append(company_file[cyc:cyc+1]['csv文件名'][cyc]) temp_index_cp = tokenizer(company_file[cyc:cyc+1]['公司名称'][cyc]) temp_index_cp = temp_index_cp['input_ids'] company_index_list.append(temp_index_cp) g = open('intermediate/A02_question_classify_entity.csv', 'w', newline='', encoding = 'utf-8-sig') csvwriter = csv.writer(g) csvwriter.writerow(['问题id','问题','分类','对应实体','csv文件名']) for cyc in range(len(new_question_file)): tempw_id = new_question_file[cyc:cyc+1]['问题id'][cyc] tempw_q = new_question_file[cyc:cyc+1]['问题'][cyc] tempw_q_class = new_question_

更多文章