小白学大模型:自定义信息抽取Agent

自然语言处理(NLP)是人工智能和语言学领域的分支,它致力于使计算机能够理解、解释和生成人类语言。信息抽取和信息生成是NLP中的两个基础任务:

  1. 信息抽取是从文本中自动识别出结构化信息的过程。这些信息通常是实体(如人名、地点、组织名)、关系(如“属于”、“位于”)、事件(如“会议”、“冲突”)等。

  2. 信息生成是使用计算机程序自动创建或生成文本的过程。这可以是简单的文本摘要、复杂的新闻报道,甚至是创造性写作。

eb3b4df70c7f062751dc07a66ab89ff7.png

大模型在文本生成方面表现出色,但在信息抽取任务中,输出的结果可能不够精确和可控。本文将介绍使用tools和大模型结合,完成结果格式化的信息抽取任务。

unsetunsetTools 案例unsetunset

33cd234616d3b09ace1f64f0500c8c78.png

  • 定义函数调用的参数定义

tools = [
    {
        "type": "function",
        "function": {
            "name": "Ticket",
            "description": "根据用户提供的信息查询火车时刻",
            "parameters": {
                "type": "object",
                "properties": {
                    "date": {
                        "description": "要查询的火车日期",
                        "title": "Date",
                        "type": "string",
                    },
                    "departure": {
                        "description": "出发城市或车站",
                        "title": "Departure",
                        "type": "string",
                    },
                    "destination": {
                        "description": "要查询的火车日期",
                        "title": "Destination",
                        "type": "string",
                    },
                },
                "required": ["date", "departure", "destination"],
            },
        },
    }
]
  • 定义模型调用

messages = [
    {
        "role": "user",
        "content": "你能帮我查一下2024年1月1日从北京南站到上海的火车票吗?"
    }
]

from zhipuai import ZhipuAI
# https://open.bigmodel.cn/usercenter/apikeys
client = ZhipuAI(api_key="填入你的glm key")

response = client.chat.completions.create(
    model="glm-4-plus", 
    messages=messages,
    tools=tools,
    tool_choice="auto",
)
print(response.choices[0].message)

通过上述操作,可以完成函数参数的识别。但我们发现如果想要定义一个复杂的函数,其实很困难,在编写函数定义需要满足合法的格式。本文也会介绍通过pydantic简化tools定义的操作。

unsetunsetpydantic 是什么?unsetunset

Pydantic 是一个用于数据验证和设置管理的 Python 库。它通过 Python 类型注解来定义数据模型,并提供了强大的数据验证功能。Pydantic 的主要目标是确保数据在输入和输出时的一致性和有效性。它广泛应用于各种 Python 项目中,特别是在需要处理复杂数据结构和确保数据完整性的场景中。

  • 数据验证:确保输入数据符合预定义的类型和结构。

  • 序列化:将复杂的数据结构转换为 Python 数据类型,便于处理和传输。

  • 错误处理:提供详细的错误信息,帮助开发者快速定位和修复问题。

  • 配置管理:支持通过环境变量等方式管理配置,提高应用的可配置性。

  • JSON Schema 生成:模型可以自动生成 JSON Schema,便于与其他工具和系统集成。

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str

user = User(id=1, name='John Doe')
print(user)

unsetunset结合GLM Tools与pydanticunsetunset

结合 GLM Tools 与 Pydantic 的好处是,Pydantic 提供了一种方便的方式来定义和验证数据模型,而 GLM Tools 则提供了一种机制来调用大模型并执行信息抽取任务。通过这种方式,可以确保从大模型获取的数据是准确和可控的,同时也利用了大模型在文本生成方面的强大能力。

class GLMAgent:
    def __init__(self, model_name: str):
        self.model_name = model_name

    def call(self, user_prompt, response_model):
        messages = [
            {
                "role": "user",
                "content": user_prompt
            }
        ]
        tools = [
            {
                "type": "function",
                "function": {
                    "name": response_model.schema()['title'],
                    "description": response_model.schema()['description'],
                    "parameters": {
                        "type": "object",
                        "properties": response_model.schema()['properties'],
                        "required": response_model.schema()['required'],
                    },
                }
            }
        ]

        response = client.chat.completions.create(
            model=self.model_name,
            messages=messages,
            tools=tools,
            tool_choice="auto",
        )
        try:
            arguments = response.choices[0].message.tool_calls[0].function.arguments
            return response_model.model_validate_json(arguments)
        except:
            print('ERROR', response.choices[0].message)
            return None

接下来只需要通过代码定义,函数的说明、参数、参数说明、参数类型和参数可选的范围即可。 这种思路也在国外很多框架中

class Ticket(BaseModel):
    """根据用户提供的信息查询火车时刻"""
    date: str = Field(description="要查询的火车日期")
    departure: str = Field(description="出发城市或车站")
    destination: str = Field(description="要查询的火车日期")

GLMAgent(model_name = 'glm-4-plus').call("你能帮我查一下2024年1月1日从北京南站到上海的火车票吗?", Ticket)

通过这种方法有三个优点:

  • 定义函数很简单,通过写代码就可以完成函数参数定义,不需要自己写json、验证json的合法性。

  • 可以定义参数、参数类型和待选参数,适用范围很广。

  • 通过tools可以抽取得到结构化输出,并且上述操作可以适用于openai的接口。

案例1:文本分词

class Text(BaseModel):
    """抽取句子中的的单词,进行文本分词"""
    keyword: List[str] = Field(description="单词")

GLMAgent(model_name = 'glm-4-plus').call('阿水是强哥的好朋友。谢大脚是长贵的老公。', Text)

输出结果

Text(keyword=['阿水', '强哥', '好朋友', '谢大脚', '长贵', '老公'])

案例2:文本分类

class Text(BaseModel):
    """分析文本的情感"""
    sentiment: Literal["正向", "反向"] = Field(description="情感类型")

GLMAgent(model_name = 'glm-4-air').call('我今天很开心。', Text)

输出结果

Text(sentiment='正向')

通过修改参数的待选取值范围,可以控制输出的情感类别:

class Text(BaseModel):
    """分析文本的情感"""
    sentiment: Literal["postivate", "negative"] = Field(description="情感类型")

GLMAgent(model_name = 'glm-4-air').call('我今天很开心。', Text)

输出结果

Text(sentiment='postivate')

案例3:文本匹配

class Text(BaseModel):
    """判断句子是否语义相近"""
    score:float = Field(description="文本相似度,介于0与1。0代表不相似,1代表相似")

GLMAgent(model_name = 'glm-4-air').call('我今天很开心 与 我今天不开心。', Text)

输出结果

GLMAgent(model_name = 'glm-4-air').call('我今天很开心 与 我今天超级开心。', Text)

案例4:实体抽取

class Text(BaseModel):
    """抽取实体"""
    person: List[str] = Field(description="人名")
    location: List[str] = Field(description="地名")

GLMAgent(model_name = 'glm-4-air').call('今天我和徐也也去海淀吃饭,强哥也去了。', Text)

输出结果

Text(person=['我', '徐也也', '强哥'], location=['海淀'])

案例5:关系抽取

class Text(BaseModel):
    """抽取句子中所有实体之间的关系"""
    source_person: List[str] = Field(description="原始实体")
    target_person: List[str] = Field(description="目标实体")
    relationship: List[Literal["朋友", "亲人", "同事"]] = Field(description="待选关系")

GLMAgent(model_name = 'glm-4-air').call('阿水是强哥的好朋友。谢大脚是长贵的老公。', Text)

输出结果

Text(source_person=['阿水'], target_person=['强哥'], relationship=['朋友'])

案例6:关键词提取

class Text(BaseModel):
    """抽取句子中的关键词"""
    keyword: str = Field(description="关键词")

GLMAgent(model_name = 'glm-4-plus').call('阿水是强哥的好朋友。谢大脚是长贵的老公。', Text)

输出结果

Text(keyword='阿水')

案例7:综合案例(RAG路由)

class Text(BaseModel):
    """文本问答内容解析"""
    search: bool = Field(description="是否需要搜索")
    keywords: List[str] = Field(description="待选关键词")
    intent: Literal["查询客服问题", "查询产品问题", "查询系统问题", "其他"] = Field(description="意图")

GLMAgent(model_name = 'glm-4-plus').call('汽车发动和轮胎出故障了,如何处理?', Text)

输出结果

Text(search=True, keywords=['汽车发动故障', '轮胎故障', '处理方法'], intent='查询产品问题')

案例8:综合案例(事件抽取)

class Text(BaseModel):
    """文本问答内容解析"""
    time: List[str] = Field(description="时间")
    particate: List[str] = Field(description="选手")
    competition: List[str] = Field(description="赛事名称")

GLMAgent(model_name = 'glm-4-plus').call('2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!2022语言与智能技术竞赛由中国中文信息学会和中国计算机学会联合主办。', Text)

输出结果

Text(time=['2月8日上午'], particate=['谷爱凌'], competition=['北京冬奥会自由式滑雪女子大跳台决赛', '2022语言与智能技术竞赛'])
 
 

d80735fe9c0c523e302ffdc271a934b8.jpeg

 
 
 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
  • 交流群

欢迎加入机器学习爱好者微信群一起和同行交流,目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群,请扫描下面的微信号加群,备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~(也可以加入机器学习交流qq群772479961)

36b0a38cc0d054260d52d1fcf1a32d86.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值