智谱AI——智能体开发探索

智谱AI——智能体开发探索

智谱·AI开放平台:https://open.bigmodel.cn/

点击网页右上角“开发工作台”。进入工作台后,可点击进入“文档中心”。

文档中心/接口文档:https://open.bigmodel.cn/dev/api

使用指南:https://open.bigmodel.cn/dev/howuse/introduction

接口文档-开发指南探索

开发指南中,提供了三种指南:

SDK开发

提供的SDK包括Python SDK和Java SDK。

什么是SDK?

SDK,软件开发工具包(Software Development Kit),是一组代码、库、文档和示例代码,用于帮助开发者创建应用程序或软件产品。

SDK 的主要组成部分:

  • 工具:包括编译器、调试器、构建工具等,这些工具帮助开发者编写、编译和调试代码。
  • 库:预先编写的代码库或框架,可以直接调用以实现某些功能,而无需从头开始编写代码。
  • 文档:详细的文档和指南,解释如何使用 SDK 中的各种工具和库。
  • 示例代码:提供一些示例代码,帮助开发者快速上手,了解如何实现某些功能。
  • API:应用编程接口,定义了与操作系统、服务或其他软件进行交互的方式。

举例:

Android SDK是一种移动应用开发SDK。包含内容:Android Studio、Android API 库、调试工具、模拟器、文档、示例代码。

SDK ≠ (python)第三方库。(python)第三方库可以看作是SDK的一部分;第三方库可以独立存在,不依赖SDK(比如不需要特定的开发工具就可以使用。eg. python的第三方库的使用不需要使用指定的集成开发环境);一个SDK可以有多个第三方库。

SDK用户鉴权

SDK用户鉴权是确保只有经过授权的用户或应用程序可以访问SDK提供的功能和资源的关键机制。

在开发工作台可以查看自己的API key,并将其复制到代码中:

client = ZhipuAI(api_key="......") # 请填写您自己的APIKey
代码示例

智谱平台提供了三种调用方式:同步调用、异步调用和流式调用。调用方式取决于具体模型的支持情况。

观察这三种调用方法的代码,它们的不同之处主要在于为response赋值的函数不同:

  • 同步调用、流式调用使用的函数是client.chat.completions.create,其中流式调用在函数中使用额外的参数stream
  • 异步调用使用的函数是client.chat.asyncCompletions.create

具体内容见下文。

同步调用

调用后即可一次性获得最终结果。

代码:

from zhipuai import ZhipuAI
client = ZhipuAI(api_key="......") # 填写您自己的APIKey
response = client.chat.completions.create(model="glm-4",  # 填写需要调用的模型名称messages=[{"role": "user", "content": "作为一名营销专家,请为我的产品创作一个吸引人的slogan"},{"role": "assistant", "content": "当然,为了创作一个吸引人的slogan,请告诉我一些关于您产品的信息"},{"role": "user", "content": "智谱AI开放平台"},{"role": "assistant", "content": "智启未来,谱绘无限一智谱AI,让创新触手可及!"},{"role": "user", "content": "创造一个更精准、吸引人的slogan"}],
)
print(response.choices[0].message)

输出:

CompletionMessage(content='"精准洞察,智谱未来 —— 携手共绘智能新篇章。"', role='assistant', tool_calls=None)

如果在代码的messages列表中只保留一个字典的内容,即只向模型输入“作为一名营销专家,请为我的产品创作一个吸引人的slogan”,模型的回答会类似这样:“当然可以!不过我需要先了解一些关于您产品的信息,比如产品类型、特点、目标受众等。这样我才能为您创作一个更贴切、更有吸引力的slogan。请您提供一下相关信息,我会尽快为您想出一个满意的slogan。”也就是说,在messages列表中多提供user和assistant几个回合的对话信息有机会生成更符合期望的回答(直接在第一个字典的内容中就给出产品的名称,模型也能够提供答案)。

异步调用

调用后会立即返回一个任务ID,然后用任务ID查询调用结果(根据模型和参数的不同,通常需要等待10-30秒才能得到最终结果)。

代码:

from zhipuai import ZhipuAI
client = ZhipuAI(api_key="......") # 请填写您自己的APIKey
response = client.chat.asyncCompletions.create(model="glm-4",  # 填写需要调用的模型名称messages=[{"role": "user","content": "请你作为童话故事大王,写一篇短篇童话故事,故事的主题是要永远保持一颗善良的心,要能够激发儿童的学习兴趣和想象力,同时也能够帮助儿童更好地理解和接受故事中所蕴含的道理和价值观。"}],
)
print(response)

如果运行上面的代码,只会输出如下所示任务ID,还不能得到最终的输出。

输出:

AsyncTaskStatus(id='xxxxx', request_id='xxxxx', model='glm-4', task_status='PROCESSING')

使用任务ID查询接口才能获取结果(如下所示),更多内容可见文档关于GLM-4的内容。

代码:

from zhipuai import ZhipuAI
import timeclient = ZhipuAI(api_key="......") # 请填写您自己的APIKey
response = client.chat.asyncCompletions.create(model="glm-4",  # 填写需要调用的模型名称messages=[{"role": "user","content": "请你作为童话故事大王,写一篇短篇童话故事,故事的主题是要永远保持一颗善良的心,要能够激发儿童的学习兴趣和想象力,同时也能够帮助儿童更好地理解和接受故事中所蕴含的道理和价值观。"}],
)
print(response)
# 异步查询需要使用任务ID查询接口获取结果
task_id = response.id
task_status = ''
get_cnt = 0while task_status != 'SUCCESS' and task_status != 'FAILED' and get_cnt <= 40: # 任务状态为PROCESSINGresult_response = client.chat.asyncCompletions.retrieve_completion_result(id=task_id)print(result_response)task_status = result_response.task_statustime.sleep(2)get_cnt += 1

输出:

AsyncTaskStatus(id='xxxxx', request_id='xxxxx', model='glm-4', task_status='PROCESSING')
...(为了节省篇幅,此处略去几行,内容与第一行一样)
AsyncCompletion(id='xxxxx', request_id='xxxxx', model='GLM-4', task_status='SUCCESS', choices=[CompletionChoice(index=0, finish_reason='stop', message=CompletionMessage(content='从前,有个名叫小明的男孩,...(为了节省篇幅,此处略去生成文本的其余内容)', role='assistant', tool_calls=None))], usage=CompletionUsage(prompt_tokens=50, completion_tokens=475, total_tokens=525), created=xxx)

SSE调用

调用后可以流式的实时获取到结果直到结束。

代码:

from zhipuai import ZhipuAI
client = ZhipuAI(api_key="......") # 请填写您自己的APIKey
response = client.chat.completions.create(model="glm-4",  # 填写需要调用的模型名称messages=[{"role": "user", "content": "你好!你叫什么名字"},],stream=True,
)
for chunk in response:print(chunk.choices[0].delta)

输出:

ChoiceDelta(content='你好', role='assistant', tool_calls=None)
ChoiceDelta(content='!', role='assistant', tool_calls=None)
ChoiceDelta(content='我是一个', role='assistant', tool_calls=None)
ChoiceDelta(content='人工智能', role='assistant', tool_calls=None)
ChoiceDelta(content='助手', role='assistant', tool_calls=None)
ChoiceDelta(content=',', role='assistant', tool_calls=None)
ChoiceDelta(content='名叫', role='assistant', tool_calls=None)
ChoiceDelta(content='智', role='assistant', tool_calls=None)
ChoiceDelta(content='谱', role='assistant', tool_calls=None)
ChoiceDelta(content='清', role='assistant', tool_calls=None)
ChoiceDelta(content='言', role='assistant', tool_calls=None)
ChoiceDelta(content='。', role='assistant', tool_calls=None)
ChoiceDelta(content='很高兴', role='assistant', tool_calls=None)
ChoiceDelta(content='见到', role='assistant', tool_calls=None)
ChoiceDelta(content='你', role='assistant', tool_calls=None)
ChoiceDelta(content=',', role='assistant', tool_calls=None)
ChoiceDelta(content='并', role='assistant', tool_calls=None)
ChoiceDelta(content='随时', role='assistant', tool_calls=None)
ChoiceDelta(content='准备', role='assistant', tool_calls=None)
ChoiceDelta(content='回答', role='assistant', tool_calls=None)
ChoiceDelta(content='你的', role='assistant', tool_calls=None)
ChoiceDelta(content='问题和', role='assistant', tool_calls=None)
ChoiceDelta(content='提供', role='assistant', tool_calls=None)
ChoiceDelta(content='帮助', role='assistant', tool_calls=None)
ChoiceDelta(content='。', role='assistant', tool_calls=None)
ChoiceDelta(content='有什么', role='assistant', tool_calls=None)
ChoiceDelta(content='我可以', role='assistant', tool_calls=None)
ChoiceDelta(content='协助', role='assistant', tool_calls=None)
ChoiceDelta(content='你的', role='assistant', tool_calls=None)
ChoiceDelta(content='吗', role='assistant', tool_calls=None)
ChoiceDelta(content='?', role='assistant', tool_calls=None)
ChoiceDelta(content='', role='assistant', tool_calls=None)

HTTP调用

暂时还没探索。

第三方框架

文档提供了两个第三方框架的示例:OpenAI SDK和Langchain SDK。

OpenAI SDK

在OpenAI SDK中调用智谱AI平台中的模型(如GLM-4)与使用智谱AI的SDK调用本平台模型的代码十分相像,只是client.chat.completions.createclientZhipuAI对象变成了OpenAI对象。

代码:

from openai import OpenAI client = OpenAI(api_key="......", # 在智谱AI平台的api keybase_url="https://open.bigmodel.cn/api/paas/v4/"
) completion = client.chat.completions.create(model="glm-4",  messages=[    {"role": "system", "content": "你是一个聪明且富有创造力的小说作家"},    {"role": "user", "content": "请你作为童话故事大王,写一篇短篇童话故事,故事的主题是要永远保持一颗善良的心,要能够激发儿童的学习兴趣和想象力,同时也能够帮助儿童更好地理解和接受故事中所蕴含的道理和价值观。"} ],top_p=0.7,temperature=0.9) print(completion.choices[0].message)
Langchain SDK

在这个框架下调用智谱AI平台中的模型(如GLM-4)似乎比使用OpenAI框架要复杂一些。这个框架可以使用Langchain的ChatOpenAI类来调用模型,也可以使用Langchain的AgentExecutor类来调用模型。

这两种类的区别跟Langchain对智能体工作流的定义有关。

使用ChatOpenAI类调用

使用ChatOpenAI类调用模型时,只需要定义llm(一个ChatOpenAI对象,用参数model指明调用哪个模型)和prompt(一个ChatPromptTemplate对象)。这种调用方式与前面使用OpenAI SDK和Zhipu SDK的方式都比较相像,都需要定义模型和输入的提示内容。

文档中提供的代码只展示了如何使用ChatOpenAI类调用GLM-4模型,该代码运行后的输出如下:

> Entering new LLMChain chain...
Prompt after formatting:
System: You are a nice chatbot having a conversation with a human.
Human: tell me a joke> Finished chain.

输出中并不包含我们期望的回答。如果想要进一步获取回答,应该需要查看Langchain SDK的相关用法,此处暂不做探究。

使用Langchain的AgentExecutor类调用

使用AgentExecutor类调用模型时,不仅需要定义llmprompt,还需要定义tools。它们之间的关系可以参考文章《Langchain知识点(下)》中的描述。

文档提供的相关代码提到了os.environ["TAVILY_API_KEY"],这里应该是涉及到了另外一个平台tavily(一个为人工智能智能体(如大型语言模型,LLMs)和检索增强生成(RAG)应用优化的搜索引擎,旨在提供高效、快速且持久的搜索结果。更详细的内容可以参考文章《【AI】Tavily》),暂不做探究(个人暂时也没有这个平台的API key)。

在运行代码时,可以设置tools为空列表,表示不使用工具、不需要联网搜索信息、仅使用模型本身的知识来回答问题。

可以使用try子句处理agent_executor.invoke可能抛出的异常。

代码:

import os
from langchain_openai import ChatOpenAI
from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent
from langchain_community.tools.tavily_search import TavilySearchResultsfrom langchain_community.llms import OpenAIllm = ChatOpenAI( # Langchain的ChatOpenAI类是对OpenAI SDK的封装temperature=0.95,model="glm-4",openai_api_key="......", # 智谱AI的API keyopenai_api_base="https://open.bigmodel.cn/api/paas/v4/"
)# os.environ["TAVILY_API_KEY"] = "......" # tavily的API key
# tools = [TavilySearchResults(max_results=2)]
tools = []
prompt = hub.pull("hwchase17/react")# Choose the LLM to use
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke({"input": "what is langchain?"})
# try:
#     agent_executor.invoke({"input": "what is langchain?"})
# except ValueError:
#     print(ValueError)

输出(不使用联网搜索功能的情况下):

> Entering new AgentExecutor chain...
This question seems to be about a concept, and I don't know what "langchain" is. I should search for it online to get more information.Action: search online
Action Input: langchain
Observationsearch online is not a valid tool, try one of [].Since the search online action is not available, I will attempt to answer the question based on my existing knowledge. However, I must admit that I am not familiar with the term "langchain." It is possible that it is a specialized concept in a specific field or a new term that has not gained widespread recognition yet. Final Answer: I am not sure what "langchain" is. It may be a specialized term or a new concept that I am not familiar with. If it is related to a specific field or context, more information would be needed to provide an accurate answer.> Finished chain.

langchain SDK的输出结构与前面几种的不同,有Action、Action Input、Observation(、Thought,一些情况下会有,自己暂时还不能明确地知道什么情况有)和Final Answer几个部分。这是比较有意思的地方,有点像chain of thought的形式,有待需要时探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2组件封装实战系列目录

写在前面 本系列教程是vue2的一套技术文章&#xff0c;参考的对象是曾经极为辉煌的elementui组件库&#xff0c;虽然现在已经都开始使用vue3了&#xff0c;但是研究这套组件库&#xff0c;对于提升我们的封装思维还是有很大作用的&#xff01;&#xff01;所以活不多少&#x…

OutOfDirectMemoryError堆外内存溢出Bug解决

问题描述&#xff1a; springboot 2.0&#xff0c;整合redis实现缓存&#xff0c;当并发请求上来达到一定量级&#xff0c;会导致系统爆发该异常。 产生原因&#xff1a; 1.springboot 2.0以后默认使用lettuce作为操作redis的客户端&#xff0c;lettuce使用netty进行网络通讯…

【开源】医院电子病历管理系统 SSM+JSP+MySQL

目录 一、项目介绍 科室模块 医生模块 预约挂号模块 就诊记录模块 就诊评价模块 二、项目界面 三、核心代码 一、项目介绍 经典老框架SSM打造入门项目《医院电子病历管理系统》&#xff0c;分为用户网页和管理后台&#xff0c;包括科室模块、医生模块、预约挂号模块、…

[MQTT]服务器EMQX搭建SSL/TLS连接过程(wss://)

&#x1f449;原文阅读 &#x1f4a1;章前提示 本文采用8084端口进行连接&#xff0c;是EMQX 默认提供了四个常用的监听器之一&#xff0c;如果需要添加其他类型的监听器&#xff0c;可参考官方文档&#x1f517;管理 | EMQX 文档。 本文使用自签名CA&#xff0c;需要提前在L…

【Redis】构建强韧的远程Redis连接与端口保障机制完美指南

【Redis】构建强韧的远程Redis连接与端口保障机制完美指南 大家好 我是寸铁&#x1f44a; 总结了【Redis】构建强韧的远程Redis连接与端口保障机制完美指南✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 在当今的软件开发领域中&#xff0c;远程访问和操作数据存储是极为常见…

华为OD刷题C卷 - 每日刷题 17(字符串序列判定,最长的指定瑕疵度的元音子串)

1、&#xff08;字符串序列判定&#xff09;&#xff1a; 这段代码是解决“字符串序列判定”的问题。它提供了一个Java类Main&#xff0c;其中包含main方法和getResult方法&#xff0c;用于判断字符串S是否是字符串L的有效子串。 main方法首先读取两个字符串S和L&#xff0c;…

分布式锁与信号量详解

一、引言 在分布式系统中&#xff0c;数据的一致性和并发控制是两大核心挑战。分布式锁和信号量作为解决这些问题的关键工具&#xff0c;被广泛应用于各种分布式场景中。本文将对分布式锁和信号量的概念、原理、实现方式以及应用场景进行详细介绍&#xff0c;并通过具体的代码…

STM32项目分享:智能家居安防系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

Decimal要从str转换以避免精度问题

最近遇到一个python的小数的问题&#xff0c;本来应该很简单的小于判断&#xff0c;无论如何都不正确&#xff0c;而且浮点小数都没问题&#xff0c;但decimal小数有问题&#xff0c;给我整蒙了&#xff0c;后来才发现是对decimal不了解所致&#xff0c;如果你还用float转decim…

翻转二叉树-力扣

翻转二叉树&#xff0c;通过前序遍历的顺序&#xff0c;从根节点开始&#xff0c;将节点的左右子节点一次进行交换即可。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), …

Flowable项目启动报错#java.time.LocalDateTime cannot be cast to java.lang.String

Flowable 项目启动后报错 flow项目第一次启动创建表成功&#xff0c;但是第二次启动时报错信息如下&#xff1a; 1、Error creating bean with name ‘appRepositoryServiceBean’ defined in class 2、Error creating bean with name ‘flowableAppEngine’: FactoryBean t…

立创小tips

立创小tips 原理图中 1-修改图纸属性 保存完&#xff0c;绘制原理图的界面就出现了&#xff0c;然后我们鼠标点击原理图的边缘变成红色就可以高边表格的属性了。 2-鼠标右键可以移动整个原理图 3-查看封装 点击任意一个元器件&#xff0c;在右侧就会显示封装属性&#xff…

基于fabric封装一个简单的图片编辑器(vue 篇)

介绍 前言vue demo版本react 版本 前言 对 fabric.js 进行二次封装&#xff0c;实现图片编辑器的核心功能。核心代码 不依赖 ui响应式框架vue ,react 都适用。 只写了核心编辑相关代码便于大家后续白嫖二次开发 核心代码我就没有打包发布 会 和 业务代码一起放到项目中。 vu…

socket通信(C语言+Python)

在socket文件夹下创建server.c和client.c。 服务端代码&#xff08;server.c&#xff09;&#xff1a; #include <stdio.h> #include <Winsock2.h> void main() {WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested MAKEWORD( 1, 1 );err WSAS…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于日间-日内不确定集的中长期电源扩展规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

简说SQLServer

SQLServer是Microsoft公司推出的一种关系型数据库系统&#xff0c;下面将对其进行详细的解析&#xff0c;包括其主要特性、功能、版本介绍等方面&#xff1a; 一、主要特性 高性能设计&#xff1a;SQLServer充分利用WindowsNT的优势&#xff0c;提供高性能的数据库操作。系统…

SpringBoot整合RabbitMQ (持续更新中)

RabbitMQ 官网地址&#xff1a;RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ 与 Erlang 版本兼容关系​ 3.13.0 26.0 26.2.x The 3.13 release series is compatible with Erlang 26. OpenSSL 3 support in Erlang is considered to be mature and ready for…

kafka-重试和死信主题(SpringBoot整合Kafka)

文章目录 1、重试和死信主题2、死信队列3、代码演示3.1、appication.yml3.2、引入spring-kafka依赖3.3、创建SpringBoot启动类3.4、创建生产者发送消息3.5、创建消费者消费消息 1、重试和死信主题 kafka默认支持重试和死信主题 重试主题&#xff1a;当消费者消费消息异常时&…

数据结构(C语言)之对归并排序的介绍与理解

目录 一归并排序介绍&#xff1a; 二归并排序递归版本&#xff1a; 2.1递归思路&#xff1a; 2.2递归代码实现&#xff1a; 三归并排序非递归版本&#xff1a; 3.1非递归思路&#xff1a; 3.2非递归代码实现&#xff1a; 四归并排序性能分析&#xff1a; 欢迎大佬&#…

【CS.AI】GPT-4o:重新定义人工智能的新标杆

文章目录 1 序言2 GPT-4o的技术亮点3 GPT-4o与前代版本的对比3.1 热门AI模型对比表格GPT-3.5GPT-4GPT-4oBERTT5 3.2 其他 4 个人体验与感受5 结论 1 序言 嘿&#xff0c;大家好&#xff01;今天要聊聊一个超级酷的AI新突破——GPT-4o&#xff01;最近&#xff0c;OpenAI发布了…