百川大模型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 choices
            else:
                print(f"API Key: {api_key}, 请求失败,状态码: {response.status}")
                return None


# 异步主函数
async def main():
    while True:
        # 接受用户输入
        user_input = input("用户: ")

        # 如果用户输入为空,则退出循环
        if not user_input:
            break

        # 随机选择一个 API Key
        selected_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命令安装即可,否则无法正常使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全网最细,Jmeter性能测试-入门级接口压测思路,一文打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、压力测试重点关…

Nodejs 第三十章(防盗链)

防盗链(Hotlinking)是指在网页或其他网络资源中,通过直接链接到其他网站上的图片、视频或其他媒体文件,从而显示在自己的网页上。这种行为通常会给被链接的网站带来额外的带宽消耗和资源浪费,而且可能侵犯了原始网站的…

整数比较1 C语言xdoj93

描述: 编写程序,对于从键盘输入的2个整数,先输出较大者的个位数字,然后输出较小者的平方值。 输入说明: 输入的两个整数之间以一个空格分隔。 输出说明: 在一行上输出两个整数,整数之间以一个空…

将qt程序注册成服务

将qt程序注册成服务 1、qt服务模块管理下载 qt-solutions 2、QtService项目 2.1、将qtservice拷贝到项目代码路径 2.2、实现服务管理 PS&#xff1a;响应服务的启停 CustomService.h #include <QCoreApplication> #include "qtservice.h"class CustomSer…

上市公司-客户、供应商集中度(2000-2022年)

参考《中国工业经济》中吴安兵&#xff08;2023&#xff09;、《上海财经大学学报》中邱保印&#xff08;2023&#xff09;的做法&#xff0c;以客户集中度和供应商集中度之和衡量企业供应链集中度 其中客户集中度以前五名客户产生的营业收入占比衡量&#xff0c;供应商集中度…

好物设计- 实现区域图片变化自动截图

工具–Py即可 重点怎么获取窗口句柄? 使用 spyxx 可以获得句柄 (相当一个窗口的ID,无论窗口怎么变化ID不变我们都可以找到该窗口的详细信息) 替换句柄就可以,也可以不用句柄之间改截图区域 实战图片 import pygetwindow as gw import pyautogui import time import numpy a…

工业交换机之间Profinet无线以太网通信

在实际应用中&#xff0c;车间里控制柜内会有PLC、伺服电机、变频器等设备同时与触摸屏做数据交互&#xff0c;这些设备一般通过工业交换机进行数据组网。总控室内的PC组态软件往往需要采集到&#xff0c;车间内各部分触摸屏、PLC、变频器等设备信号&#xff0c;此时往往是工业…

当代大学生应该如何学习计算机科学

我相信&#xff0c;看到这个标题并且愿意阅读往下阅读的你&#xff0c;一定是正在学习计算机&#xff0c;而自己感到迷茫&#xff0c;或者你还真在考虑要不要学习计算机科学&#xff0c;再或者你是想学计算机而不知道到底该怎么去学的&#xff0c;好&#xff0c;既然你是榜上有…

ssm基于JAVA的校园综合服务系统论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

代码随想录第三十六天(一刷C语言)|背包问题理论基础分割等和子集

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、背包问题 题目&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装…

【C#】.net core 6.0 通过依赖注入注册和使用上下文服务

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 请求上下文是指在 Web 应用程序中处理请求时&#xff0c;包含有关当前请求的各种信息的对象。这些信息包括请求的头部、身体、查询字符串、路由数据、用户身份验证信息以及其他与请求相关…

Android 自动适配屏幕方案—— smallestWidth

smallestWidth限定符适配原理和屏幕分辨率限定符适配一样&#xff0c;都是通过创建多个values文件夹&#xff0c;系统根据限定符去寻找对应的dimens.xml文件&#xff0c;以确定不同设备上的大小展示&#xff0c;smallestWidth 限定符适配是拿 dp 值来等比缩放. 如何使用 一、…

低代码和纯代码:双向奔赴,共创未来ing……

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢&#xff0c;…

如何快速优化大数据量订单表

场景 本篇分享以前在广州一家互联网公司工作时遇到的状况及解决方案,这家公司有一个项目是SOA的架构,这个架构那几年是很流行的,哪怕是现在依然认为这个理念在当时比较先进。 当时的项目背景大概是这样,这家公司用的是某软提供的方案,项目已经运行3年多,整体稳定。 数据…

轴具匠心 SIA上海轴承展带您开启轴承之旅

轴承是各类机械装备的重要基础零部件&#xff0c;它的精度、性能、寿命和可靠性对主机的工作效率、使用寿命起着决定性的作用。随着市场的发展&#xff0c;用户对轴承产品的精度、性能、种类等方面的要求越来越高&#xff0c;市场对高档轴承的需求也在不断增加。 由中国设备管理…

Android中EventBus的简单使用

目录 介绍 EventBus产生的背景 EventBus工作流程图解 EventBus的优势 EventBus缺点 EventBus 的一些关键概念和用法&#xff1a; 使用 EventBus 的基本流程&#xff1a; EventBus环境配置 EventBus的五种线程模式 EventBus的使用 EventBus事件三部曲 创建一个事件类…

SE-Net:Squeeze-and-Excitation Networks(CVPR2018)

文章目录 AbstractIntroduction表征的重要性以前的方向本文提出 Related WorkDeeper ArchitectureAlgorithmic Architecture SearchAttention and gating mechanisms Squeeze-and-Excitation BlocksSqueeze: Global Information EmbeddingExcitation: Adaptive RecalibrationIn…

ssm基于vue的厨房管理系统论文

摘 要 使用旧方法对厨房管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨房管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的厨房管理系统管…

【Python-批量修改视频分辨率】

Python-批量修改视频分辨率 1 使用Python修改视频分辨率2 常见的视频编码格式2.1 等效的编码格式表示方式2.2 常见的编码格式 1 使用Python修改视频分辨率 首先拷贝视频文件并修改后缀&#xff0c;然后修改图片的分辨率&#xff0c;实现视频批量修改和转换。 import os impor…

自定义注解实现 后台系统-记录日志功能

文章目录 1 记录日志1.1 记录日志的意义1.2 日志数据表结构1.3 记录日志思想1.4 切面类环境搭建1.4.1 日志模块创建1.4.2 自定义Log注解1.4.3 OperatorType1.4.4 LogAspect1.4.5 EnableLogAspect1.4.6 测试日志切面类 1.5 保存日志数据1.5.1 SysOperLog1.5.2 LogAspect1.5.3 As…