系列篇章💥
引言
在人工智能的不断演进中,大模型如雨后春笋般涌现,它们在处理语言、生成内容、辅助决策等方面展现出令人瞩目的能力。qwen-agent,作为这一领域的新星,以其独特的架构和功能,为开发者提供了与这些强大模型互动的新途径。特别是其rag(retrieval-augmented generation)能力,它允许模型在生成回答前检索相关信息,极大地增强了ai助手的智能性和实用性。本文将深入探讨qwen-agent的rag智能助手实践,揭示其如何通过结合ai大模型与外部工具,实现更深层次的自动化服务。
一、概述
本文专注于探索 qwen-agent 框架中的 rag(retrieval-augmented generation)功能,这一技术通过增强 ai 模型的检索能力,显著提升了智能助手的性能和应用范围。
rag 技术概览
rag 技术通过整合检索机制,允许 ai 模型在生成回答之前访问和分析大量外部数据。这种能力使得智能助手能够提供更加准确和详细的信息,尤其是在处理需要广泛背景知识的问题时。
qwen-agent 与 rag
qwen-agent 框架通过其 rag 实现,为开发者提供了构建智能助手的工具。本文将详细介绍如何在 qwen-agent 中部署和使用 rag 功能,以及如何通过它来增强 ai 助手的信息检索和生成能力。
通过一系列实践案例,本文将展示 rag 智能助手在处理文档检索和问答任务中的实际应用。这些案例将涵盖从技术配置到功能实现的完整流程,为开发者提供宝贵的参考和指导。
二、安装实操
qwen-agent 的安装部署过程简单明了,可以通过以下步骤快速开始:
pip install -u qwen-agent
从 github 安装最新版本:
git clone https://github.com/qwenlm/qwen-agent.git
cd qwen-agent
pip install -e ./
安装可选依赖(如果需要内置 gui 支持):
pip install -u qwen-agent[gui]
# 或,从源代码安装最新版本: pip install -e ./[gui]
三、本地模型部署
先采用vllm进行qwen2-7b模型部署,启用openai风格的api接口,
下载qwen2-7b-instruct 到本地/root/autodl-tmp/qwen目录,执行下面命令,启动openai风格的api接口
python -m vllm.entrypoints.openai.api_server --model /root/autodl-tmp/qwen/qwen2-7b-instruct --served-model-name qwen2-7b-instruct --max-model-len=2048
具体参考文章:《部署高效ai模型:使用vllm进行qwen2-7b模型推理》
四、rag智能助手
1、导入依赖库
from qwen_agent.agents import assistant
# 从qwen_agent.llm模块导入get_chat_model函数
from qwen_agent.llm import get_chat_model
2、定义一个agent
# define the agent
bot = assistant(llm={'model': 'qwen2-7b-instruct','model_server': 'http://localhost:8000/v1'},
name='assistant',
description='使用rag检索并回答,支持文件类型:pdf/word/ppt/txt/html。')
3、机器人对话调用1
messages = [{'role': 'user', 'content': [{'text': '文章标题是什么?'}, {'file': '谜语问答游戏.docx'}]}]
for rsp in bot.run(messages):
print(rsp)
2024-07-02 09:13:01,156 - split_query.py - 82 - info - extracted info from query: {"information": ["文章标题
2024-07-02 09:13:01,598 - memory.py - 113 - info - {"keywords_zh": ["文章标题"], "keywords_en": ["article title"], "text": "文章标题"}
2024-07-02 09:13:01,599 - simple_doc_parser.py - 326 - info - start parsing 谜语问答游戏.docx...
2024-07-02 09:13:01,656 - simple_doc_parser.py - 365 - info - finished parsing 谜语问答游戏.docx. time spent: 0.05669236183166504 seconds.
2024-07-02 09:13:01,658 - doc_parser.py - 114 - info - start chunking 谜语问答游戏.docx (谜语问答游戏.docx)...
2024-07-02 09:13:01,658 - doc_parser.py - 132 - info - finished chunking 谜语问答游戏.docx (谜语问答游戏.docx). time spent: 5.7220458984375e-05 seconds.
2024-07-02 09:13:01,659 - base_search.py - 55 - info - all tokens: 311
2024-07-02 09:13:01,660 - base_search.py - 58 - info - use full ref
[{'role': 'assistant', 'content': '文章', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '文章标题', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '文章标题是', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '文章标题是“', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '文章标题是“谜', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '文章标题是“谜语', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '文章标题是“谜语问答', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '文章标题是“谜语问答游戏', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '文章标题是“谜语问答游戏”。', 'name': 'assistant'}]
4、机器人对话调用2
messages = [{'role': 'user', 'content': [{'text': '什么东西会上升但不会下降?'}, {'file': '谜语问答游戏.docx'}]}]
for rsp in bot.run(messages):
print(rsp)
输出:
2024-07-02 09:17:03,950 - split_query.py - 82 - info - extracted info from query: {"information": ["什么东西会上升但不会下降?
2024-07-02 09:17:04,488 - memory.py - 113 - info - {"keywords_zh": ["上升", "下降"], "keywords_en": ["increase", "decrease"], "text": "什么东西会上升但不会下降?"}
2024-07-02 09:17:04,515 - simple_doc_parser.py - 324 - info - read parsed 谜语问答游戏.docx from cache.
2024-07-02 09:17:04,516 - doc_parser.py - 114 - info - start chunking 谜语问答游戏.docx (谜语问答游戏.docx)...
2024-07-02 09:17:04,516 - doc_parser.py - 132 - info - finished chunking 谜语问答游戏.docx (谜语问答游戏.docx). time spent: 3.743171691894531e-05 seconds.
2024-07-02 09:17:04,517 - base_search.py - 55 - info - all tokens: 311
2024-07-02 09:17:04,517 - base_search.py - 58 - info - use full ref
[{'role': 'assistant', 'content': '你的', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '你的年龄', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '你的年龄会上', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '你的年龄会上升', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '你的年龄会上升但', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '你的年龄会上升但不会', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '你的年龄会上升但不会下降', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '你的年龄会上升但不会下降。', 'name': 'assistant'}]
5、机器人对话调用3
messages = [{'role': 'user', 'content': [{'text': '什么是属于你的,但其他人比你使用它更多?'}, {'file': '谜语问答游戏.docx'}]}]
for rsp in bot.run(messages):
print(rsp)
输出:
2024-07-02 09:16:37,530 - split_query.py - 82 - info - extracted info from query: {"information": ["属于你的,但其他人比你使用它更多
2024-07-02 09:16:38,446 - simple_doc_parser.py - 324 - info - read parsed 谜语问答游戏.docx from cache.
2024-07-02 09:16:38,447 - doc_parser.py - 114 - info - start chunking 谜语问答游戏.docx (谜语问答游戏.docx)...
2024-07-02 09:16:38,448 - doc_parser.py - 132 - info - finished chunking 谜语问答游戏.docx (谜语问答游戏.docx). time spent: 5.7220458984375e-05 seconds.
2024-07-02 09:16:38,449 - base_search.py - 55 - info - all tokens: 311
2024-07-02 09:16:38,449 - base_search.py - 58 - info - use full ref
[{'role': 'assistant', 'content': '这个问题', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常交流', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常交流中', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常交流中,', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常交流中,以及其他', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常交流中,以及其他人的', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常交流中,以及其他人的文件', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常交流中,以及其他人的文件、', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常交流中,以及其他人的文件、记录', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常交流中,以及其他人的文件、记录中', 'name': 'assistant'}]
[{'role': 'assistant', 'content': '这个问题的答案是:“你的名字。”因为你的名字是属于你的,但其他人可以更多地使用它,比如在各种社交场合、日常交流中,以及其他人的文件、记录中。', 'name': 'assistant'}]
本地知识库文档:谜语问答游戏.docx
结语
本文的探索之旅让我们深入了解了 qwen-agent 的 rag(retrieval-augmented generation)能力,这是一种结合了检索和生成的先进 ai 技术。通过实践案例,我们展示了如何利用 qwen-agent 构建一个能够理解和回应复杂查询的智能助手,这不仅增强了 ai 的交互性,也极大地提升了用户体验。
rag 智能助手通过访问和分析外部文档,为用户的问题提供了精准的答案。这项技术的应用前景广阔,无论是在企业知识管理、客户服务还是教育领域,都能发挥重要作用。随着技术的不断进步和优化,我们有理由相信 rag 智能助手将在 ai 领域扮演越来越重要的角色。
项目地址
🎯🔖更多专栏系列文章:ai大模型提示工程完全指南、ai大模型探索之路(零基础入门)、ai大模型预训练微调进阶、ai大模型开源精选实践、ai大模型rag应用探索实践🔥🔥🔥 其他专栏可以查看📑
发表评论