十分钟撸一个文心一言4.0

目前百度已经开放了文心一言大语言模型。我很有兴趣尝尝鲜,经过十多分钟的头脑风暴,火力全开。一个简陋却不简单的 demo 出来了。

整体交互流程设计:

  1. 🤵‍♂️用户在输入框中输入,按回车发送。
  2. 在对话区增加一条用户输入,对话区机器人🤖显示loading状态,并发送文心一言接口请求。
  3. 文心一言返回结果后,将其展示在对话区。

页面布局

html 复制代码
<template>
  <div class="wxyy">
    <div class="dialog">
      <!-- 对话区 -->
    </div>
    <!-- 输入框 -->
    <textarea></textarea>
  </div>
</template>

主打一个简单!

调接口

核心代码自然是调文心一言的 api 接口。文档在此

如果不用流式响应,那就是普通的 post 接口,so easy!

js 复制代码
// access_token 获取参见 https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Ilkkrb0i5
const access_token = 'your_access_token'
fetch(
  `https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=${access_token}`,
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      /**
       * 关键参数 messages
       * 之所以是数组,在于多轮对话时需要把对话历史全部传过去供模型分析
       */
      messages: [
        {
          role: 'user',
          content: '你好',
        },
      ],
    }),
  }
)

简单优化一下

最终效果如下:

完整代码如下:

html 复制代码
<template>
  <div class="wxyy">
    <div class="dialog">
      <div v-for="item in dialog" class="item" :class="[item.role]">
        <div class="avatar" v-if="item.role === 'assistant'">🤖</div>
        <div class="content">{{ item.content }}</div>
        <div class="avatar" v-if="item.role === 'user'">🤵‍</div>
      </div>
      <div class="item assistant" v-if="loading">
        <div class="avatar">🤖</div>
        <div class="content">正在想。。。</div>
      </div>
    </div>
    <textarea @keypress.enter="sendPrompt"
              v-model="prompt"></textarea>
  </div>
</template>

<script>
export default {
  data () {
    return {
      prompt: '',
      dialog: [],
      loading: false,
    }
  },
  methods: {
    sendPrompt (e) {
      this.loading = true
      e.preventDefault()
      this.dialog.push({
        role: 'user',
        content: this.prompt,
      })
      this.prompt = ''
      // 替换成你自己的 access_token
      const access_token = 'your_access_token'
      fetch(`https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=${access_token}`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          messages: this.dialog
        })
      }).then(res => res.json()).then(res => {
        this.loading = false
        this.dialog.push({
          role: 'assistant',
          content: res.result
        })
      })
    },
  }
}
</script>

<style lang="less"
       scoped>
.wxyy {
  display: flex;
  flex-direction: column;
  width: 600px;
  height: 80vh;
  margin: 20px;
  border: 1px dashed lightcoral;

  .dialog {
    flex: 1;
    .item {
      display: flex;
      .content {
        width: 60%;
      }
    }
    .avatar {
      font-size: 32px;
    }
    .user {
      justify-content: flex-end;
      .content {
        background: lightblue;
      }
    }
  }
}
</style>
相关推荐
咩咩啃树皮2 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny2 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹2 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny2 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
小林ixn3 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker3 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜4 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康4 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
一点一木4 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github
IT_陈寒6 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端