基于知识库、工作流的智能体实践

2024-10-18 20:30:33 浏览数 (13)

功能需求:春节期间,我们一家前往大姐家相聚,被满室蝴蝶兰所吸引,每朵花都如同翩翩起舞的蝴蝶,离别时,大姐慷慨相赠,我们每人手捧一盆蝴蝶兰踏上归途。受此启发,开发了专注于蝴蝶兰养殖的智能助手。

预备知识

  1. 知识库是一系列文档的集合。一个知识库下可以包含多个文档。为什么要给大模型挂载知识库?领域信息补充:大模型通常基于公开数据集进行训练,这可能导致它们缺乏特定领域或专有信息。通过挂载知识库,可以向模型提供额外的领域特定知识,使其能够提供更准确和全面的答案。减少误导风险:大模型可能会在超出其训练范围的情况下提供不正确或虚构的信息。挂载知识库可以帮助模型在回答问题时引用可靠的数据源,从而减少误导用户的概率。获取实时信息:由于大模型的训练成本很高,它们通常无法实时更新知识库。通过挂载外部知识库,模型可以访问最新的信息(本情况多数是LLM结合搜索引擎),从而提供更及时和相关的回答。注意,目前腾讯元器的智能体调用链路逻辑上,如果智能体只关联了知识库,没有关联插件、工作流的情况下,智能体每次问答都一定会参考知识库,不会经过function call做意图判断。
  2. 工作流是一种“流程图”式的低代码编辑工具,可以用来做一个“高级版”插件。在工作流里,可以任意编排插件、知识库、大模型节点的工作顺序和调用传参,从而精确控制智能体中部分任务的运行逻辑。大模型在接收到用户问题时,如果判断该问题需要调用工作流,则会从用户问题里提取关键信息,作为工作流的入参启动工作流。之后根据工作流运行后返回的参数,辅助回答用户的问题。
  3. 智能体在大模型开发过程中扮演着至关重要的角色。它是一个能够感知环境、基于感知作出决策并执行行动的实体,智能体能够在没有人类干预的情况下自主决策和行动。在大模型时代,智能体展现出巨大的活力和潜力。它作为大模型的“执行者”和“交互界面”,通过感知、规划、推理、学习、执行和决策等智能行为特征,能够在动态环境中实时感知并精准决策。

本文以蝴蝶兰养殖助手为例,上传饲养知识word文档到知识库,创建自定义的工作流,最后使用智能体调用工作流,并提供API方式调用智能体示例代码,方便自有系统对接大智能体。


一、知识库搭建

进入知识库页面,创建并上传word文档到知识库,文档内容如下:

代码语言:txt复制
蝴蝶兰,作为高雅而珍贵的室内观赏花卉,其栽培过程对环境条件有着严格的要求。为了确保蝴蝶兰能够茁壮成长并绽放出绚烂的花朵,我们需要细致入微地调控其生长环境,特别是温度、湿度、光照以及二氧化碳浓度这四个关键因素。
首先,温度是蝴蝶兰生长的重要基石。最适宜的生长温度范围通常在20-28摄氏度之间,而最理想的温度则是23-25摄氏度。过高或过低的温度都会影响蝴蝶兰的正常生理活动,甚至导致生长停滞或死亡。因此,在栽培过程中,我们需要密切关注室内温度的变化,并采取相应的加热或降温措施。
其次,湿度是蝴蝶兰生长不可忽视的一环。这种花卉喜欢湿润的环境,相对湿度应保持在60%-80%之间。在干燥的季节或地区,我们需要通过喷雾、加湿器等方式来增加空气湿度,以满足蝴蝶兰的生长需求。
再者,光照对蝴蝶兰的生长同样至关重要。它们需要充足的光照来进行光合作用,但同时又不能直接暴露在强烈的阳光下。因此,我们需要将蝴蝶兰放置在光线明亮但又不直射的位置,如靠近窗户的散光处。在冬季或光照不足的情况下,可以适当增加光照时长或使用植物灯来补充光照。蝴蝶兰虽然需要光照以进行光合作用,但它们对强光却相当敏感。强光的标准可以大致定义为超过蝴蝶兰叶片所能承受的最大光照强度,这通常会导致叶片表面温度升高、水分蒸发过快,进而引发叶片灼伤、枯萎等问题。具体来说,蝴蝶兰所需的光照强度应在25000至40000勒克斯之间。在自然光条件下,这相当于早晨或傍晚柔和的阳光,或者是透过窗帘等遮蔽物的散射光。在夏季或阳光强烈的地区,应避免将蝴蝶兰直接暴露在中午的直射阳光下,可通过使用遮阳网、调整摆放位置或设置室内遮光设施来降低光照强度。
最后,二氧化碳浓度虽然不如前三者直观,但也是影响蝴蝶兰生长的一个重要因素。适当的通风换气有助于保持室内空气的清新和二氧化碳浓度的稳定。在密闭的室内环境中,二氧化碳浓度可能会逐渐升高,从而影响蝴蝶兰的光合作用和呼吸作用。因此,我们需要定期开窗通风,保持室内空气的流通和新鲜。二氧化碳是植物进行光合作用的重要原料之一,对于蝴蝶兰来说也不例外。然而,与许多其他植物相比,蝴蝶兰对二氧化碳浓度的要求并不特别高。在一般情况下,空气中的二氧化碳浓度(约为400ppm)已经足够支持蝴蝶兰的正常生长。但在温室或室内栽培环境中,为了促进蝴蝶兰的生长和开花,可以适当提高二氧化碳浓度。据研究和实践经验,蝴蝶兰在二氧化碳浓度为600至800ppm的环境下生长更佳。这可以通过定期通风换气、使用二氧化碳发生器或增加室内绿色植物数量等方式来实现。但需要注意的是,过高的二氧化碳浓度也可能对蝴蝶兰产生不利影响,因此应根据实际情况进行调整。
综上所述,饲养蝴蝶兰需要我们在温度、湿度、光照和二氧化碳浓度等方面做出全面的考虑和精心的调控。只有这样,我们才能为蝴蝶兰提供一个适宜的生长环境,让它们健康茁壮地成长并绽放出最美丽的花朵。

二、 创建工作流并使用上面的知识库

工作流概览:

工作流详解:

先接收用户问题,然后经过大模型节点判断。大模型的提示词:

代码语言:txt复制
- 判断用户问题{{STORY}}是否询问蝴蝶兰相关问题,如果是返回“是”,否则返回“否”。
- ​示例:
​    如用户问题是:“蝴蝶兰适宜温度”,返回“是”。
    ​​如用户问题是:“今天北京温度?”,返回“否”。

接下来使用分支节点判断大模型返回“是”还是“否”。

如果返回“是”,则调用知识库节点,注意知识库选择刚才创建的“温室养花”。

最后在结束节点进行输出。

设计完接下来,点击右上角“测试”按钮调试工作流,注意各个节点的入参和出差是否正确。调试通过后,可以发布该工作流。

发布需要审核,请等待几分钟,发布成功,左下角显示“已发布”字样。

三、创建智能体

智能体的设置如下:

注意:我们在工作流区域选择了自定义工作流“花卉饲养”。

测试通过后,点击右上角的“发布”按钮来发布智能体。

发布后的使用页面:

四、API方式调用智能体

暴露API供外部调用智能体是一种常见的做法,它允许外部开发者和企业通过编程接口直接访问和利用大模型的功能。这种方式带来了许多好处,同时也伴随着一些风险和挑战。以下是详细的解释:

4.1 好处

便捷性:通过API,开发者可以轻松地将大模型集成到自己的应用程序中,无需深入了解模型的内部工作机制。

成本效益:外部调用API避免了自行训练和维护大模型的成本,特别是对于那些缺乏足够资源和专业知识的个人或小企业来说,这是一个经济实惠的选择2。

即时更新:服务提供商负责模型的更新和维护,用户可以直接享受到最新的模型改进,而无需手动更新模型。

弹性伸缩:用户可以根据需求动态调整使用量,适合负载不稳定的场景,这有助于优化资源利用率和成本控制。

4.2 功能介绍

自然语言处理:API可以提供文本生成、情感分析、语言翻译等功能。

图像识别:API可以识别图像内容、进行物体检测或图像分类。

数据分析:API可以处理和分析大量数据,提供洞察和预测。

4.3 优势

快速部署:API使得大模型的功能可以快速部署到各种应用中,加速产品上市时间。

高定制化:尽管API提供的是预训练模型,但许多服务允许一定程度的定制化,以适应特定的业务需求。

4.4 应用场景

客户服务:使用大模型API提供智能客服,自动回答客户问题。

内容创作:利用API生成文章、诗歌或其他创意内容。

教育:开发个性化学习应用,提供定制化的教育资源和辅导。

4.5 风险和挑战

数据隐私:使用公共API时,数据需要发送到第三方服务器处理,可能存在敏感数据泄露的风险。

依赖性:过度依赖外部服务可能会在服务不可用时影响应用的稳定性。

安全性:大模型可能成为攻击的目标,如通过提示注入攻击来操纵模型输出。

4.6 结论

大模型暴露API供外部调用是一种强大的工具,它为开发者和企业提供了便捷、成本效益高且功能丰富的解决方案。然而,随之而来的数据隐私、依赖性和安全性问题也需要谨慎对待。通过合理的管理和技术措施,可以最大限度地减少这些风险,充分发挥大模型API的潜力。

4.7 API供外部调用智能体,参考如下图的菜单调用API:

需要在上图页面绑定腾讯云账号,腾讯赠送了1个小目标 token额度,注意:该页面的智能体id(代码中assistant_id

)、token(代码中Bearer值,不要泄露下面代码会使用到。

代码示例:

代码语言:txt复制
#注意先安装sdk,pip install tencentcloud-sdk-python -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

import requests
import json

# 定义 API 的 URL
url = 'https://open.hunyuan.tencent.com/openapi/v1/agent/chat/completions'

# 定义请求头
# Authorization的值在“我的智能体”->已发布的智能体上点击“...”按钮,点击“调用API”,可以找到您的API调用token
headers = {
    'X-Source': 'openapi',
    'Content-Type': 'application/json',
    'Authorization': 'Bearer OVLIkRPhjTM*************lC2dDlHl6g'
}

# 定义请求体
# 智能体id即assistant_id的值在“我的智能体”->已发布的智能体上点击“...”按钮,点击“调用API”,可以找到您的assistant_id
    "assistant_id": "av3pwWStovQ3",
    "user_id": "username",
    "stream": False,
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "蝴蝶兰的适宜温度?"
                }
            ]
        }
    ]
}

# 将请求体转换为 JSON 格式的字符串
json_data = json.dumps(data)

# 发送 POST 请求
response = requests.post(url, headers=headers, json=data)  # 使用 json 参数自动设置正确的 Content-Type

# 打印响应内容
print(response.text)

在命令行窗口,python agent_api.py来运行该Python代码,返回JSON数据,除了返回大模型处理后的content信息,还返回了知识库的命中切片、token消耗等信息。

五、封装自定义API

在构建智能体应用的集成过程中,我们常需自行开发API以桥接应用与智能体。以下是一个利用Python的Flask框架封装自有API的示例,该API接收用户的输入问题,调用智能体后返回JSON格式的数据,文件名设为agent_Flask_api.py。鉴于当前腾讯暂未提供SDK这类高级调用方式,我们采用API方式调用智能体。

代码语言:txt复制
#注意先安装sdk,pip install tencentcloud-sdk-python -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
from flask import Flask, request, jsonify  
import requests
import json

  
app = Flask(__name__)  

# 定义 API 的 URL
url = 'https://open.hunyuan.tencent.com/openapi/v1/agent/chat/completions'

# 定义请求头
# Authorization的值在“我的智能体”->已发布的智能体上点击“...”按钮,点击“调用API”,可以找到您的API调用token
headers = {
    'X-Source': 'openapi',
    'Content-Type': 'application/json',
    'Authorization': 'Bearer OVLIkRPhj&**********lC2dDlHl6g'
}

def chat_agent(query):

    # 定义请求体
    # 智能体id即assistant_id的值在“我的智能体”->已发布的智能体上点击“...”按钮,点击“调用API”,可以找到您的assistant_id
    data = {
        "assistant_id": "av3pwWStovQ3",
        "user_id": "username",
        "stream": False,
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": query
                    }
                ]
            }
        ]
    }

    # 将请求体转换为 JSON 格式的字符串
    json_data = json.dumps(data)

    # 发送 POST 请求
    response = requests.post(url, headers=headers, json=data)  # 使用 json 参数自动设置正确的 Content-Type

    # 打印响应内容
    return response.text
  
@app.route('/tencent_agent', methods=['POST'])  
def tencent_agent():  
    
    query = request.args.get('user_input')
    resp = chat_agent(query)
    if not resp:  
        return jsonify({"code": "50000", "msg": resp}), 200  
    else:  
        return jsonify({"code": "00000", "msg": resp}), 200  
  
if __name__ == '__main__':  
    app.run(host='0.0.0.0',debug=True)

使用如下命令python agent_Flask_api.py启动服务,成功启动信息如下:

通过Postman调用:

http://localhost:5000/tencent_agent?user_input=蝴蝶兰的适宜湿度,大模型告知:蝴蝶兰的适宜湿度应该在60~80%。

返回信息:

至此,我们已经圆满完成了知识库的搭建、工作流的设定以及智能体的创建工作。更值得一提的是,我们已经模拟通过API的方式,将智能体应用接入到了自有系统中,实现了业务系统对接AI的需求。

2 人点赞