【ChatGLM4系列】入门介绍以及API调用


前言

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文件
)

参考文章:


总结

想上天🐟

<think>好的,用户现在问的是关于调用本地AI的API的插件。我需要先回顾之前的对话历史。用户之前询问过AnythingLLM的插件,特别是无需自己开发的解决方案。现在他们想了解如何调用本地AI的API的插件,可能是指如何将本地部署的AI模型集成到AnythingLLM中,或者寻找相关的插件工具。 首先,我需要确定用户的具体需求。调用本地AI的API可能涉及到使用本地部署的大模型,比如Llama、ChatGLM等,或者使用像Ollama这样的工具。用户可能希望在不依赖云服务的情况下,利用本地模型的能力,同时通过插件的方式集成到他们的应用中,比如AnythingLLM。 接下来,我需要思考AnythingLLM是否支持本地AI API的集成。根据之前的回答,AnythingLLM本身支持多种数据源和集成,但插件生态还不成熟。可能需要通过其他方法,比如内置功能、第三方工具或脚本。 用户可能需要具体的解决方案,比如如何配置AnythingLLM使用本地模型,或者有哪些现有的插件或工具可以实现这一点。例如,Ollama作为本地运行大模型的工具,可能是一个选项。另外,像LM Studio或FastAPI自定义服务也可能被提及。 另外,用户可能关心这些插件的易用性、是否需要编程知识,以及安全性等问题。需要给出不同的方法,比如使用现成工具、自行封装API、或者通过中间件连接。 还需要考虑不同操作系统的兼容性,比如Windows、Mac或Linux下的解决方案是否有差异。此外,社区资源如GitHub项目或Discord群组可能有现成的插件或脚本,可以推荐用户去查找。 总结下来,回答需要涵盖以下几个部分: 1. 本地AI API插件的常见类型,如Ollama、LM Studio等。 2. AnythingLLM的内置支持,如本地模型配置。 3. 第三方工具和中间件,如LocalAI、LangChain。 4. 自行搭建API的方法,如使用FastAPI。 5. 社区资源和注意事项,比如安全性、性能优化。 需要确保信息准确,特别是关于AnythingLLM是否支持本地模型API的配置。可能需要查阅最新文档确认,但根据之前的知识,AnythingLLM允许选择不同的LLM提供商,包括本地部署的模型。 最后,回答要结构清晰,分点说明,便于用户理解和选择适合的方案。同时提醒用户关注官方更新和社区资源,以获取最新信息。</think>以下是关于调用本地AI的API插件的详细介绍和解决方案,适用于在本地环境中部署和使用AI模型(如LLaMA、ChatGLM、Alpaca等),并通过插件或工具集成到应用(如AnythingLLM)中的场景: --- ### **1. 本地AI API插件的常见类型** #### **(1) Ollama** - **定位**:开源工具,支持在本地运行和调用语言模型(如Llama 3、Mistral等)。 - **功能**: - 一键部署本地模型,提供类OpenAI的API接口。 - 支持通过 `http://localhost:11434` 直接调用。 - **适用场景**:快速将本地模型接入AnythingLLM、Chatbot等工具。 - **使用方法**: ```bash # 安装并运行模型 ollama run llama3 # 调用API curl http://localhost:11434/api/generate -d '{"model": "llama3", "prompt":"你好"}' ``` #### **(2) LM Studio** - **定位**:桌面端工具,支持本地运行开源模型并提供API。 - **优势**: - 图形化界面操作简单,支持Windows/Mac。 - 提供OpenAI兼容的API端点(`http://localhost:1234/v1`)。 - **集成示例**:在AnythingLLM中选择 "OpenAI" 模型,将API地址指向 `localhost:1234`。 #### **(3) LocalAI** - **定位**:开源替代方案,可本地部署多种模型(包括图像生成、语音转文本等)。 - **特点**: - 完全兼容OpenAI API格式。 - 支持加载GGUF、GGML等模型格式。 - **GitHub**:https://github.com/go-skynet/LocalAI --- ### **2. AnythingLLM 的内置支持** 在AnythingLLM中直接调用本地AI API: 1. **配置步骤**: - 进入工作区设置 → 选择 "Custom LLM"。 - 填写API地址(如 `http://localhost:11434/v1`)。 - 设置模型名称(需与本地部署的模型标识一致)。 2. **注意事项**: - 确保模型格式与API兼容(推荐使用Ollama或LocalAI)。 - 显存不足时需量化模型(如选择Llama-3-8B的4-bit版本)。 --- ### **3. 第三方中间件工具** #### **(1) **LangChain** - **功能**:通过Python脚本桥接本地模型与应用程序。 - **示例代码**: ```python from langchain_community.llms import Ollama llm = Ollama(base_url="http://localhost:11434", model="llama3") response = llm.invoke("如何做蛋炒饭?") ``` #### **(2) **FastAPI自定义接口** - **适用场景**:为特定模型封装标准化API。 - **实现步骤**: 1. 使用FastAPI编写接口。 2. 调用本地模型库(如llama.cpp、ExLlama)。 3. 暴露为HTTP服务供AnythingLLM调用。 --- ### **4. 社区开源插件** - **案例参考**: - **AnythingLLM-LocalAI-Plugin**:GitHub用户开发的适配插件(需手动加载)。 - **Ollama-AnythingLLM-Bridge**:通过中间层转换API请求格式。 - **获取方式**:在GitHub搜索关键词 `AnythingLLM local plugin`。 --- ### **5. 注意事项** 1. **硬件要求**: - 7B模型需至少8GB显存,13B模型推荐16GB以上。 - CPU推理需依赖量化模型(如GGUF格式)。 2. **安全性**: - 本地API建议绑定 `127.0.0.1`,避免暴露到公网。 - 使用Nginx配置反向代理时可增加身份验证。 3. **性能优化**: - 启用GPU加速(CUDA/Metal)。 - 调整上下文长度限制(如 `-c 4096`)。 --- ### **推荐方案** 1. **快速入门**:Ollama + AnythingLLM内置Custom LLM。 2. **多模型管理**:LocalAI + 自定义插件。 3. **企业级部署**:FastAPI封装模型 + Docker容器化。 可通过AnythingLLM官方文档的 **Local Model Setup** 章节获取详细配置指南,或加入其Discord社区的 `#self-hosted` 频道讨论技术细节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ㄣ知冷煖★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值