目录
- 前言
- 一、ChatGLM4
- 1-1、模型介绍
- 1-2、关键概念
- 1-3、场景示例
- 1-4、模型概览
- 二、快速开始
- 2-1、安装
- 2-2、Demo案例
- 2-3、请求参数
- 2-4、异步调用
- 三、模型工具
- 3-1、通用Web搜索
- 3-2、函数调用
- 3-3、增强检索
- 3-4、文件问答
- 总结
前言
GLM 全名 General Language Model ,是一款基于自回归填空的预训练语言模型。一、ChatGLM4
1-1、模型介绍
北京时间2024年1月16日,智谱AI正式推出GLM-4新一代基座大模型,整体性能相比GLM3全面提升60%,根据实际测试,GLM-4在以中文为主的应用场景中实际性能逼近GPT-4的95%,在一些中文对齐的测试中,甚至超过GPT-4表现,逼近GPT-4-turbo模型。 此外,GLM-4支持128K对话上下文,并且支持更强的多模态功能、支持更快推理速度,更多并发,大大降低推理成本;同时GLM-4增强了智能体(Agent)和Retrieval(检索)功能。并且,经过一段时间的实际使用发现,GLM-4相比ChatGLM3有明显进步,这也进一步增加了我们对国产大模型未来发展的期待。
1-2、关键概念
以下是一些关键概念的介绍
-
1、GLM: GLM 全名 General Language Model ,是一款基于自回归填空的预训练语言模型。ChatGLM系列模型,支持相对复杂的自然语言指令,并且能够解决困难的推理类问题。该模型配备了易于使用的 API 接口,允许开发者轻松将其融入各类应用,广泛应用于智能客服、虚拟主播、聊天机器人等诸多领域。
-
2、Embedding: Embedding 是一种将数据(如文本)转化为向量形式的表示方法,这种表示方式确保了在某些特定方面相似的数据在向量空间中彼此接近,而与之不相关的数据则相距较远。通过将文本字符串转换为向量,使得数据能够有效用于搜索、聚类、推荐系统、异常检测和分类等应用场景。
-
3、Token: Token 是模型用来表示自然语言文本的基本单位,可以直观的理解为“字”或“词”;通常 1 个中文词语、1 个英文单词、1 个数字或 1 个符号计为 1 个token。一般情况下 ChatGLM 系列模型中 token 和字数的换算比例约为 1:1.8 ,但因为不同模型的分词不同,所以换算比例也存在差异,每一次实际处理 token 数量以模型返回为准,您可以从返回结果的 usage 中查看。
1-3、场景示例
以下为从官方文档中截取的部分适用场景:
1-4、模型概览
语言模型:
多模态模型:
向量模型:
其他模型:
二、快速开始
2-1、安装
pip install --upgrade zhipuai
2-2、Demo案例
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
response = client.chat.completions.create(
model="glm-4", # 请填写您要调用的模型名称
messages=[
{"role": "user", "content": "作为一名营销专家,请为我的产品创作一个吸引人的口号"},
{"role": "assistant", "content": "当然,要创作一个吸引人的口号,请告诉我一些关于您产品的信息"},
{"role": "user", "content": "智谱AI开放平台"},
{"role": "assistant", "content": "点燃未来,智谱AI绘制无限,让创新触手可及!"},
{"role": "user", "content": "创作一个更精准且吸引人的口号"}
],
)
print(response.choices[0].message)
输出:
content=‘“激活想象,智谱AI平台,让每一刻都是创新的起点!”’ role=‘assistant’ tool_calls=None
2-3、请求参数
常用参数:
- model:要调用的模型名称
- messages,对话消息列表,以JSON数组形式提供。
- stream:是否为流式输出
- max_tokens: 模型输出的最大token数。
- tools:模型可以调用的工具,目前支持的工具类型为(function、retrival、web_search)。
参数列表如下:
2-4、异步调用
异步调用: 除了调用的函数不同,请求参数与同步API调用是相同的。
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
response = client.chat.asyncCompletions.create(
model="glm-4", # 请填写您要调用的模型名称
messages=[
{
"role": "user",
"content": "
作为童话之王,请以始终保持一颗善良的心为主题,写一篇简短的童话故事。故事应能激发孩子们的学习兴趣和想象力,同时帮助他们更好地理解和接受故事中蕴含的道德和价值观。"
}
],
)
print(response)
import time
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
response = client.chat.asyncCompletions.create(
model="glm-4", # 请填写您要调用的模型名称
messages=[
{
"role": "user",
"content": "
作为童话之王,请以始终保持一颗善良的心为主题,写一篇简短的童话故事。故事应能激发孩子们的学习兴趣和想象力,同时帮助他们更好地理解和接受故事中蕴含的道德和价值观。"
}
],
)
task_id = response.id
task_status = ''
get_cnt = 0
while task_status != 'SUCCESS' and task_status != 'FAILED' and get_cnt <= 40:
result_response = client.chat.asyncCompletions.retrieve_completion_result(id=task_id)
print(result_response)
task_status = result_response.task_status
time.sleep(2)
get_cnt += 1
三、模型工具
3-1、通用Web搜索
通用搜索:网络搜索功能默认为关闭状态(False)。当启用搜索(设置为 True)时,系统会自动判断是否需要进行网络检索,并调用搜索引擎获取相关信息。
- **search_query **: 可以使用 search_query 参数可以自定义搜索内容,提升搜索结果的相关性和精确度。 如果不传 search_query 参数,系统将根据用户的消息自动进行网页检索。
- content: 可以在用户的问题中加网页,以指定搜索某个网页
- search_result : 启用 search_result 参数允许用户获取详细的网页搜索来源信息,包括来源网站的图标、标题、链接、来源名称以及引用的文本内容。
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="您的APIKey")
tools = [{
"type": "web_search",
"web_search": {
"enable": True #默认为关闭状态(False) 禁用:False,启用:True。
# "search_query": "自定义搜索的关键词"
# "search_result": True
}
}]
messages = [{
"role": "user",
"content": "中国 2024 年一季度的GDP是多少 "
}]
response = client.chat.completions.create(
model="glm-4",
messages=messages,
tools=tools
)
print(response.choices[0].message)
输出:
content=‘根据您提供的参考信息,中国2024年一季度的GDP为296299亿元人民币。这个数据是根据国家统计局的初步核算,按不变价格计算得出的同比增长率5.3%。’ role=‘assistant’ tool_calls=None
3-2、函数调用
Tools字段传入可以调用的函数列表:
备注:
- 传参错误:可以添加提示词例如——不要假设或猜测传入函数的参数值。如果用户的描述不明确,请要求用户提供必要信息
- tool_choice : 强制模型使用特定函数
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="")
messages = []
tools = [
{
"type": "function",
"function": {
"name": "get_flight_number",
"description": "根据始发地、目的地和日期,查询对应日期的航班号",
"parameters": {
"type": "object",
"properties": {
"departure": {
"description": "出发地",
"type": "string"
},
"destination": {
"description": "目的地",
"type": "string"
},
"date": {
"description": "日期",
"type": "string",
}
},
"required": [ "departure", "destination", "date" ]
},
}
},
{
"type": "function",
"function": {
"name": "get_ticket_price",
"description": "查询某航班在某日的票价",
"parameters": {
"type": "object",
"properties": {
"flight_number": {
"description": "航班号",
"type": "string"
},
"date": {
"description": "日期",
"type": "string",
}
},
"required": [ "flight_number", "date"]
},
}
},
]
messages = []
# messages.append({"role": "system", "content": "不要假设或猜测传入函数的参数值。如果用户的描述不明确,请要求用户提供必要信息"})
messages.append({"role": "user", "content": "帮我查询从2024年1月20日,从北京出发前往上海的航班"})
response = client.chat.completions.create(
model="glm-4", # 填写需要调用的模型名称
messages=messages,
tools=tools,
# tool_choice={"type": "function", "function": {"name": "get_ticket_price"}},
)
print(response.choices[0].message)
messages.append(response.choices[0].message.model_dump())
输出: 根据以下输出,我们可以看到模型成功调用了函数,并且传入了参数。
content=None role=‘assistant’ tool_calls=[CompletionMessageToolCall(id=‘call_9106867304118456432’, function=Function(arguments=‘{“date”:“2024-01-20”,“departure”:“北京”,“destination”:“上海”}’, name=‘get_flight_number’), type=‘function’)]
函数实现:
def get_flight_number(date:str , departure:str , destination:str):
flight_number = {
"北京":{
"上海" : "1234",
"广州" : "8321",
},
"上海":{
"北京" : "1233",
"广州" : "8123",
}
}
return { "flight_number":flight_number[departure][destination] }
def get_ticket_price(date:str , flight_number:str):
return {"ticket_price": "1000"}
def parse_function_call(model_response,messages):
# 处理函数调用结果,根据模型返回参数,调用对应的函数。
# 调用函数返回结果后构造tool message,再次调用模型,将函数结果输入模型
# 模型会将函数调用结果以自然语言格式返回给用户。
if model_response.choices[0].message.tool_calls:
tool_call = model_response.choices[0].message.tool_calls[0]
args = tool_call.function.arguments
function_result = {}
if tool_call.function.name == "get_flight_number":
function_result = get_flight_number(**json.loads(args))
if tool_call.function.name == "get_ticket_price":
function_result = get_ticket_price(**json.loads(args))
messages.append({
"role": "tool",
"content": f"{json.dumps(function_result)}",
"tool_call_id":tool_call.id
})
response = client.chat.completions.create(
model="glm-4", # 填写需要调用的模型名称
messages=messages,
tools=tools,
)
print(response.choices[0].message)
messages.append(response.choices[0].message.model_dump())
3-3、增强检索
- 构建知识库: 用于管理文件,支持上传多个文件,并通过关联知识库ID后进行调用。知识库最大容量为1G、调用方式请参考接口文档。
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
result = client.knowledge.create(
embedding_id=3,
name="knowledge name",
description="knowledge description"
)
print(result.id)
- 上传文件: 支持将doc、docx、pdf、xlsx类型文件上传到知识库,支持自定义文件切片的大小和规则。文件大小不得超过50MB。
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
resp = client.knowledge.document.create(
file=open("xxx.xlsx", "rb"),
purpose="retrieval",
knowledge_id="1798330146986561536",
sentence_size=202,
custom_separator=["\n"]
)
print(resp)
- 通过工具调用知识库: 创建知识库后,您将获得一个知识库ID。调用模型服务时,传入知识库ID,使大模型能获取相关内容以响应用户查询。
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
response = client.chat.completions.create(
model="glm-4", # 填写需要调用的模型名称
messages=[
{"role": "user", "content": "你好!你叫什么名字"},
],
tools=[
{
"type": "retrieval",
"retrieval": {
"knowledge_id": "your knowledge id",
"prompt_template": "从文档\n\"\"\"\n{{knowledge}}\n\"\"\"\n中找问题\n\"\"\"\n{{question}}\n\"\"\"\n的答案,找到答案就仅使用文档语句回答问题,找不到答案就用自身知识回答并且告诉用户该信息不是来自文档。\n不要复述问题,直接开始回答。"
}
}
],
stream=True,
)
for chunk in response:
print(chunk.choices[0].delta)
3-4、文件问答
单文件问答示例:
from zhipuai import ZhipuAI
from pathlib import Path
import json
# 填写您自己的APIKey
client = ZhipuAI(api_key="your_api_key_here")
# 格式限制:.PDF .DOCX .DOC .XLS .XLSX .PPT .PPTX .PNG .JPG .JPEG .CSV .PY .TXT .MD .BMP .GIF
# 大小:单个文件50M、总数限制为100个文件
file_object = client.files.create(file=Path("aaa.pdf"), purpose="file-extract")
# 获取文本内容
file_content = json.loads(client.files.content(file_id=file_object.id).content)["content"]
# 生成请求消息
message_content = f"请对\n{file_content}\n的内容进行分析,并撰写一份论文摘要。"
response = client.chat.completions.create(
model="glm-4-long",
messages=[
{"role": "user", "content": message_content}
],
)
print(response.choices[0].message)
多文件问答示例
from zhipuai import ZhipuAI
from pathlib import Path
import json
# 填写您自己的APIKey
client = ZhipuAI(api_key="your_api_key_here")
# 上传并提取文本内容
file_01 = client.files.create(file=Path("aaa.pdf"), purpose="file-extract")
content_01 = json.loads(client.files.content(file_01.id).content)["content"]
# 上传并提取文本内容
file_02 = client.files.create(file=Path("bbb.pdf"), purpose="file-extract")
content_02 = json.loads(client.files.content(file_02.id).content)["content"]
# 生成请求消息,将不同文件的内容放入消息中
message_content = (
"请对以下论文进行分析,并且生成一份论文综述:\n\n"
"第一篇论文内容如下:\n"
f"{content_01}\n\n"
"第二篇论文内容如下:\n"
f"{content_02}"
)
response = client.chat.completions.create(
model="glm-4-long",
messages=[
{"role": "user", "content": message_content}
],
)
print(response.choices[0].message)
删除文件: 每个用户最多可以上传100个文件,建议在提取数据后删除文件,并将文件抽取内容存储到本地,避免重复上传。
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
result = client.files.delete(
file_id="文件id" #支持retrieval、batch、fine-tune、file-extract文件
)
参考文章:
- 智谱AI官方文档
总结
想上天🐟