判决书文本标记#
背景#
从若干份案件判决书的全文中,逐份提取肇事人、事故发生地、伤亡数量等二十余项信息。
方案#
使用大模型进行文本标记,并用function_call功能来获取结构化数据。
问题#
判决书全文过长,直接丢给大模型会让其标记效果不好,如“总罚款金额”会识别成“赔偿金”、“单项罚款金额”等错误数据。
解决方案1#
正文切割成段落或句子,从这些段落和句子中摘要成半结构化数据。
解决方案2#
使用大模型读取整篇文本和20个字段的说明,为每个问题字段给出合适文本 例如: relevant_text:dict[str,list[str]] = { “案件类型”:[ “对应文本1”, “对应文本2” ] “肇事人”:[ “对应文本1” ] } 提示词为:将原始文本分段,让它从20个字段中选出来最相关的字段标记这段文本
将问题字段与对应文本发送给大模型,大模型给出合适结果
注:这个方案是RAG方案的简化版,RAG方案所做的同样是找到20个字段各自对应的文本,但它(找文本这一步的)实现方式是通过向量搜索(通过词嵌入等方式找到最对应文本段)完成的,然后发送给大模型整合答案。RAG之所以这样做是因为被搜索的文本数量很多,大模型上下文长度不够,所以只好用其他方式代替。但在此处,被搜索的文本长度是可以被直接读的,所以用大模型代替RAG部分,找到对应的文本,再次拿着这个文本去询问大模型(文本越短,结果越准)。
"""
此处代码无法正常运行,后续会有补充,只是作为示例进行演示,最终版本为可运行的核心代码片段
"""
# # 解决方案2的代码
# ## 步骤1: 大模型读取文本和字段说明,为每个问题字段给出合适文本
# tools = [
# {
# "type":"function",
# "function": {
# "name": "associate_field_with_text",
# "description": "将与文本有关联的字段保存",
# "parameters": {
# "type": "object",
# "properties": {
# "field":{
# "type": "list[string]",
# "description": "与所给文本有关联的若干个字段,例如['文书类型','肇事人']等,只给出字段名称即可",
# },
# "log":{
# "type":"string",
# "description":"日志,简要给出你的标记依据,你给出这些字段的原因"
# }
# },
# },
# "required":[
# "field",
# "text",
# ]
# }
# }
# ]
# def get_response(self,messages,tools):
# response = Generation.call(
# model='qwen-max',
# messages=messages,
# tools=tools,
# result_format='message'
# )
# return response
# ## 步骤2: 将问题字段与对应文本发送给大模型,大模型给出合适结果
# question_filed = '案件类型'
# chat ( question_filed, relevant_text [ question_filed ] ,prompt )
'\n此处代码无法正常运行,后续会有补充,只是作为示例进行演示,最终版本为可运行的核心代码片段\n'