代码分析
- 上节我们已经成功启动了app.py,并上线到创空间,但是体验下来并不够好,没有达到我们想要的效果,这节我们主要讲一下如何对整个项目如何进行优化。
- 分析一下app.py(原身是appBot.py)的代码,可以看到这里有一个
uuid_str
,应该是默认用户的标识符,这里设定是是local_user,我们找到了一个读取配置以及头像相关的代码,这里我们详细看看上面的parse_configuration
是干啥用的。
parse_configuration
函数定义在config_utils.py中,代码对应的意思来看,里面有读取模型配置,如果用户没有设置,则读取默认模型配置文件,下面有一个读取用户专属配置的一个函数。
- 一般来说,我们并不会专门去定义这些环境变量,所以我们正常会走的默认配置,所以这里看看
DEFAULT_MODEL_CONFIG_FILE
是从哪里来的,它代表了什么数值。 - 这里可以看到一些默认配置了,里面有模型发布时的build配置,以及对应的模型调用,tool工具链(比如天气,文生图啥的),最下面是code解释器那块,暂时可以不管,下面我们去看看具体路径对应的文件,看看里面长啥样,从路径来看,model和tool的配置是在和config_utils.py同级的config文件夹下,而build的相关的配置在
/tmp/agentfabric/config
路径,这个待会再说。
- 找到根目录的config文件夹,我们正好可以看到上面需要的三个文件,大家可以详细看看里面的内容。
- 这里补充一下builder_config.json,项目正式运行时,会判断
/tmp/agentfabric/config/builder_config.json
是否存在,如果不存在,就会拷贝项目里面的config/builder_config.json
过去,所以理论上我们可以直接修改config/builder_config.json
文件,不过修改后,需要删除/tmp/agentfabric/
文件才行,否则他会读取旧的文件,对于Windows用户,这个路径在c:\tmp\agentfabric
。 - 下面我们详细看看
config/builder_config.json
文件。,可以看到里面有Agent的身份定义,默认prompt配置,知识库,工具链相关内容,以及默认启动的模型。
- 这里假设我们想做一个简单的
xxx游戏
,我们可以给name填上他的身份为xxx游戏
,然后加上一些示例。 - 继续回到app.py(原身是appBot.py),我们在结尾处看到其运行时默认启用了
init_user
函数。
- 这里有一个
init_user_chatbot_agent
函数,看含义应该是初始化agent,我们再次点进去瞅瞅。
- 这次跳转到了user_core.py,上面貌似还是和之前一样加载配置,基本可以忽略,不过里面有一个设置top=0.5的,后续要修改可以改这里。
- 再往下看看,可以看到默认的prompt配置了,我们可以点一下
DEFAULT_SYSTEM_TEMPLAT
,看看它在哪里。
- 此时可以看到默认系统prompt是定义在
custom_prompt.py
的,中间的<xxx>
是后面从配置文件读过来,会进行对应替换的,所以不要动这些特殊内容,不过我们可以在里面增加一些内容。
- 从最底下来看,这里的扮演,确实是用了
name
作为角色定义的,如果你仔细debug,你就能知道这里的name
就是config/builder_config.json里面的name
。
- 回到user_core.py,我们在往下看,可以看到他用faiss来读取build_config.json里面的向量库路径列表,最后把他变成矩阵存储起来。
总的来看
config/ # 里面有很多配置文件,默认启用的是model_config.json和tool_config.json,以及将被复制到/tmp/agentfabric/的builder_config.json modelscope_agent/tools/ # 注册工具链的位置 app.py # 启动入口,也是上线后的默认文件,大部分是修改这个地方 appBot.py # 一个智能的,通过对话创建Agent的项目,其实也是这个项目的原始(app.py)启动文件,仅作参考。 config_utils.py # 读取默认配置的代码,不建议修改 custom_prompt.py # prompt默认定义,可以加,但是不建议删减<xxx>变量 user_core.py # 里面有构建Agent的具体代码,包括prompt输入和知识库构建过程。
Tool实战
- 假设我们需要做一个tool,本地调用,然后返回json。这里教程参考了官方教程:Agent实操(三):将API注册为tool,成为smart API,方便社区开发者调用。
- 这个tool将返回一个论坛用户信息,并且只能查看自己,所以这个入参查询用户名是可选的,当然也可以不要查询参数。
- 我们在
modelscope_agent/tools
下面新建一个get_user.py
的文件,然后按照官方示例,完成代码编写,这里返回一个固定的json就行了,key必须是result
from .tool import Tool
class GetUser(Tool):
name = "get_user"
description = "该工具用户返回论坛用户信息。"
description += "当用户询问其信息时,立刻返回其用户信息"
description += """
下面是一些对话场景:
场景1:
<用户>: 返回我的信息
<助手>: 好的,正在查询中
场景2:
<用户>:查看我的用户等级
<助手>: 好的,正在查询中
"""
parameters = [
{
'name': 'user_name',
'description': '要查询的用户名',
'required': False
}
]
def __call__(self, remote=False, *args, **kwargs):
if self.is_remote_tool or remote:
return self._remote_call(*args, **kwargs)
else:
return self._local_call(*args, **kwargs)
def _remote_call(self, *args, **kwargs):
pass
def _local_call(self, *args, **kwargs):
user_name = kwargs.get("user_name", "")
# todo filter user name
# return information
result = {
"uuid": "0123456",
"name": "张三",
"level": 2,
}
# return mast has key result
return {"result": result}
modelscope_agent/tools/__init__.py
中注册。然后在
config
文件夹的tool_config.json
,和buidler_config.json
(这个是放在tools下)中分别定义。"get_user":{ "name": "获取用户信息", "is_active": true, "use": true }
- 给
buidler_config.json
的name定义为论坛小助手
,并且加上一些默认示例。 - 保险起见,如果是Windows用户看看你的本机有么有
c:\tmp\agentfabric
,或者Linux/Mac用户看看/tmp/agentfabric/
,将这个目录删除,他是缓存,不删除,项目的builder_config.json无法生效。 - 本机运行项目做一下测试。
测试成功,
get_user
这个tool确实被调用成功了,不过确实可以看出来里面的user_name
参数是多余的,会让模型多输出一句废话。知识库实战
- 为了让这个论坛更加有秩序,我们需要给他加一些规则。
- 这个规则就是知识库,我们需要询问助手,一些等级上面的规则。
- 这里我们采用CSDN的的等级规则来做知识库,原帖链接
- 将其复制粘贴,存放在
text/001.txt
目录。
在
config/buidler_config.json
中加入知识库路径。"knowledge": ["text/001.txt"],
- 如果是Windows用户看看你的本机有么有
c:\tmp\agentfabric
,或者Linux/Mac用户看看/tmp/agentfabric/
,将这个目录删除,他是缓存, - 启动项目做一下测试。
第一次启动失败,提示缺一个
chardet
库,给它装一下。pip install chardet
- 再次启动测试。
上面的2级发200贴错了,应该说100贴,可能是两边等级一个是数字,一个是T+数字,所以这里改一下tool的返回,让他返回T2再测试一下。
result = { "uuid": "0123456", "name": "张三", "level": "T2", }
体验地址
- 随手做了一个
订票模拟器
,体验地址:https://www.modelscope.cn/studios/Tlntin/booking_simulator/summary - 觉得有用的,可以在体验地址,右上角帮忙点一个小心心哦。