AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


小白学大模型:自定义信息抽取Agent
发布日期:2024-11-22 06:07:14 浏览次数: 1697 来源:Coggle数据科学


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

  1. 信息抽取是从文本中自动识别出结构化信息的过程。这些信息通常是实体(如人名、地点、组织名)、关系(如“属于”、“位于”)、事件(如“会议”、“冲突”)等。
  2. 信息生成是使用计算机程序自动创建或生成文本的过程。这可以是简单的文本摘要、复杂的新闻报道,甚至是创造性写作。

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

unsetunsetTools 案例unsetunset

  • 定义函数调用的参数定义
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语言与智能技术竞赛'])


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询