项目概述

本项目是一个基于Qwen Agent框架的本地知识库构建与问答系统,实现了AI搜索问答功能。系统通过将本地文档库(docs目录)与大语言模型相结合,支持多模态交互、文档检索和图像处理功能。用户可以针对本地文档内容进行查询,系统能够智能检索相关文档片段并给出准确回答,同时支持AI图像生成和代码执行等增强功能。

本地知识库优势

1. 数据安全性

  • 所有文档存储在本地,不上传至云端
  • 避免敏感信息泄露风险
  • 完全掌控数据访问权限

2. 访问稳定性

  • 不依赖外部网络连接
  • 响应速度更快
  • 无API调用次数限制

3. 成本效益

  • 无需支付外部API费用
  • 一次部署,长期使用
  • 节省云服务成本

4. 定制化程度高

  • 可根据需要随时更新文档库
  • 支持多种文档格式
  • 灵活配置检索策略

5. 隐私保护

  • 企业/个人数据完全私有
  • 符合数据合规要求
  • 避免第三方数据收集

部署说明

环境要求

  • Python >= 3.8
  • Qwen Agent框架
  • DashScope API Key

部署步骤

  1. 安装Qwen Agent依赖
  2. 配置API密钥
  3. 准备文档库
  4. 启动对应模式

API配置

需要设置环境变量:

  • DASHSCOPE_API_KEY:DashScope API密钥

注意事项

  • 需要有效的API密钥
  • 文档库需要预先准备
  • 图像生成依赖外部服务

系统架构与流程

系统架构图

用户输入
Qwen Agent Assistant
LLM模型
工具调用
my_image_gen图像生成
code_interpreter代码执行
文档检索
本地docs目录
多种格式文档
智能回复生成
外部图像API
代码执行环境
返回结果

核心流程

  1. 用户输入查询请求
  2. Assistant智能体接收并处理请求
  3. 系统根据需求选择以下路径:
    • 工具调用(图像生成、代码执行)
    • 文档检索(从本地docs目录获取信息)
  4. LLM模型生成智能回复
  5. 返回给用户

1. 智能体初始化

init_agent_service()函数
def init_agent_service():
    """初始化助手服务"""
    llm_cfg = {
        'model': 'qwen-max',
        'model_server': 'dashscope',
        'api_key': os.getenv('DASHSCOPE_API_KEY'),
        'generate_cfg': {
            'top_p': 0.8
        }
    }

    system_instruction = '''你是一个乐于助人的AI助手。
在收到用户的请求后,你应该:
- 首先绘制一幅图像,得到图像的url,
- 然后运行代码`request.get`以下载该图像的url,
- 最后从给定的文档中选择一个图像操作进行图像处理。
用 `plt.show()` 展示图像。
你总是用中文回复用户。'''
    
    tools = ['my_image_gen', 'code_interpreter']
    file_dir = os.path.join(os.path.dirname(__file__), 'docs')
    files = []
    if os.path.exists(file_dir):
        for file in os.listdir(file_dir):
            file_path = os.path.join(file_dir, file)
            if os.path.isfile(file_path):
                files.append(file_path)
    
    bot = Assistant(llm=llm_cfg,
                    system_message=system_instruction,
                    function_list=tools,
                    files=files)
    return bot

2. 自定义工具实现

my_image_gen工具
  • 功能:AI图像生成服务
  • 参数prompt(文本描述)
  • 实现:通过pollinations.ai API生成图像URL
@register_tool('my_image_gen')
class MyImageGen(BaseTool):
    description = 'AI 绘画(图像生成)服务,输入文本描述,返回基于文本信息绘制的图像 URL。'
    parameters = [{
        'name': 'prompt',
        'type': 'string',
        'description': '期望的图像内容的详细描述',
        'required': True
    }]

    def call(self, params: str, **kwargs) -> str:
        prompt = json5.loads(params)['prompt']
        prompt = urllib.parse.quote(prompt)
        return json5.dumps(
            {'image_url': f'https://image.pollinations.ai/prompt/{prompt}'},
            ensure_ascii=False)
code_interpreter工具
  • 框架内置工具,用于执行代码

3. 文档检索系统

  • 自动加载docs目录下所有文档
  • 支持多种格式:TXT、PDF等
  • 在用户查询时进行文档内容检索
# 获取文件夹下所有文件
file_dir = os.path.join(os.path.dirname(__file__), 'docs')
files = []
if os.path.exists(file_dir):
    # 遍历目录下的所有文件
    for file in os.listdir(file_dir):
        file_path = os.path.join(file_dir, file)
        if os.path.isfile(file_path):  # 确保是文件而不是目录
            files.append(file_path)

4. TUI交互实现

终端交互模式提供连续对话和实时响应功能:

def app_tui():
    """终端交互模式"""
    try:
        bot = init_agent_service()
        messages = []
        while True:
            query = input('user question: ')
            if not query:
                print('user question cannot be empty!')
                continue
                
            messages.append({'role': 'user', 'content': query})

            print("正在处理您的请求...")
            response = []
            current_index = 0
            first_chunk = True
            for response_chunk in bot.run(messages=messages):
                if first_chunk:
                    # 显示召回的文档内容
                    if hasattr(bot, 'retriever') and bot.retriever:
                        print("\\n===== 召回的文档内容 =====")
                        retrieved_docs = bot.retriever.retrieve(query)
                        if retrieved_docs:
                            for i, doc in enumerate(retrieved_docs):
                                print(f"\\n文档片段 {i+1}:")
                                print(f"内容: {doc.page_content}")
                                print(f"元数据: {doc.metadata}")
                        else:
                            print("没有召回任何文档内容")
                        print("===========================\\n")
                    first_chunk = False

                if response_chunk and response_chunk[0]['role'] == 'assistant':
                    assistant_message = response_chunk[0]
                    new_content = assistant_message.get('content', '')
                    print(new_content[current_index:], end='', flush=True)
                    current_index = len(new_content)
                
                response = response_chunk
            
            print()
            messages.extend(response)
    except Exception as e:
        print(f"处理请求时出错: {str(e)}")

5. GUI交互实现

提供Web图形界面和预设问题建议:

def app_gui():
    """图形界面模式,提供 Web 图形界面"""
    try:
        print("正在启动 Web 界面...")
        bot = init_agent_service()
        chatbot_config = {
            'prompt.suggestions': [
                '画一只在写代码的猫',
                '介绍下雇主责任险',
                '帮我画一个宇宙飞船,然后把它变成黑白的'
            ]
        }
        print("Web 界面准备就绪,正在启动服务...")
        WebUI(
            bot,
            chatbot_config=chatbot_config
        ).run()
    except Exception as e:
        print(f"启动 Web 界面失败: {str(e)}")

系统配置

LLM配置

llm_cfg = {
    'model': 'qwen-max',  # 或 'deepseek-v3'
    'model_server': 'dashscope',
    'api_key': os.getenv('DASHSCOPE_API_KEY'),
    'generate_cfg': {
        'top_p': 0.8
    }
}

系统指令

智能体遵循以下行为模式:

  1. 首先生成图像
  2. 下载图像URL
  3. 从文档中选取图像操作进行处理
  4. 显示最终图像

功能特性

1. 双模式交互

  • GUI模式:Web界面,提供图形化交互
  • TUI模式:终端界面,支持命令行交互

2. 文档处理

  • 自动扫描docs目录
  • 支持多格式文档检索
  • 显示召回的文档内容

3. 图像处理

  • 文本到图像生成
  • 图像下载和处理
  • 支持多种图像操作

文件结构

AI-Search-QA/
├── ai_bot-1.py      # 主程序(GUI/TUI模式)
├── qwen-agent-multi-files.py  # 独立运行脚本
├── docs/           # 文档库
└── workspace/      # 工作区

运行说明

启动方式

GUI模式
# 默认启动方式
app_gui()
TUI模式
app_tui()

使用示例

GUI模式预设问题

  • “画一只在写代码的猫”
  • “介绍下雇主责任险”
  • “帮我画一个宇宙飞船,然后把它变成黑白的”

技术栈

  • 框架:Qwen Agent
  • 语言模型:Qwen/DeepSeek
  • API服务:DashScope
  • 图像生成:pollinations.ai
  • 界面:Web UI

扩展功能

工具扩展

通过@register_tool装饰器可添加自定义工具

文档扩展

自动加载docs目录下的新文档

类似场景应用扩展

1. 企业知识库问答系统

在企业内部知识管理场景中,可以将文档库替换为企业内部文档、操作手册、政策文件等,实现:

  • 员工自助查询常见问题
  • 智能解答业务流程相关问题
  • 集成企业内部系统API

2. 教育领域智能辅导

针对教育培训场景,可扩展为:

  • 课程内容智能解答
  • 作业辅助和解题指导
  • 学习资源推荐系统

3. 客服机器人系统

在客户服务场景中,可扩展为:

  • 产品信息查询
  • 订单状态跟踪
  • 常见问题自动解答

4. 法律咨询助手

在法律服务领域,可扩展为:

  • 法律条文查询
  • 案例分析辅助
  • 合同审查建议

5. 医疗健康咨询

在医疗健康领域,可扩展为:

  • 症状初步分析
  • 健康知识普及
  • 用药咨询辅助

6. 电商智能推荐

在电商平台中,可扩展为:

  • 商品信息查询
  • 购买建议生成
  • 售后服务支持

7. 金融理财顾问

在金融服务中,可扩展为:

  • 金融产品介绍
  • 投资建议辅助
  • 风险评估分析

8. 技术文档助手

针对开发者,可扩展为:

  • API文档查询
  • 代码示例生成
  • 技术问题解答

总结

本技术文档详细介绍了基于Qwen Agent框架的本地知识库问答系统。该系统通过将本地文档库与大语言模型相结合,实现了智能问答、文档检索和多模态交互功能。系统具有数据安全、访问稳定、成本效益高等优势,可广泛应用于企业知识管理、教育培训、客户服务等多个领域。通过灵活的工具扩展机制,可进一步增强系统功能,满足不同场景下的应用需求。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐