[Unity+文心知识库]使用百度智能云搭建私有知识库,集成知识库API,打造具备知识库的AI二次元姐姐

1.简述

        最近从百度智能云的官方技术支持那边了解到,目前百度千帆大模型平台提供有在线的知识库功能,能够在线上传自己的私人知识库文档,并且配置文心一言模型作为文本生成的引擎,构建自己的私有知识库。之前自己搭建知识库都是用的langchain框架,在本地部署使用的,那么现在通过百度智能云提供的知识库构建平台,就可以很方便的构建出自己的私有知识库应用了,另外的话,这个知识库应用也提供了API调用能力,可以非常方便的集成到我们自己的应用,这就非常的赞了。所以这次这篇文章,就简单给大家介绍一下怎么在百度智能云平台上构建自己的知识库应用,同时利用API服务,将知识库功能集成到我的AI二次元小姐姐项目里。

2.上传知识库

        首先,咱们需要登录到百度智能云的官方站点,账户大家自备。百度智能云的官方站点如下所示:

https://cloud.baidu.com/icon-default.png?t=N7T8https://cloud.baidu.com/

        在百度智能云平台登录账号后,我们从官网菜单中,找到[产品->千帆大模型超级工厂->RAG问答应用],点击即可进入到知识库应用视图。

        在百度智能云知识库应用的控制界面,可以选择知识库,查看知识库视图

        点击创建知识库集合,即可进入到知识库上传视图

        这里的话,百度智能云的知识库能够支持的文档格式包括word、txt以及pdf,我们只需要将自己的知识文档上传,系统将自动处理文档内容,并对文档的内容做切片,提取文档中的知识内容。上传成功后,咱们就可以查看已上传的文档的切片结果,以及提取出来的知识片段。

        同一个知识库集合可以上传多个文档内容,上传完成之后,我们就构建了一个自己专属的知识库集合了,后续的知识库应用的构建,就需要使用到相关的知识库集合,接下来咱们来看看如何创建知识库应用。

3.创建知识库应用

        知识库集合创建完毕后,我们可以创建自己的知识库应用了。点击我的应用,并点击创建一个新的应用,即可是开始构建自己的知识库应用了。

        百度智能云官方提供了三种可构建的应用模板,包括基础生成应用、RAG问答应用以及人设对话应用,其中后两种模板都是对话型模板,我们需要构建对话式的知识库应用,例如AI客服机器人应用,就需要使用后两种模板。

        选择一种模板后,进行应用的创建,界面将进入到知识库应用创建视图

        在知识库应用创建界面中,我们可以选择并指定私有知识库所对应的知识库集合,并根据自己的需求选择一个大语言模型应用。这里,我们也可以选择官方提供的免费试用服务,官方提供了200次的文心大模型4.0的免费调用次数供大家选用。如果咱们选择付费大模型服务的话,那么首先需要在千帆大模型平台创建一个大模型应用,这个可以参考我之前的文章进行操作。

        配置完成之后,我们可以在界面右侧,对已创建的大模型服务进行测试,查看知识库应用的应用效果。测试无误之后,点击发布,即可发布知识库应用了。

        在应用发布界面中提供了两种可访问的形式:

        ①我们可以通过复制知识库应用的服务地址,通过浏览器访问知识库应用;

        ②可以通过API调用,来访问知识库应用。

        这个根据自己的实际需求即可。

4.API调用知识库应用的代码实现

        本节内容将着重介绍一下,如果通过API调用,来访问已构建的知识库应用。在应用发布页面,可以找到API调用说明的文档入口,在实现API调用代码之前,我们先阅读一下API文档。

        API的调用流程很简单,首先,咱们需要在应用发布时,创建API KEY,拿到API key后,再根据API调用的接口规范,使用POST请求进行访问即可。以下是API相关的接口说明:

       4.1 创建API key

        API key的创建,只需要在应用发布界面,点击创建API KEY,即可获取到密钥,请妥善保存api key的信息。

        4.2 API接口说明

        API调用的方法,根据接口文档的说明,我们可以了解到:

        API的请求地址以及方式:

        请求地址:https://console.bce.baidu.com/api/ai_apaas/v1/instance/integrated
        请求方式:POST

        Header参数

参数 说明
Content-Type application/json -
X-Authorization Bearer {API Key} 鉴权字段,大括号内需填入API Key(密钥)

        Body参数

注意:要求使用 JSON 格式的结构体来描述一个请求的具体内容。

参数 是否必选 类型 可选值范围 描述
query string - 用户的请求query
response_mode string streaming/blocking 响应模式,支持以下两种:
1. streaming:流式响应,使用SSE协议
2. blocking:阻塞响应
conversation_id uuid - 对话ID,仅对话型应用生效。在对话型应用中:
1. 空:表示表新建会话
2. 非空:表示在对应的会话中继续进行对话,服务内部维护对话历史

        响应说明

参数 是否必选 类型 描述
code int 错误码。非0为错误,请参考错误码说明
message string 报错信息
result object 返回结果
+ answer string 应用响应结果
+ conversation_id uuid 对话ID,仅对话式应用生效。如果是对话请求中没有conversation_id,则会自动生成一个

        错误码

错误码 错误信息 描述
400 InvalidRequestArgumentError 请求参数错误
401 PermissionDeniedError 权限错误
404 NotFoundResource 账户、应用、模型、模版等无法找到
500 InternalServerError 服务器内部错误
1001 QuotaLimitExceeded 调用超限,免费额度不足
1004 LLMStreamingResponseError 模型服务报错
1005 TemplateValuesError 模版参数校验错误
1006 QuotaLimitExpired 免费额度已过期
1007 QianfanServiceError 千帆服务无法访问
1008 QianfanPermissionDeniedError 千帆服务访问失败,一般是权限错误

4.3 API接口调用的代码实现

        API接口调用的代码实现,我将在Unity中进行代码实现,主要的代码如下:

   #region Params
    [Header("填写百度助手的apikey")]
    [SerializeField] private string m_ApiKey = string.Empty;

    private string m_ConversationID= string.Empty;//对话id

    #endregion

    #region Method

    private void Awake()
    {
        url = "https://console.bce.baidu.com/api/ai_apaas/v1/instance/integrated";
    }

    /// <summary>
    /// 发送消息
    /// </summary>
    /// <returns></returns>
    public void PostMsg(string _msg, Action<string> _callback)
    {
        base.PostMsg(_msg, _callback);
    }


    /// <summary>
    /// 发送数据
    /// </summary> 
    /// <param name="_postWord"></param>
    /// <param name="_callback"></param>
    /// <returns></returns>
    public IEnumerator Request(string _postWord, System.Action<string> _callback)
    {
        stopwatch.Restart();
        string jsonPayload = JsonConvert.SerializeObject(new RequestData
        {
           query= _postWord,
           conversation_id=m_ConversationID
        });

        using (UnityWebRequest request = new UnityWebRequest(url, "POST"))
        {
            byte[] data = System.Text.Encoding.UTF8.GetBytes(jsonPayload);
            request.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);
            request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();

            request.SetRequestHeader("Content-Type", "application/json");
            request.SetRequestHeader("X-Authorization ", m_ApiKey);

            yield return request.SendWebRequest();

            if (request.responseCode == 200)
            {
                string _msg = request.downloadHandler.text;
                ResponseData response = JsonConvert.DeserializeObject<ResponseData>(_msg);

                if (response.code == 0)
                {
                    string _msgBack = response.result.answer;
                    m_ConversationID = response.result.conversation_id;

                    //添加记录
                    m_DataList.Add(new SendData("assistant", _msgBack));
                    //回调
                    _callback(_msgBack);
                }
                else
                {
                    OnLogError(response.code);
                }
            
            }

        }

        stopwatch.Stop();
        Debug.Log("文心一言AI助手耗时:" + stopwatch.Elapsed.TotalSeconds);
    }

    /// <summary>
    /// 打印错误信息
    /// </summary>
    /// <param name="code"></param>
    private void OnLogError(int code)
    {
        if (code == 400)
        {
            Debug.LogError("请求参数错误");
            return;
        }
        if (code == 401)
        {
            Debug.LogError("权限错误");
            return;
        }
        if (code == 404)
        {
            Debug.LogError("账户、应用、模型、模版等无法找到");
            return;
        }
        if (code == 500)
        {
            Debug.LogError("服务器内部错误");
            return;
        }
        if (code == 1001)
        {
            Debug.LogError("调用超限,免费额度不足");
            return;
        }
        if (code == 1004)
        {
            Debug.LogError("模型服务报错");
            return;
        }
        if (code == 1005)
        {
            Debug.LogError("模版参数校验错误");
            return;
        }
        if (code == 1006)
        {
            Debug.LogError("免费额度已过期");
            return;
        }
        if (code == 1007)
        {
            Debug.LogError("千帆服务无法访问");
            return;
        }
        if (code == 1008)
        {
            Debug.LogError("千帆服务访问失败,一般是权限错误");
            return;
        }
    }


    #endregion

    #region 数据定义

    [Serializable]
    private class RequestData
    {
        [SerializeField] public string query=string.Empty;//对话内容
        [SerializeField] public string response_mode= "blocking";//对话模式 1. streaming:流式响应,使用SSE协议  2. blocking:阻塞响应
        [SerializeField] public string conversation_id=string.Empty;//对话id,第一次对话后返回,用作聊天记录,服务端自行处理
    }

    [Serializable]
    private class ResponseData
    {
        [SerializeField] public int code;
        [SerializeField] public string message = string.Empty;
        [SerializeField] public ReData result = new ReData();

    }

    [Serializable]
    private class ReData
    {
        [SerializeField] public string answer = string.Empty;//回复
        [SerializeField] public string conversation_id = string.Empty;//对话id
    }

    #endregion

        通过调用PostMsg方法,即可实现将输入的文本信息,发送到知识库的API接口,并返回AI回复的信息文本的功能。

5. Unity端配置

        关于文心知识库的API调用模块,我已经更新到我开源项目中,本节内容将介绍一下在unity端的配置方式。注意一下,unity的版本要求在2020.3.44及以上。

        我们在Unity端,找到LLM对象下的“文心知识库”对象,在对象脚本上填写知识库应用的API KEY,并将文心知识库对象配置为ChatAgent的LLM模块即可完成配置了。详细配置流程可以参见我的B站视频。

6. 结束语

        本次的文章详细介绍了如何在百度智能云平台创建知识库结合,并构建自己的私有知识库应用的操作方法,并且实现了通过API访问,将百度文心知识库应用集成到AI二次元小姐姐项目中。通过这次的应用集成,我们的AI小姐姐将具备知识库储备了。关于本文所涉及内容的详细讲解视频,感兴趣的朋友可以观看我的B站视频,以下为视频传送门:

[Unity+文心知识库]使用百度智能云搭建私有知识库,集成知识库API,打造具备知识库的AI二次元姐姐


项目地址传送门:

AI二次元老婆开源项目(unity-AI-Chat-Toolkit):

Github地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit

Gitee地址:https://gitee.com/DammonSpace/unity-ai-chat-toolkit
 

猜你喜欢

转载自blog.csdn.net/sinat_28962939/article/details/134978346
今日推荐