使用在线 qwen-turbo 模型构建多工具的智能 agent

前言

本文以 chatchat 项目为框架,以线上大模型 qwen-turbo 的基础构建智能 agent ,在已有知识库的基础上,如果用户提问知识库相关的内容则调用 知识库查询工具 获取相关知识进行回复。如果用户提问其他的天气相关问题,则调用 天气查询工具前文已有详细过程,此处不再赘述)来获取相关在线信息。

环境搭建和项目拉取

前文 中有详细部署过程,此处不做赘述。

qwen-turbo api-key 获取

  1. 先注册阿里云账号并进行登陆

  2. 访问然后按照申请教程获取 api-key

  3. 访问 安装教程 ,安装环境,如下命令:

    复制代码
     pip.exe install dashscope
  4. 使用代码,将 dashscope.api_key 换成你申请的 KEY 运行代码进行测试。

    ini 复制代码
    from http import HTTPStatus
    import dashscope
    
    def call_with_messages():
        dashscope.api_key = '你申请的KEY'
        messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
                    {'role': 'user', 'content': '如何做炒西红柿鸡蛋?'}]
    
        response = dashscope.Generation.call(
            dashscope.Generation.Models.qwen_turbo,
            messages=messages,
            result_format='message',  # set the result to be "message" format.
        )
        if response.status_code == HTTPStatus.OK:
            print(response)
        else:
            print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                response.request_id, response.status_code,
                response.code, response.message
            ))
    
    if __name__ == '__main__':
        call_with_messages()

    如果正常返回内容如下,说明一切正常,可以调用:

    json 复制代码
      {"status_code": 200, "request_id": "0c2cd38b-f02c-9407-b891-ff73432317ae", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": "首先,你需要准备以下材料:两个新鲜的西红柿、三个鸡蛋、一小勺盐和适量油。然后,把西红柿切成小块,把鸡蛋打散。接着,在锅里放少量油,将西红柿炒至出汁后加入鸡蛋,继续翻炒,最后撒上少许盐即可完成。"}}]}, "usage": {"input_tokens": 12, "output_tokens": 65, "total_tokens": 77}}

修改配置文件 model_config.py

设置 model_config.py "qwen-api" 字典内容改为如下, 其中 api_key 改成和上面一样你申请的 KEY 值:

vbnet 复制代码
{
    "version": "qwen-turbo",  # 可选包括 "qwen-turbo", "qwen-plus"
    "api_key": "你申请的KEY",  # 请在阿里云控制台模型服务灵积API-KEY管理页面创建
    "provider": "QwenWorker",
}

修改配置文件 server_config.py

FSCHAT_MODEL_WORKERS 字典中加入下内容,这里是为了要给每个运行的在线 API 设置不同的端口:

json 复制代码
"qwen-api": {
    "port": 21006,
},

修改配置文件 prompt_config.py

PROMPT_TEMPLATES["knowledge_base_chat"] 字典中新增下面键值对,这里主要是在配置知识库问答的时候的 prompt 模板:

python 复制代码
"knowledge_base_chat":
    """
    <指令>根据已知信息,简洁和专业的来回答问题。如果无法从中得到答案,请说 "根据已知信息无法回答该问题",不允许在答案中添加编造成分,答案请使用中文。 </指令>
    <已知信息>{{ context }}</已知信息>、
    <问题>{{ question }}</问题>
    """,

修改 PROMPT_TEMPLATES["agent_chat"]["default"] 的内容改为如下:

yaml 复制代码
"""
Answer the following questions as best you can by using some tools appropriately. Please use Chinese for the answer.
If you cannot get an answer from tools, please say "无法解答该问题", No fabrication is allowed in the answer.
You have access to the following tools:

{tools}

请注意,"天气查询工具"只能用来回答询问城市天气的问题;
请注意,除了天气相关的问题外,其他问题都是用"知识库查询工具"用来所有的专业性问题,如果从知识库获取不到相关信息则回答"无法解答该问题";

Use the following format:
Question: the input question you must answer1
Thought: you should always think about what to do and what tools to use.
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can be repeated zero or more times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question


Begin!
history:
{history}
Question: {input}
Thought: {agent_scratchpad}
"""

修改 search_all_knowledge_once.py

_PROMPT_TEMPLATE替换为下面的字符串内容。这个提示模板主要是引导大模型将用户的问题进行理解并按照格式解析出相应的参数。

ini 复制代码
_PROMPT_TEMPLATE = """
用户会提出一个需要你查询知识库的问题,你应该按照我提供的思想进行思考
例如 用户提出的问题是: "请从知识库 samples 中查询复兴城市家园的地址",则按照格式提取的数据库名字和用户提问分别是:  "samples,复兴城市家园的地址"
例如 用户提出的问题是: "请从知识库 address 中查询复兴城市家园的guid",则按照格式提取的数据库名字和用户提问分别是:  "address,复兴城市家园的guid"
这些是你能访问的知识库名称:[{database_names}]

Question: ${{用户的问题}}

你的回答格式应该按照下面的内容,请注意,格式内的```text 等标记都必须输出,这是我用来提取答案的标记。

```text
${{知识库名字}}
```

```output
${{知识库查询的结果}}
```

答案: ${{答案}}

这是一个例子:

问题: 请从知识库samples中查询复兴城市家园的地址

```text samples,复兴城市家园```

```output
复兴城市家园是一个小区,它位于杭州市上城区南星街道玉皇山社区。

Answer: 复兴城市家园是一个小区,地址是杭州市上城区南星街道玉皇山社区。

现在,这是我的问题:
问题: {question}

"""

_PROMPT_TEMPLATE 下面一行我们将加入下面代码,否则报错 'nonetype' object has no attribute 'items'

css 复制代码
kb_list = {x["kb_name"]: x for x in get_kb_details()}
model_container.DATABASE = {name: details['kb_info'] for name, details in kb_list.items()}

同时因为上面的 prompt 模式中会将数据库和问题用","隔开,所以后面为了提取相关的模型返回信息,将 database = text_match.group(1).strip() 修改为 database = text_match.group(1).strip().split(",")[0]

修改 tool_select.py 文件

这里将我们定义的两个工具 天气查询工具(具体配置见前文) 、知识库查询工具都列出来,方便调用。

css 复制代码
from langchain.tools import Tool
from server.agent.tools import *
tools = [    Tool.from_function(        func=weathercheck,        name="天气查询工具",        description="访问互联网,使用这个工具查询中国各城市未来24小时的天气",    ),    Tool.from_function(        func=knowledge_search_once,        name="知识库查询工具",        description="除去天气相关的问题,其他问题都优先访问知识库来获取答案",    ),]

tool_names = [tool.name for tool in tools]

启动项目

首先将准备好的数据切分成小文件,导入 samples 知识库中。

然后选择好左边的参数,对话模式为"自定义Agent问答",LLM 模型为配置的 "qwen-api(Running)" , Temperature 禁止设置为零,否则会报错 "Temperature should be greater than 0.0" ,所以设置为 0.05

然后提问"请根据samples知识库查询西湖花苑的纬度" ,可以发现调用了"知识库查询工具",并经过了"思考",完成了回答"西湖花苑的纬度是30.263473855231503",答案经过查证是完全正确的 。

然后提问"杭州天气如何",发现调用了"天气查询工具" ,通过调用外部接口得到数据,并进行思考总结出来回答"杭州现在的天气晴朗,气温为19度。建议您出门携带雨具以备不时之需,同时注意防晒和保暖。" 。,答案经过查证是完全正确的

至此两个工具可以自由调用,自动根据用户问题进行答案的回复。

参考

相关推荐
killerbasd6 分钟前
总结 7。10
人工智能·算法·机器学习
GlobalInfo7 分钟前
行业报告解读:可穿戴电子织物市场扩张背后,有哪些新机遇?
人工智能·物联网·microsoft
林间码客14 分钟前
RAG系统评估指南:从入门到实践
人工智能·算法·机器学习
菊链诗腾16 分钟前
部署大模型8GB显存128K大模型调优实战
人工智能·调优·本地大模型
龙虾PRO21 分钟前
AI 人才赛道新风口:非传统产品经理如何入局 AI 产品落地赛道
人工智能·产品经理
ylscode22 分钟前
Muse Spark 1.1正式发布:Meta首款付费API背后的智能体野心
人工智能
lkshop23 分钟前
GEO 技术入门:大模型如何检索、理解并引用你的内容
人工智能·geo·蓝空geo
Claire清禾23 分钟前
AI自动初筛简历怎么实现?
人工智能
HeteroCat26 分钟前
循环工程(loop engineering) -- from 谷歌云AI总监Addy Osmani
人工智能
Mr.朱鹏27 分钟前
【FastAPI 全栈实战 | 第2篇】Pydantic 数据校验与响应模型 —— 让 Bug 死在请求进来的那一刻
人工智能·python·fastapi