百川大模型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,一经查实,立即删除!

相关文章

Vue:defineAsyncComponent(异步组件)、component(动态组件)、keep-alive(缓存组件)

异步组件:defineAsyncComponent Vue3 的 defineAsyncComponent 特性可以让我们延迟加载组件。因为在默认情况下,在构建项目或运行项目时,会将所有所需要的打包成一个整体,vue为单页面应用,同步加载大量的页面代码会导…

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…

Pandas教程

参考文献,记录一下 pandas 教程 - 盖若

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

在管理的海洋里,六西格玛管理是一艘稳健的航船,在质量管理的汪洋中乘风破浪,尽管质疑之声像远处的风暴不断逼近,但张驰咨询公司依靠这艘航船坚持初心,驭风而行。 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:公钥文件 把生…

SpringBoot中常见配置配置,MySQL、Redis、MinIO等

SpringBoot中配置 启动端口号 server:port: 8501 spring:application:name: server-managerprofiles:active: dev # 当前使用的配置文件servlet:multipart:max-file-size: 20MB # 最大文件max-request-size: 20MB# # 最大请求数据库相关 MySQL spring:datasource:type: com…

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、可选择加入到环境变量,…

【AI底层逻辑】——“数学华尔兹”之一元线性回归(代码实测)

目录 一、一元线性回归代码实测 二、统计量分析 1、statsmodels库 2、计算各种统计量

深入了解 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)的虚拟内存。但是这两种类型架构之间的主要区别是&…