自然语言处理(NLP)是人工智能和语言学领域的分支,它致力于使计算机能够理解、解释和生成人类语言。信息抽取和信息生成是NLP中的两个基础任务:
-
信息抽取是从文本中自动识别出结构化信息的过程。这些信息通常是实体(如人名、地点、组织名)、关系(如“属于”、“位于”)、事件(如“会议”、“冲突”)等。
-
信息生成是使用计算机程序自动创建或生成文本的过程。这可以是简单的文本摘要、复杂的新闻报道,甚至是创造性写作。
大模型在文本生成方面表现出色,但在信息抽取任务中,输出的结果可能不够精确和可控。本文将介绍使用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语言与智能技术竞赛'])
读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用
对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费
】🆓
👉AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费
】🆓