前面课程当中,我们基本已经学完了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://www.ichenhua.cn/edu/note/705

版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!