一个简单的小demo,教你接入百度文心一言

402 阅读4分钟

一个简单的小demo,教你接入百度文心一言

1.创建应用

  1. 登入百度智能云cloud.baidu.com/,完成账号注册和身份认…
  2. 注册完成后,进入控制台
  3. 打开左上角侧边栏

image-20231217163151820.png

  1. 找到应用接入 点击创建应用

image-20231217163333547.png

  1. 输入基本信息完成创建(全部服务后续会产生费用 后续自行选择)

image-20231217163439303.png

  1. 应用创建完成后 这两个key后续需要用到

image-20231217170454288.png

2 API文档的使用

获取access_token

  1. 找到在线服务然后去查看API文档,这里的有很多大模型,每个模型的能力不一样,收费标准也不一样

image-20231217163926928.png

  1. 查看API 获取access_token
    1. 这个token就是使用凭证 身份认证Token

    2. 向大模型发起请求时,这个字段是必填的。

image-20231217164710959.png

  1. 查看接口请求说明

image-20231217170120063.png

image-20231217170132548.png

  • 请求地址 中的参数 填入对应字段
    • API Key

    • Secret Key

image-20231217170454288.png

//获取access_token的地址 这个地址都是一样的
https://aip.baidubce.com/oauth/2.0/token
?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]
  • 下面使用postman 向该接口获取access_token

image-20231217170833295.png 成功的请求并且获取到了access_token

向大模型发送请求

  • 回到API文档中,查看请求格式 这里的有一个query参数就是刚刚得到的access_token,body参数必填messages是一个对象数组 看请求实例

image-20231217171358483.png

image-20231217171427600.png

  • 使用postman 发送一次请求

image-20231217171945130.png

image-20231217172125118.png 至此这就是简单的使用流程了。

vite+原生js 的方式实现了一个简略的文心一言

gif.gif 前端界面:index.html

<!-- index.html-->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>尝试接入文心一言</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        list-style: none;
      }
      .app {
        position: relative;
        width: 100vw;
        height: 100vh;
        overflow: hidden;
        & .main {
          width: 600px;
          position: absolute;
          top: 50%;
          left: 50%;
          transform: translate(-50%, -50%);
          display: flex;
          flex-direction: column;
          & + div {
            display: flex;
            justify-content: center;
          }
          & .list {
            padding: 35px 4px;
            border: 1px solid #000;
            overflow: auto;
            width: 100%;
            height: 300px;
            & ul {
              margin-bottom: 20px;
              width: 100%;
              display: flex;
              flex-direction: column;
              align-items: center;
              & li {
                margin: 4px;
                max-width: 500px;

                text-align: center;
                line-height: 30px;
                & span:last-child {
                  min-width: 30px;
                  margin: 0 4px;
                  border: 1px solid #000;
                  padding: 3px;
                  border-radius: 6px;
                }
              }
            }
          }
        }
      }
      .my {
        align-self: flex-end;
        flex-direction: row-reverse;
        display: flex;
        & span:first-child {
          height: 30px;
          min-width: 30px;
          text-align: center;
          margin: 0 4px;
          border: 1px solid #000;
        }
        & span {
          text-align: right;
        }
      }
      .it {
        align-self: flex-start;
        display: flex;
        & span:first-child {
          height: 30px;
          text-align: center;
          background-color: red;
          min-width: 30px;
          margin: 0 4px;
          border: 1px solid #000;
        }
        & span {
          text-align: left;
        }
      }
      .loading {
        display: none;
        width: 100px;
        margin: 0 auto;
        position: relative;
        text-align: center; 
      }
      .btn {
        width: 100%;
        height: 100px;
        display: flex;
        justify-content: space-around;
        align-items: center;
        input {
          flex: 6;
          height: 30px;
          font-size: 18px;
        }
        button {
          margin: 10px 0;
          flex: 1;
          height: 30px;
        }
      }
    </style>
  </head>
  <body>
    <div class="app">
      <div class="main">
        <div class="list">
          <ul>
            <li class="my">
              <span></span>
              <span
                >Lorem ipsum dolor sit amet consectetur adipisicing elit. Expedita, animi!</span
              >
            </li>
            <li class="it">
              <span>it</span>
              <span>Lorem ipsum dolor sit.</span>
            </li>
            <li class="my">
              <span></span>
              <span>Lorem ipsum dolor sit.</span>
            </li>
            <li class="it">
              <span>it</span>
              <span
                >Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iure, dolores.</span
              >
            </li> 
          </ul>
          <div class="loading">加载中...</div>
        </div>
        <div class="btn">
          <input type="输入文字" />
          <button>提交</button>
        </div>
      </div>
    </div>
    <script src="./main.js" type="module"></script>
  </body>
</html>

主要逻辑:main.js

//main.js
import request from './request';
let btn = document.querySelector("button");
let input = document.querySelector("input");

let list = document.querySelector(".list ul");
let loading = document.querySelector(".loading");

//首次进入滚动到最新消息
setTimeout(() => {
    smoothScroll(list.children[list.children.length - 1])
}, 500)

//如果没有凭证 需要去获取凭证
let token = localStorage.getItem("access_token")
if (!token) {
    getToken()
}

//滚动到指定该元素为止
function smoothScroll(element) {
    element && element.scrollIntoView({ behavior: "smooth" })
}

//创建一个消息元素  
function createLi(className, content) {
    let li = document.createElement("li");
    li.className = className
    li.innerHTML = `<span>${className === "my" ? "我" : "it"}</span><span>${content}</span>`
    list.appendChild(li);
    smoothScroll(li)
}


//获取沟通凭证 这里模拟就使用进入获取
async function getToken() {
    try {
        let data = await request.post("/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]")
        console.log(data);
        if (data.access_token) {
            let { access_token } = data
            localStorage.setItem("access_token", access_token)
        }
    } catch (err) {
        console.log(err.response.status);
    }
}


async function sendMessage(messageCentent) {
    let token = localStorage.getItem("access_token")
    console.log(loading);
    loading.style.display = "block";
    let { result } = await request.post("/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" + token,
        {

            "messages": [
                {
                    "role": "user",
                    "content": messageCentent
                }
            ]
        }, 
    )

    loading.style.display = "none";
    createLi("it", result)
}

//客户端发送请求
function clientSend() {
    if (input.value == "") {
        alert("请输入内容");
        return;
    }
    createLi("my", input.value)
    //发请求 响应数据处理
    sendMessage(input.value);
    input.value = "";
    return;
}
 
//点击/回车 发送信息
btn.addEventListener("click", clientSend)
input.addEventListener("keydown", function (e) {
    if (e.keyCode == 13) {
        clientSend()
    }
})

简单的封装了一下axios

//request.js
import axios from 'axios';

let request = axios.create({
    baseURL: '/api'
}) 

request.interceptors.request.use(config => {
    console.log(config);
    return config
})

request.interceptors.response.use(res => { 
    return res.data
})
 
export default request

vite开启代理,直接请求会出现跨域,

//vite.config.js
import { defineConfig } from 'vite';

export default defineConfig(() => {
    return {
        server: {
            proxy: {
                // /api与axios.baseURL一致
                '/api': {
                    target: "https://aip.baidubce.com",
                    changeOrigin: true, // 是否跨域
                    rewrite: (path) => path.replace(/^\/api/, ''),
                }
            }
        }
    }
})

官方文档更加详细,并且有对应的测试接口,此文目的也算是一个笔记。

感谢你的观看,如有问题欢迎交流。

哦 还有 首次发文,多多包含。