百川大模型AI对话实战——Python开发一个对话机器人

百川大模型开放提供API体验中心,体验不错,有小伙伴也对搭建自己的对话机器人比较兴趣,今天通过Python来简单介绍下,如何调用百川大模型的API来构建自己的小产品。
在这里插入图片描述

在开发环境中安装Python,如何安装?参照网络资料,这里假设已经有正常的Python环境。

import requests# API 请求 URL
url = "https://api.baichuan-ai.com/v1/chat/completions"# 请求头部参数
headers = {"Content-Type": "application/json","Authorization": "Bearer sk-333333333"  # 替换为实际的 API Key
}# 请求体参数
data = {"model": "Baichuan2-Turbo","messages": [{"role": "user","content": "你好,"}
#        {
#            "role": "assistant",
#            "content": "你好!有什么我可以帮助你的吗?"
#        }# 添加更多对话消息...],"stream": True,  # 是否使用流式接口"temperature": 0.3,"top_p": 0.85,"top_k": 5,"with_search_enhance": False# 添加其他参数...
}# 发送 POST 请求
response = requests.post(url, headers=headers, json=data)# 输出响应内容
print(response.text)

执行上述代码,结果如下:

hogworts@hogworts baichuan % python3 chat.py 
data: {"id":"chatcmpl-M233b00CLE3goFd","object":"chat.completion.chunk","created":1703138623,"model":"Baichuan2-Turbo","choices":[{"index":0,"delta":{"role":"assistant","content":"你好"}}]}data: {"id":"chatcmpl-M233b00CLE3goFd","object":"chat.completion.chunk","created":1703138623,"model":"Baichuan2-Turbo","choices":[{"index":0,"delta":{"role":"assistant","content":"!有什么我可以帮助"}}]}data: {"id":"chatcmpl-M233b00CLE3goFd","object":"chat.completion.chunk","created":1703138623,"model":"Baichuan2-Turbo","choices":[{"index":0,"delta":{"role":"assistant","content":"你的吗?"},"finish_reason":"stop"}],"usage":{"prompt_tokens":4,"completion_tokens":9,"total_tokens":13}}data: [DONE]

1. 样式不够美观,能不能将输出的结果进行JSON格式,方便阅读?
2. 上述只能进行一次对话,使用体验很不好,能不能做成连续对话的模式?

下面重构为连续对话的模式。

import subprocess
import requests
import json# API 请求 URL
url = "https://api.baichuan-ai.com/v1/chat/completions"# 替换为实际的 API Key
api_key = "sk-33333333"# 请求头部参数
headers = {"Content-Type": "application/json","Authorization":f"Bearer {api_key}"
}# 持续对话循环
while True:# 用户输入user_input = input("用户: ")# 如果用户输入为空,则退出循环if not user_input:break# 构建对话消息messages = [{"role": "user", "content": user_input}# 如果有历史消息,可以继续添加]# 请求体参数data = {"model": "Baichuan2-Turbo","messages": messages,"stream": False,"temperature": 0.3,"top_p": 0.85,"top_k": 5,"with_search_enhance": False# 添加其他参数...}# 发送 POST 请求response = requests.post(url, headers=headers, json=data)# 处理响应if response.status_code == 200:# 使用 jq 美化 JSON 输出result = json.loads(response.text)formatted_result = subprocess.run(['jq', '.'], input=json.dumps(result), text=True, capture_output=True)# 输出助手的回复print(f"助手: {formatted_result.stdout}")else:print(f"请求失败,状态码: {response.status_code}")# 用户输入为空,退出循环
print("对话结束。")

执行程序,返回结果如下

hogworts@hogworts baichuan % python3 chat-json.py 
用户: hi guys
助手: {"id": "chatcmpl-M8c0000CLE7to5U","object": "chat.completion","created": 1703138875,"model": "Baichuan2-Turbo","choices": [{"index": 0,"message": {"role": "assistant","content": "Hi!"},"finish_reason": "stop"}],"usage": {"prompt_tokens": 4,"completion_tokens": 3,"total_tokens": 7}
}用户: where are you going
助手: {"id": "chatcmpl-M400600CLE88o2H","object": "chat.completion","created": 1703138888,"model": "Baichuan2-Turbo","choices": [{"index": 0,"message": {"role": "assistant","content": "我暂时不能离开这个平台,但我可以帮助您回答各种问题、提供信息或执行一些任务。如果您有任何问题,请随时提问。"},"finish_reason": "stop"}],"usage": {"prompt_tokens": 6,"completion_tokens": 29,"total_tokens": 35}
}

问题:单个API_KEY,往往会有并发量的限制,这在面对大量用户使用时,很容易受到接口请求的限制。

重构一下,支持多个Key进行轮询,就可以更多的响应用户请求。
在这里插入图片描述
注意:API_KEY在生成后,直接脱敏显示,在很多平台都是这样的规则,所以,谨慎保管你的KEY,否则就算是你自己生的,你也没法找回来。

import aiohttp
import asyncio
import random
import subprocess
import json# 替换为你的多个 API Key
api_keys = ["sk-222", "sk-333", "sk-44", "sk-555", "sk-666"]# API 请求 URL
url = "https://api.baichuan-ai.com/v1/chat/completions"# 请求体参数
data = {"model": "Baichuan2-Turbo","messages": [],"stream": False,"temperature": 0.3,"top_p": 0.85,"top_k": 5,"with_search_enhance": False# 添加其他参数...
}# 异步发送请求的函数
async def send_request(api_key, user_input):headers = {"Content-Type": "application/json","Authorization": f"Bearer {api_key}"}# 添加用户输入到 messages 中data["messages"].append({"role": "user", "content": user_input})async with aiohttp.ClientSession() as session:async with session.post(url, headers=headers, json=data) as response:if response.status == 200:result = await response.json()choices = result.get("choices", [])return choiceselse:print(f"API Key: {api_key}, 请求失败,状态码: {response.status}")return None# 异步主函数
async def main():while True:# 接受用户输入user_input = input("用户: ")# 如果用户输入为空,则退出循环if not user_input:break# 随机选择一个 API Keyselected_api_key = random.choice(api_keys)# 使用异步发送请求choices = await send_request(selected_api_key, user_input)# 处理请求的结果if choices:
#	    json_result = json.loads(choices)
#	    formatted_result = subprocess.run(['jq', '.'], input=json.dumps(json_result), text=True, capture_output=True)print(f"API Key: {selected_api_key}, Choices: {choices}")# 使用 jq 美化 JSON 输出#result = json.loads(choices)#formatted_result = subprocess.run(['jq', '.'], input=json.dumps(result), text=True, capture_output=True)# 输出助手的回复#print(f"API Key: {selected_api_key}, Choices: {formatted_result.stdout}")else:print(f"API Key: {selected_api_key}, 请求失败")# 清空 messages,准备下一轮聊天data["messages"] = []# Run the event loop
if __name__ == "__main__":asyncio.run(main())

上面会涉及到很多Python常见的组件库,比如requests,json,subprocess,aiohttp等等,都是应对特殊功能,必须的安装包,只需要通过pip命令安装即可,否则无法正常使用。

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

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

相关文章

AI“百模大战”现状:向垂直、B端谋场景,算力仍是主要制约因素

文章目录 每日一句正能量前言AI(人工智能)大模型正“飞入”百姓家和行业中。向垂直、B端谋场景算力仍是主要制约因素构建“数据-模型-应用”飞轮后记 每日一句正能量 我们必须在失败中寻找胜利,在绝望中寻求希望。 前言 在当前快速发展的人工…

SecureCRT连接vmware虚拟机的centos系统配置

软件版本:VMware10.0.3,centos 7,securecrt 8.7.2 1,虚拟网络编辑器选择桥接模式, 2,如果不小心删除网络,centos关机状态下,选择恢复默认设置。 3,进入linux系统&#…

革命性突破:Great River推出XL高速ARINC 818传感器测试卡

Great River Technology荣幸地宣布,与RVS(远程视觉系统)2.0平台合作推出的XL高速ARINC 818传感器测试卡正式亮相。这款开创性的测试卡在柯林斯航空电子公司(RTX业务部)和波音公司开发和测试RVS 2.0系统中发挥了重要作用…

牛客小白月赛84——k级序列(超级无敌详解)(贪心)

前言: 这b题费了我一身牛劲,结果还是没有做出来,晚上请教大佬后,知晓方法,才将其ac,于是决心务必再次使用传说中的费曼学习法,并与大家分享一下这道题目。 题目: 登录—专业IT笔试…

09.list 容器

9、list 容器 功能: 将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成: 链表由一系列结点组成 结点的组成: 一个是存…

Zabbix6 使用Agent2实现证书监控的详细步骤

目标 我们的目标是通过获取网站的证书信息来实现网站证书监控。 使用agent2的key 只需使用其中的key,就能实现我们的目标功能。然而,由于它返回的是json格式的数据,我们需要根据数据来配置监控项目(item)和触发器&am…

六西格玛的科技漩涡——张驰咨询如何促成企业变革

在管理的海洋里,六西格玛管理是一艘稳健的航船,在质量管理的汪洋中乘风破浪,尽管质疑之声像远处的风暴不断逼近,但张驰咨询公司依靠这艘航船坚持初心,驭风而行。 20载耕耘,张驰咨询不仅仅是培养了超过8000…

IP地址子网划分案例

网络工程师基本功,每人必会的IP地址划分案例。 要求: 一段C类地址192.168.1.0/24,请你将地址分给网络中的主机,要求至少有5个子网,每个子网至少有20台主机。 步骤: 1、要求5个子网,要向主机…

Jenkins自动化部署-配置ssh代码拉去方式的密钥(公私钥)

Jenkins想要通过ssh方式拉去gitlab代码,则需要在在Jenkins服务器配置私钥,gitlab服务器配置公钥 使用root用户生成公钥和私钥 ssh-keygen -t rsa在/root/.ssh/目录保存了公钥和使用 id_rsa:私钥文件 id_rsa.pub:公钥文件 把生…

BDD - Python Behave VS Code 插件 Behave VSC

BDD - Python Behave VS Code 插件 Behave VSC 引言Behave VSC 插件Behave VSC 安装Behave VSC 注意事项Behave VSC 插件默认可识别的项目结构Behave VSC 设置识别非 features 文件名的项目 引言 上一篇《BDD - Python Behave 入门》介绍了 Behave 的入门基础知识,…

IP应用场景的规划

IP地址作为互联网通信的基石,在现代社会中扮演着至关重要的角色。本文将深入探讨IP地址在不同应用场景中的规划与拓展,探讨其在网络通信、安全、商业、医疗和智能城市等领域的关键作用与未来发展趋势。 IP地址的基本原理 IP地址是分配给网络上设备的数…

python画图【00】Anaconda和Pycharm和jupyter的使用

①Anaconda ②Pycharm 一、Anaconda安装步骤 1、双击安装包,点击next。 2、点我同意I agree 3、 4、选择需要安装的位置,位置可根据自己情况安装到具体位置,但要记住安装到了哪里。然后点击next 5、可选择加入到环境变量,…

深入了解 Android 中的应用程序签名

深入了解 Android 中的应用程序签名 一、应用程序签名介绍1.1 应用程序签名1.2 应用程序签名的意义1.3 应用程序签名的流程1.4 应用程序签名的方案1.5 签名的重要性和应用场景 二、AOSP 的应用签名2.1 AOSP的应用签名文件路径2.2 应用程序指定签名文件 三、Android Studio 的应…

基于电商场景的高并发RocketMQ实战-NameServer内核原理剖析、Broker 主从架构与集群模式原理分析

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…

自动生成数控加工的轨迹刀具轨迹阿基米德螺旋线(3D)

文章目录 1. 阿基米德螺旋线2. 生成步骤目标: 基于点云自动生成阿基米德螺旋线轨迹点 针对的是半球形模型效果 1. 阿基米德螺旋线 阿基米德螺旋线(Archimedean spiral)是一种数学曲线,由古希腊数学家阿基米德(Archimedes)在公元前225年左右首次研究和描述。这条曲线的方…

Ignite内存配置

配置内存 #1.内存架构 #1.1.概述 Ignite内存架构通过可以同时在内存和磁盘上存储和处理数据及索引,得到了支持磁盘持久化的内存级性能。 多层存储的运行方式类似于操作系统(例如Linux)的虚拟内存。但是这两种类型架构之间的主要区别是&…

zustand 搞定 react 中复杂状态管理

Zustand 是一个轻量级的、无依赖的状态库,适用于 React 和函数式编程。它提供了一个简单、灵活的方式来管理应用程序的状态。本文就讲讲如何使用 zustand 搞定 react 中复杂状态管理,进而替代 redux 。 一、前言 以 redux 为代表的这类单向数据流状态管…

化繁为简,Python快速入门,从基础到实践的学习。

文章目录 前言一、安装与运行命令行运行 python 文件 二、变量和简单数据类型2.1 变量命名规则2.2 字符串2.2.1 字符串的简单运算title()upper()、lower() 2.2.2 合并(拼接)字符串2.2.3 使用制表符或换行符来添加空白2.2.4 删除空白2.2.5 Python 2 中的 …

Pixelmator Pro 中文

Pixelmator Pro是一款专为Mac用户设计的强大图像编辑软件。它提供了丰富的功能和直观的界面,使用户可以轻松进行各种图像处理任务。该软件支持各种文件格式,包括JPEG、PNG、GIF、BMP和TIFF等,并可导入Photoshop的psd文件。它提供了丰富的绘画…

C/C++ 外部链接的静态变量 static和extern的应用

外部链接的静态变量具有文件作用域、外部链接和静态存储期。该类别有时称为外部存储类别(external storage class),属于该类别的变量称为外部变量(external variable)。把变量的定义性声明放在所有函数的外面便创建了外部变量。当然,为了指出…