当前位置: 首页 > article >正文

如何调用百度文心一言API实现智能问答

诸神缄默不语-个人CSDN博文目录

百度需要先认证个人信息才能使用LLM API。

文章目录

  • 1. 获得 API Key
  • 2. 撰写代码并实现提问和回答
    • 2.1 用openai包实现调用
    • 2.2 用openai包实现流式调用
    • 2.3 用openai包实现工具调用
    • 2.4 构建智能体
    • 2.5 文生图
    • 2.6 图生图
  • 3. 用gradio建立大模型问答网站
    • 3.1 gradio原生UI
    • 3.2 文心一言风格UI
    • 3.3 gradio其他介绍
  • 4. 参数介绍
  • 5. 本文撰写过程中参考的网络资料

1. 获得 API Key

https://aistudio.baidu.com/account/accessToken
在这里插入图片描述
点击复制即可。

2. 撰写代码并实现提问和回答

2.1 用openai包实现调用

import openai
import backoff

client = openai.OpenAI(
    api_key=OPENAI_API_KEY,
    base_url="https://aistudio.baidu.com/llm/lmapi/v3"
)

LLM_MODEL="ernie-3.5-8k"

@backoff.on_exception(backoff.expo, (openai.RateLimitError, openai.APITimeoutError))
def llm_check_search(query, msg_history=None, llm_model=LLM_MODEL):
    msg_history = msg_history or []
    new_msg_history = msg_history + [{"role": "user", "content": query}]
    response = client.chat.completions.create(
        model=llm_model,
        messages=[*new_msg_history],
        max_tokens=30
    ).choices[0].message.content
    
    # 返回 LLM 的响应
    return response

print(llm_check_search("你是谁?"))

输出:

我是文心一言,百度研发的知识增强大语言模型。我能够回答各种问题,提供相关的知识和信息,并且可以进行文本创 
作和知识推理等多种任务。如果您有任何问题或需要帮助,请随时告诉我。

2.2 用openai包实现流式调用

流式调用就是大模型每次生成一点就返回一点,用户在前端可以更快地看到前半部分内容:

import openai
import backoff

client = openai.OpenAI(
    api_key=OPENAI_API_KEY,
    base_url="https://aistudio.baidu.com/llm/lmapi/v3"
)

LLM_MODEL="ernie-3.5-8k"

@backoff.on_exception(backoff.expo, (openai.RateLimitError, openai.APITimeoutError))
def llm_check_search(query, msg_history=None, llm_model=LLM_MODEL):
    msg_history = msg_history or []
    new_msg_history = msg_history + [{"role": "user", "content": query}]
    response = client.chat.completions.create(
        model=llm_model,
        messages=[*new_msg_history],
        max_tokens=30,
        stream=True
    )

    for chunk in response:
        chunk_content = chunk.choices[0].delta.content
        if chunk_content:
            print(chunk_content)

llm_check_search("你是谁?")

输出:

我是百度
公司研发
的知识增强
大语言
模型,
我的中文名
是文心
一言,
英文名是
ERNIE
 Bot。
我可以完成的任务
包括知识
问答,
文本创作
,知识
推理,
数学计算
,代码
理解与编写
,作画
,翻译
等。
如果您有任何
问题,
请随时
向我提问
。

2.3 用openai包实现工具调用

create()方法中加入tools参数,描述一系列可用的函数。
在这里插入图片描述
parameters的值是一个Json Schema。
Object 的字字段用properties描述,array子字段类型
用items描述,可以相互嵌套定义。这样就可以描述任意复杂的Json规范了。
示例入参:{"location": ["北京", "天津"], "date": "2024-01-01"}

tool_choice入参:默认是auto,标识模型自己选择是否使用工具。
None代表不使用工具,Required代表强制使用指定的工具。

2.4 构建智能体

在这里插入图片描述

2.5 文生图

在这里插入图片描述

2.6 图生图

在这里插入图片描述

3. 用gradio建立大模型问答网站

我没有专门写一篇介绍gradio的文章,就直接拿这篇博文作为简单示例性教程了。
我看这个模块还挺好使的。

3.1 gradio原生UI

假设本文2.1节的代码写在try_wenxinyiyan1.py中,我们在同目录下新建一个Python文件写如下代码:

import gradio as gr
from try_wenxinyiyan1 import llm_check_search

demo = gr.Interface(
    fn=llm_check_search,
    inputs=["text"],
    outputs=["text"],
)

demo.launch()

运行后打开给出的网址(http://127.0.0.1:7860)效果如图所示:
在这里插入图片描述

3.2 文心一言风格UI

import gradio as gr
from try_wenxinyiyan1 import llm_check_search

# 修改自定义 CSS
custom_css = """
body {
    background-color: #f0f8ff;  /* 淡蓝色背景 */
}
.container {max-width: 730px; margin: auto; padding-top: 0;}
.title-container {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    margin-top: 5rem;
    margin-bottom: 2rem;
}
.main-title {
    font-size: 2.5em;
    font-weight: bold;
    color: #1e90ff;  /* 深蓝色标题 */
    display: flex;
    align-items: center;
    justify-content: center;
}
.main-title img {
    width: 40px;
    height: 40px;
    margin-right: 10px;
    filter: invert(39%) sepia(95%) saturate(1095%) hue-rotate(194deg) brightness(103%) contrast(101%);  /* 将图标改为蓝色 */
}
.powered-by {
    font-size: 0.8em;
    color: #4682b4;  /* 钢蓝色 */
    margin-top: 0.5rem;
}
#component-1 {
    border: none !important;
    box-shadow: none !important;
    background: none !important;
}
#component-1 .form {
    border: 1px solid #87cefa;  /* 淡蓝色边框 */
    border-radius: 4px;
    padding: 10px;
    background-color: white;
}
.button-container {
    display: flex;
    flex-direction: column;
    align-items: center;
}
.search-button.primary {
    min-width: 120px !important;
    justify-content: center !important;
    background-color: #1e90ff !important;  /* 深蓝色按钮 */
    color: white !important;
    border: none !important;
}
.search-button.primary:hover {
    background-color: #4169e1 !important;  /* 悬停时稍深的蓝色 */
}
.search-button.primary span {
    margin: 0 auto !important;
}
"""

# 修改自定义 HTML 标题
custom_title = """
<div class="title-container">
    <div class="main-title">
        <img src="https://img.icons8.com/ios-filled/50/000000/search--v1.png" alt="Search Icon"/>
        <span>AI问答机</span>
    </div>
    <div class="powered-by">Powered by 文心大模型</div>
</div>
"""

with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as iface:
    gr.HTML(custom_title)
    with gr.Column(elem_classes="container"):
        query_input = gr.Textbox(
            lines=1,
            placeholder="想对文心一言问什么?",
            label=None,
            container=False,
        )

        gr.Examples(
            examples=[["火鸡好吃吗?"], ["感恩节的来源是什么?"], ["哲学专业学什么?"]],
            inputs=query_input,
        )

        with gr.Column(elem_classes="button-container"):
            submit_button = gr.Button("搜索一下", elem_classes="search-button primary")
        output = gr.Markdown()

    submit_button.click(fn=llm_check_search, inputs=query_input, outputs=output)

if __name__ == "__main__":
    iface.launch()

效果:
在这里插入图片描述

3.3 gradio其他介绍

  1. flag按钮是用来保存输入输出信息到本地的
  2. launch()函数中设置参数share=True就可以公开分享链接

4. 参数介绍

  1. messages
    1. role:system / user / assistant / tool
    2. content
    3. tool_calls(assistant信息调用工具时放置工具信息)
    4. tool_call_id(tool信息中对应assistant信息中tool_calls值的id键的值)

5. 本文撰写过程中参考的网络资料

  1. 文心一言官方课程“乘风季·开发者进阶计划训练营课程”

http://www.kler.cn/a/421243.html

相关文章:

  • Vue框架开发一个简单的购物车(Vue.js)
  • HTTP 探秘之旅:从入门到未来
  • burp2
  • 【AI系统】昇腾异构计算架构 CANN
  • 采药 刷题笔记 (动态规划)0/1背包
  • unity读取mysql5.7版本示例
  • 网络安全维护
  • LuaJava
  • pytorch加载预训练权重失败
  • 【C++笔记】map和set的使用
  • 003-SpringBoot整合Pagehelper
  • 后端-mybatis的一对多
  • iptables 防火墙 附实验:三台虚拟机模拟内网连接外网
  • 多模态遥感技术:智慧城市更新与表达的新路径
  • 容器化实践:优化DevOps环境下的容器交付流程
  • 【Leetcode】27.移除元素
  • 【大数据学习 | 面经】Spark 3.x 中的AQE(自适应查询执行)
  • Vue教程|搭建vue项目|Vue-CLI新版脚手架
  • 【HarmonyOS】鸿蒙应用使用lottie动画
  • 【SpringBoot】29 基于HttpClient的Http工具类
  • [自然语言处理] NLP-RNN及其变体-干货
  • Python 网络爬虫入门全知道
  • 分布式推理框架 xDit
  • 【threejs】实现不同动画的播放和平滑切换
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验三----学校选址与路径规划(超超超详细!!!)
  • <数据集>路面坑洼识别数据集<目标检测>