学习目标• 掌握Zero-shot方式下prompt的设计方式• 掌握利用LLM实现信息抽取的代码1.LLM信息抽取任务介绍• 首先我们定义信息抽取的Schema:# 定义不同实体下的具备属性 schema { 金融: [日期, 股票名称, 开盘价, 收盘价, 成交量], }• 下面几段文本来自某平台发布的股票信息1.2023-02-15,寓意吉祥的节日,股票佰笃[BD]美股开盘价10美元,虽然经历了波动,但最终以13美元收盘,成交量微幅增加至460,000,投资者情绪较为平稳。, 2.2023-04-05,市场迎来轻松氛围,股票盘古(0021)开盘价23元,尽管经历了波动,但最终以26美元收盘,成交量缩小至310,000,投资者保持观望态度。,• 我们的且的是期望模型能够帮助我们识别出这2段话中的SPO三元组信息2.Prompti设i计• 在该任务的prompt 设计中我们主要考虑2点:○ 需要向模型解释什么叫作「信息抽取任务」○ 需要让模型按照我们指定的格式(json)输出• 为了让模型知道什么叫做「信息抽取」我们借用Incontext Learning的方式先给模型展示几个正确的例子 User: 2023-01-10,股市震荡。股票古哥-D[EOOE]美股今日开盘价100美元,一度飙升至105美元,随后回落至98美元,最终以102美元收盘,成交量达到520000。。提取上述句子中“金融”(‘日期’,‘股票名称’,‘开盘价’,‘收盘价’,‘成交量’)类型的实体,并按照JSON格式输出,上述句子中没有的信息用[原文中未提及]来表示,多个值之间用,分隔。 Bot: {日期: [2023-01-10],股票名称: [古哥-D[EOOE]美股],开盘价: [100美元], 收盘价: [102美元],成交量: [520000]} ...其中User代表我们输入给模型的句子Bot代表模型的回复内容。注意:上述例子中 Bot 的部分也是由人工输入的其目的是希望看到在看到类似 User 中的句子时模型应当做出类似Bot 的回答3.实体抽取任务代码实现• 本章节使用的模型通义千问大模型的API• 本次信息抽取任务实现的主要过程○ 构造prompt○ 再进行信息抽取3.1调用大模型API在金融文本中已经封装好了大模型的调用API这里直接调用就行。def model_chat(content: str, modelqwed-plus) - str:3.2编写信息抽取的指令遵循prompt编写的规范先来分析这个指令包含哪些内容:1.清晰地描述任务告诉大模型这是一个信息抽取的任务请根据输入的股票交易新闻完成金融事件抽取任务需要抽取的属性在结尾列表中给出。2.输入数据使用分隔符这里使用%s作为占位符输入的内容以###分隔。下面是输入内容 ### %s ### 需要抽取的元素包括 %s必须是上面给出的元素。3.输出格式说明输出结果以json格式返回下面是json格式的模板以###作为分隔符 ### {result: { 日期: [xxx], 股票名称: [xxx], 开盘价: [xxx], 收盘价: [xxx], 成交量: [xxx] } } ### json格式中的xxx是需要填充的内容如果没有抽取到填充无请记住你不能随意填充答案。4、指令优化按照上面的指令输出的内容包含在的ison中需要进一步调整指令指令优化部分大家可以完成整个代码开发以后针对大模型返回不合理的部分继续优化指令。返回内容是json格式的字符串不需要包裹内容.3.3开发信息抽取的主函数主函数需要包括的功能有1.完整的信息抽取指令拼接输入的内容和要求提取的schema2.拼接好的指令调用大模型得到返回的json字符串3.将ison字符串转为dict字典变成结构化数据方便后续使用import json from _model import model_chat # 定义要抽取的元素属性 schema { 金融: [日期, 股票名称, 开盘价, 收盘价, 成交量], } def load_json(func): # TODO: 大模型返回的结果可能不是严格 json 格式, 需要修正 def _wapper(*args, **kwargs): res func(*args, **kwargs) return json.loads(res) return _wapper load_json def ie_news(content, schema[日期, 股票名称, 开盘价, 收盘价, 成交量]): 根据金融信息抽取元素 :param content: 输入内容 :param schema: 需要抽取的元素 :return: json 格式 prompt 请根据输入的股票交易新闻完成金融事件抽取任务需要抽取的属性在结尾列表中给出。输入的文本内容如下 %s 需要抽取的元素包括 %s必须是上面给出的元素。 输出结果以json格式返回下面是json格式的模板以###作为分隔符 ### {result: { 日期: [xxx], 股票名称: [xxx], 开盘价: [xxx], 收盘价: [xxx], 成交量: [xxx] } } ### json格式中的xxx是需要填充的内容如果没有抽取到填充无请记住你不能随意填充答案。 % (content, schema) text model_chat(contentprompt) return text if __name__ __main__: sentences [ 2023-02-15寓意吉祥的节日股票佰笃[BD]美股开盘价10美元虽然经历了波动但最终以13美元收盘成交量微幅增加至460,000投资者情绪较为平稳。, 2023-04-05市场迎来轻松氛围股票盘古(0021)开盘价23元尽管经历了波动但最终以26美元收盘成交量缩小至310,000投资者保持观望态度。, ] for sent in sentences: res ie_news(sent) print([输入数据]:, sent) print([抽取结果]:, res) for k, v in res[result].items(): print(f\t{k} {v})输出结果为[抽取结果]: {result: {日期: [无], 股票名称: [佰笃[BD]], 开盘价: [10美元], 收盘价: [13美元], 成交量: [460,000]}} 日期 [无] 股票名称 [佰笃[BD]] 开盘价 [10美元] 收盘价 [13美元] 成交量 [460,000] [输入数据]: 2023-04-05市场迎来轻松氛围股票盘古(0021)开盘价23元尽管经历了波动但最终以26美元收盘成交量缩小至310,000投资者保持观望态度。 [抽取结果]: {result: {日期: [2023-04-05], 股票名称: [盘古], 开盘价: [23元], 收盘价: [26美元], 成交量: [310,000]}} 日期 [2023-04-05] 股票名称 [盘古] 开盘价 [23元] 收盘价 [26美元] 成交量 [310,000]