大模型实战 P26 LangChain之命名实体识别
前面课程当中,我们基本已经学完了LangChain的重要知识点,为了给后面的项目减负,提前给大家讲两个项目中的细节。这节课先讲第一个,就是用大模型做命名实体识别。
在之前的问答机器人项目里面,命名实体识别这块,我们用的是自己训练模型的方式实现的,比较麻烦。那现在有了大模型,我们就可以用大模型来做实体识别了,主要涉及的知识点是格式化输出。
代码示例
1、创建文件
# langchain_17_output_parser.py from langchain.chat_models import ChatOpenAI from dotenv import load_dotenv from langchain.prompts import PromptTemplate from langchain.output_parsers import ResponseSchema, StructuredOutputParser load_dotenv() llm = ChatOpenAI(model_name='gpt-3.5-turbo-1106', temperature=0)
2、定义实体字段
做命名实体识别的目的,是要把实体提取出来,填充CQL模型的,所以我们希望大模型处理完之后的数据,就是一个字典数据,这个过程,我们需要用到LangChain中的格式化输出。
# 定义实体字段 # 类型:list, string, number response_schemas = [ ResponseSchema(type='list', name='disease', description='疾病名称实体'), ResponseSchema(type='list', name='symptom', description='疾病症状实体'), ResponseSchema(type='list', name='drug', description='药物名称实体'), ] output_parser = StructuredOutputParser.from_response_schemas(response_schemas) format_instructions = output_parser.get_format_instructions() # print(format_instructions)
3、定义提示词模板
考虑到大模型可能会生成,文本中没有出现过的实体,我们通过自定义提示词的方式,让他不要推理。
template = ''' 1、从以下用户输入的句子中,提取实体内容。 2、仅根据用户输入抽取,不要推理。 3、注意json格式,在json中不要出现// {format_instructions} 用户输入:{input} 输出: ''' prompt = PromptTemplate( template=template, partial_variables={'format_instructions': format_instructions}, input_variables=['input'] ) # prompt = prompt.format(input='感冒是一种什么病?')
4、调用大模型并解析结果
因为LangChain预设提示词格式有问题,可能会出现json格式不合法的报错。
from langchain.chains import LLMChain chain = LLMChain( llm = llm, prompt = prompt ) # llm_output = chain.run(input='感冒是一种什么病?会导致咳嗽吗?') llm_output = chain.run(input='感冒吃什么药好得快?可以吃阿莫西林吗?') # print(llm_output) output = output_parser.parse(llm_output) print(output, type(output))
因为大模型每次生成的内容不完全一样,开发过程中,第4步的报错可能出现也有可能不出现。保险起见,下节课,还是带大家来重写一下格式化输出的提示词,防止在项目中报错。
本文链接:http://ichenhua.cn/edu/note/705
版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!