基于国产Qwen Agent的极简AI搜索问答系统
本项目构建了一个基于Qwen Agent框架的本地知识库问答系统,具有以下特点:1) 数据存储在本地,确保安全性和隐私保护;2) 支持文档检索、AI图像生成和代码执行功能;3) 系统架构包含用户交互、智能体处理、大模型推理和工具调用等模块;4) 提供终端交互界面,可显示召回的文档内容。系统优势包括数据安全、访问稳定、成本效益高和定制灵活,适用于企业或个人构建私有知识库解决方案。部署需要Python
项目概述
本项目是一个基于Qwen Agent框架的本地知识库构建与问答系统,实现了AI搜索问答功能。系统通过将本地文档库(docs目录)与大语言模型相结合,支持多模态交互、文档检索和图像处理功能。用户可以针对本地文档内容进行查询,系统能够智能检索相关文档片段并给出准确回答,同时支持AI图像生成和代码执行等增强功能。
本地知识库优势
1. 数据安全性
- 所有文档存储在本地,不上传至云端
- 避免敏感信息泄露风险
- 完全掌控数据访问权限
2. 访问稳定性
- 不依赖外部网络连接
- 响应速度更快
- 无API调用次数限制
3. 成本效益
- 无需支付外部API费用
- 一次部署,长期使用
- 节省云服务成本
4. 定制化程度高
- 可根据需要随时更新文档库
- 支持多种文档格式
- 灵活配置检索策略
5. 隐私保护
- 企业/个人数据完全私有
- 符合数据合规要求
- 避免第三方数据收集
部署说明
环境要求
- Python >= 3.8
- Qwen Agent框架
- DashScope API Key
部署步骤
- 安装Qwen Agent依赖
- 配置API密钥
- 准备文档库
- 启动对应模式
API配置
需要设置环境变量:
DASHSCOPE_API_KEY:DashScope API密钥
注意事项
- 需要有效的API密钥
- 文档库需要预先准备
- 图像生成依赖外部服务
系统架构与流程
系统架构图
核心流程
- 用户输入查询请求
- Assistant智能体接收并处理请求
- 系统根据需求选择以下路径:
- 工具调用(图像生成、代码执行)
- 文档检索(从本地docs目录获取信息)
- LLM模型生成智能回复
- 返回给用户
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
}
}
系统指令
智能体遵循以下行为模式:
- 首先生成图像
- 下载图像URL
- 从文档中选取图像操作进行处理
- 显示最终图像
功能特性
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框架的本地知识库问答系统。该系统通过将本地文档库与大语言模型相结合,实现了智能问答、文档检索和多模态交互功能。系统具有数据安全、访问稳定、成本效益高等优势,可广泛应用于企业知识管理、教育培训、客户服务等多个领域。通过灵活的工具扩展机制,可进一步增强系统功能,满足不同场景下的应用需求。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)