百川大模型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.hqwc.cn/news/293676.html

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

相关文章

mysql面试:面试常问题概览、定位慢查询(explain命令)、mysql体系结构、支持的存储引擎(InnoDB)、面试回答模板

面试常问题概览 如何定位慢查询 通常页面加载过慢、接口压测响应时间过长(超过1s),此时我们应该要定位具体是否里面有mysql的慢查询的因素。 方案一:调试和运维工具 调试工具:Arthas 运维工具:Prometheu…

用数码管慢速动态扫描显示数字“1234“

#include<reg51.h> // 包含51单片机寄存器定义的头文件 void delay(void) //延时函数&#xff0c;延时一段时间 { unsigned char i,j; for(i0;i<250;i) for(j0;j<250;j) ; } void main(void) { while(1) //无限循…

python报错A value is trying to be set on a copy of a slice

加入.copy()即可避免该报错提示 原代码&#xff1a; df5df4.drop_duplicates() print(df5.shape)df5[班型中文名称]df5[班型名称]-A print(df5.head()) 输出结果&#xff1a; 修改后代码&#xff1a; df5df4.drop_duplicates().copy() print(df5.shape)df5[班型中文名称]df…

【PHP手麻系统源码】基于mysql+laravel+vue开发的医院手术麻醉系统源码,实现围术期患者数据的自动采集与共享

手麻系统作为医院信息化系统的一环&#xff0c;由监护设备数据采集系统和麻醉信息管理系统两个子部分组成。手麻信息系统覆盖了患者术前、术中、术后的手术过程&#xff0c;可以实现麻醉信息的电子化和手术麻醉全过程动态跟踪。 以服务围术期临床业务工作的开展为核心&#xf…

Python之Django项目的功能配置

1.创建Django项目 进入项目管理目录&#xff0c;比如&#xff1a;D盘 执行命令&#xff1a;diango-admin startproject demo1 创建项目 如果提示diango命令不存在&#xff0c;搜索diango-admin程序的位置&#xff0c;然后加入到环境变量path中。 进入项目&#xff0c;cd demo…

【Filament】绘制立方体

1 前言 本文主要介绍使用 Filament 绘制彩色立方体&#xff0c;读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形 2 绘制立方体 本文项目结构如下&#xff0c;完整代码资源 → Filament绘制立方体。 2.1 自定义基类 为…

Pycharm报的一些Python语法错误

Pycharm报的一些Python语法错误 1、PEP8:Expected 2 blank less:found 1 意思是&#xff1a;类和上面的行要间隔两行&#xff0c;现在只有一行 解决办法&#xff1a; 间隔2行 2、Remove redundant parentheses 意思是&#xff1a;删除多余的括号 解决&#xff1a;删掉外面括…

操作系统 day15(信号量)

信号量机制 之前学习了这些解决进程互斥的方案 *但它们都无法实现“让权等待”&#xff0c;于是Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法----信号量机制 总结&#xff1a;一个信号量对应一种资源。信号量的值这种资源的剩余数量&#xff08;信号量的值如果小于…

FATFS文件系统

文件系统是为了存储和管理数据&#xff0c;而在存储设备上建立的一种组织结构。 Windows常用的文件系统&#xff1a; 1、FAT12 2、FAT16 3、FAT32 4、exFAT 5、NTFS FAT&#xff1a;File Alloction Table 文件分配表 在小型的嵌入式存储设备大多…

CAS机制

Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技术之前&#xff0c;了解这个技术的底层原理是非常重要的&#xff0c;所以本篇文章就先来讲讲什么是CAS机制&#xff0c;CAS机制存在的一些问题以及在Java中怎么使…

基于thinkphp+vue的大学生校园生活服务平台sb00r

大学生一体化服务平台可以提高大学生综合服务信息管理问题的解决效率&#xff0c;优化大学生综合服务信息处理流程&#xff0c;保证大学生综合服务信息数据的安全&#xff0c;它是一个非常可靠&#xff0c;非常安全的应用程序。 运行环境:phpstudy/wamp/xammp等 开发语言&#…

多款实用个人年终总结模板,助力你的年度汇报!

临近年末&#xff0c;相信很多职场人这阵子都在忙着撰写个人年终总结&#xff0c;这份材料是对自己过去一年的工作进行的回顾和总结。撰写年终总结&#xff0c;其实也是一个非常重要的自我反思过程&#xff0c;可以帮助我们明确自己的目标&#xff0c;找出需要改进的地方&#…