使用在线 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度。建议您出门携带雨具以备不时之需,同时注意防晒和保暖。" 。,答案经过查证是完全正确的

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

参考

相关推荐
MidJourney中文版8 分钟前
深度报告:中老年AI陪伴机器人需求分析
人工智能·机器人
王上上34 分钟前
【论文阅读41】-LSTM-PINN预测人口
论文阅读·人工智能·lstm
智慧化智能化数字化方案1 小时前
69页全面预算管理体系的框架与落地【附全文阅读】
大数据·人工智能·全面预算管理·智慧财务·智慧预算
PyAIExplorer1 小时前
图像旋转:从原理到 OpenCV 实践
人工智能·opencv·计算机视觉
Wilber的技术分享1 小时前
【机器学习实战笔记 14】集成学习:XGBoost算法(一) 原理简介与快速应用
人工智能·笔记·算法·随机森林·机器学习·集成学习·xgboost
19891 小时前
【零基础学AI】第26讲:循环神经网络(RNN)与LSTM - 文本生成
人工智能·python·rnn·神经网络·机器学习·tensorflow·lstm
ansurfen1 小时前
我的第一个AI项目:从零搭建RAG知识库的踩坑之旅
python·llm
burg_xun1 小时前
【Vibe Coding 实战】我如何用 AI 把一张草图变成了能跑的应用
人工智能
酌沧2 小时前
AI做美观PPT:3步流程+工具测评+避坑指南
人工智能·powerpoint
狂师2 小时前
啥是AI Agent!2025年值得推荐入坑AI Agent的五大工具框架!(新手科普篇)
人工智能·后端·程序员