微信扫码
与创始人交个朋友
我要投稿
自然语言处理(NLP)是人工智能和语言学领域的分支,它致力于使计算机能够理解、解释和生成人类语言。信息抽取和信息生成是NLP中的两个基础任务:
大模型在文本生成方面表现出色,但在信息抽取任务中,输出的结果可能不够精确和可控。本文将介绍使用tools和大模型结合,完成结果格式化的信息抽取任务。
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定义的操作。
Pydantic 是一个用于数据验证和设置管理的 Python 库。它通过 Python 类型注解来定义数据模型,并提供了强大的数据验证功能。Pydantic 的主要目标是确保数据在输入和输出时的一致性和有效性。它广泛应用于各种 Python 项目中,特别是在需要处理复杂数据结构和确保数据完整性的场景中。
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
user = User(id=1, name='John Doe')
print(user)
结合 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)
通过这种方法有三个优点:
class Text(BaseModel):
"""抽取句子中的的单词,进行文本分词"""
keyword: List[str] = Field(description="单词")
GLMAgent(model_name = 'glm-4-plus').call('阿水是强哥的好朋友。谢大脚是长贵的老公。', Text)
输出结果
Text(keyword=['阿水', '强哥', '好朋友', '谢大脚', '长贵', '老公'])
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')
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)
class Text(BaseModel):
"""抽取实体"""
person: List[str] = Field(description="人名")
location: List[str] = Field(description="地名")
GLMAgent(model_name = 'glm-4-air').call('今天我和徐也也去海淀吃饭,强哥也去了。', Text)
输出结果
Text(person=['我', '徐也也', '强哥'], location=['海淀'])
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=['朋友'])
class Text(BaseModel):
"""抽取句子中的关键词"""
keyword: str = Field(description="关键词")
GLMAgent(model_name = 'glm-4-plus').call('阿水是强哥的好朋友。谢大脚是长贵的老公。', Text)
输出结果
Text(keyword='阿水')
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='查询产品问题')
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+中大型企业
2024-05-28
2024-08-13
2024-04-26
2024-08-21
2024-07-09
2024-06-13
2024-08-04
2024-04-11
2024-07-18
2024-07-01