WeKnora实操手册:如何用Python批量导入知识库并触发初始问答测试
1. 为什么需要批量导入知识库?——从手动粘贴到自动化工作流
你有没有遇到过这样的场景:手头有几十份产品说明书、上百页会议纪要、十几份合同条款,想让AI快速帮你从中提取关键信息?每次打开WeKnora网页,复制粘贴、输入问题、点击提交……重复几十次?眼睛酸了,手指麻了,效率却卡在“人工搬运”这一步。
WeKnora本身设计得非常友好——粘贴即用,提问即答。但它的真正威力,不在单次交互,而在于把“即时知识库”变成可编程、可调度、可集成的基础设施。当你能把知识文档自动加载、把标准问题自动发送、把回答结果自动归档,WeKnora就不再是一个工具,而是一个嵌入你工作流的“知识引擎”。
这篇手册不讲概念,不堆参数,只做一件事:手把手带你用Python,把本地文本文件批量导入WeKnora,并自动发起一组预设问题进行首轮效果验证。全程无需打开浏览器,不依赖鼠标点击,所有操作通过HTTP请求完成。你会得到一个可复用的脚本,下次换一批文档,改两行路径,就能立刻跑起来。
小白也能上手——只要你会用记事本保存文本、会运行.py文件;工程师也能延伸——脚本结构清晰,接口封装完整,后续可轻松接入定时任务、企业微信通知或内部BI系统。
2. WeKnora的底层通信机制:我们到底在和谁对话?
在写代码前,先破除一个常见误解:WeKnora Web界面不是“唯一入口”。它背后是一个标准的HTTP服务,所有你在网页上做的操作——粘贴知识、提交问题、获取回答——本质上都是向某个API地址发送POST请求。
我们不需要逆向工程,WeKnora镜像已将核心接口开放且设计简洁:
- 知识库导入接口:
POST /api/knowledge
发送纯文本内容,服务端将其设为当前会话的“背景知识” - 问答请求接口:
POST /api/ask
发送一个问题字符串,服务端基于最新导入的知识作答 - 响应格式统一:JSON,含
success、answer、error等字段,结构稳定,易于解析
关键理解:WeKnora没有“数据库持久化”概念。每次调用
/api/knowledge,相当于给AI“临时喂一段新教材”;随后的所有/api/ask请求,都严格在这本教材范围内作答。这正是它实现“零幻觉”的技术基础——知识边界由你实时定义,而非模型自身记忆。
所以,我们的Python脚本只需做三件事:
- 读取本地
.txt文件内容(你的知识源) - 调用
/api/knowledge上传 - 针对该知识,循环调用
/api/ask发送测试问题
没有登录态、没有Token、没有复杂鉴权——极简设计,正是为自动化而生。
3. 实战准备:环境搭建与接口连通性验证
3.1 确认WeKnora服务已就绪
首先,请确保WeKnora镜像已在本地运行。如果你是通过Docker启动,典型命令如下:
docker run -d --gpus all -p 8080:8080 -v $(pwd)/models:/root/.ollama/models weknora:latest服务启动后,访问http://localhost:8080应能看到Web界面。但脚本不依赖页面,我们直接验证API:
打开终端,执行这条curl命令(Windows用户请用Git Bash或WSL):
curl -X POST http://localhost:8080/api/knowledge \ -H "Content-Type: text/plain" \ -d "地球是太阳系的第三颗行星,直径约12742公里。"如果返回{"success":true},说明知识导入接口畅通。
再测试问答:
curl -X POST http://localhost:8080/api/ask \ -H "Content-Type: application/json" \ -d '{"question":"地球是第几颗行星?"}'预期返回:{"success":true,"answer":"地球是太阳系的第三颗行星。"}
连通性验证通过。接下来,我们用Python把这两步自动化。
3.2 Python环境与依赖安装
新建一个文件夹,创建requirements.txt:
requests==2.31.0执行安装:
pip install -r requirements.txt仅需requests库——轻量、可靠、无额外依赖。不引入Flask、FastAPI等框架,因为我们是客户端,不是服务端。
4. 核心脚本详解:批量导入+自动问答测试
4.1 脚本结构总览
我们将编写一个名为weknora_batch_loader.py的脚本,包含四个逻辑块:
- 配置区:服务地址、知识文件路径、测试问题列表
- 知识导入函数:读取文件、发送POST、处理响应
- 问答测试函数:对单个知识源,批量提问并记录结果
- 主流程:遍历所有文本文件,依次导入并测试
结构清晰,职责单一,便于后续扩展(比如增加失败重试、结果导出Excel、超时控制等)。
4.2 完整可运行代码
# weknora_batch_loader.py import os import time import requests import json # ==================== 配置区 ==================== # WeKnora服务地址(根据你的实际部署修改) WEKNORA_URL = "http://localhost:8080" # 知识库文本文件所在文件夹(支持.txt格式) KNOWLEDGE_DIR = "./knowledge_docs" # 预设测试问题列表——每个问题都应能从知识文本中直接找到答案 TEST_QUESTIONS = [ "这个产品的核心功能是什么?", "适用人群有哪些?", "是否支持离线使用?", "售后服务联系方式是什么?" ] # 请求超时时间(秒) TIMEOUT = 30 # =============================================== def load_knowledge_from_file(file_path): """从指定.txt文件读取内容,并导入WeKnora""" try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read().strip() if not content: print(f" 跳过空文件:{file_path}") return False # 调用知识导入接口 response = requests.post( f"{WEKNORA_URL}/api/knowledge", data=content, headers={"Content-Type": "text/plain"}, timeout=TIMEOUT ) if response.status_code == 200: result = response.json() if result.get("success"): print(f" 知识导入成功:{os.path.basename(file_path)}") return True else: print(f" 导入失败(服务返回):{file_path} -> {result.get('error', '未知错误')}") return False else: print(f" 导入失败(HTTP {response.status_code}):{file_path}") return False except FileNotFoundError: print(f" 文件未找到:{file_path}") return False except requests.exceptions.Timeout: print(f" 请求超时:{file_path}") return False except Exception as e: print(f" 导入异常:{file_path} -> {str(e)}") return False def run_test_questions(file_name): """对当前已导入的知识,执行预设问题测试""" results = [] for i, question in enumerate(TEST_QUESTIONS, 1): try: payload = {"question": question} response = requests.post( f"{WEKNORA_URL}/api/ask", json=payload, timeout=TIMEOUT ) if response.status_code == 200: result = response.json() if result.get("success"): answer = result.get("answer", "").strip() # 简单判断:答案非空即视为有效响应 status = "" if answer else "❓" results.append({ "question": question, "answer": answer, "status": status }) print(f" {status} Q{i}: {question[:40]}... -> {answer[:50]}...") else: error_msg = result.get("error", "无错误信息") results.append({ "question": question, "answer": f"ERROR: {error_msg}", "status": "" }) print(f" Q{i}: {question[:40]}... -> 错误:{error_msg}") else: results.append({ "question": question, "answer": f"HTTP {response.status_code}", "status": "" }) print(f" Q{i}: {question[:40]}... -> HTTP {response.status_code}") except Exception as e: results.append({ "question": question, "answer": f"EXCEPTION: {str(e)}", "status": "" }) print(f" Q{i}: {question[:40]}... -> 异常:{str(e)}") # 人为添加小延迟,避免请求过于密集(可选) time.sleep(0.5) return results def main(): """主流程:遍历知识文件夹,逐个导入并测试""" print(" WeKnora批量导入与问答测试启动") print(f" 服务地址:{WEKNORA_URL}") print(f" 知识文件夹:{KNOWLEDGE_DIR}") print(f" 测试问题数:{len(TEST_QUESTIONS)}") print("-" * 50) # 检查知识文件夹是否存在 if not os.path.isdir(KNOWLEDGE_DIR): print(f" 错误:知识文件夹不存在 -> {KNOWLEDGE_DIR}") return # 获取所有.txt文件 txt_files = [f for f in os.listdir(KNOWLEDGE_DIR) if f.lower().endswith('.txt')] if not txt_files: print(f" 错误:知识文件夹中未找到.txt文件") return print(f" 找到 {len(txt_files)} 个待处理文本文件") # 逐个处理 all_results = {} for idx, filename in enumerate(sorted(txt_files), 1): file_path = os.path.join(KNOWLEDGE_DIR, filename) print(f"\n--- {idx}. 处理文件:{filename} ---") # 步骤1:导入知识 if not load_knowledge_from_file(file_path): print(f" 跳过后续测试:{filename}") continue # 步骤2:执行问答测试 print(" 开始自动问答测试...") results = run_test_questions(filename) all_results[filename] = results # 每个文件处理完后加空行,提升日志可读性 print() # 输出汇总报告 print("=" * 50) print(" 测试完成汇总") print("=" * 50) for filename, results in all_results.items(): success_count = sum(1 for r in results if r["status"] == "") total = len(results) print(f"📄 {filename}: {success_count}/{total} 问题获得有效回答") # 提示下一步 print("\n 小贴士:") print("• 所有回答已实时打印,如需保存为JSON,请在run_test_questions()中添加写入逻辑") print("• 如需更换测试问题,直接修改TEST_QUESTIONS列表即可") print("• 若某文件导入失败,请检查编码(推荐UTF-8无BOM)及内容长度(WeKnora默认支持万字级)") if __name__ == "__main__": main()4.3 如何使用这个脚本?
- 准备知识文件:在项目根目录下创建
knowledge_docs文件夹,放入你的.txt文档(如product_manual.txt,meeting_notes.txt) - 调整配置:修改脚本顶部的
WEKNORA_URL(若服务端口不是8080)、TEST_QUESTIONS(替换成你业务中最关心的5个问题) - 运行脚本:终端进入项目目录,执行
python weknora_batch_loader.py
你会看到类似这样的实时输出:
WeKnora批量导入与问答测试启动 服务地址:http://localhost:8080 知识文件夹:./knowledge_docs 测试问题数:4 -------------------------------------------------- 找到 2 个待处理文本文件 --- 1. 处理文件:product_manual.txt --- 知识导入成功:product_manual.txt 开始自动问答测试... Q1: 这个产品的核心功能是什么? -> 核心功能包括智能语音识别、离线翻译和实时笔记... Q2: 适用人群有哪些? -> 主要面向商务人士、学生和语言学习者。 ❓ Q3: 是否支持离线使用? -> 支持离线语音识别和翻译,但部分高级功能需联网。 Q4: 售后服务联系方式是什么? -> 拨打400-123-4567或发送邮件至support@xxx.com。 --- 2. 处理文件:meeting_notes.txt --- 知识导入成功:meeting_notes.txt 开始自动问答测试... Q1: 这个产品的核心功能是什么? -> 本次会议未讨论具体产品功能。 Q2: 适用人群有哪些? -> ERROR: 无法从提供的背景知识中找到相关信息。 ...5. 进阶技巧与避坑指南
5.1 文本预处理:让知识更“干净”,回答更精准
WeKnora的“零幻觉”能力,高度依赖你提供的文本质量。以下预处理建议能显著提升效果:
删除无关字符:PDF转TXT常带页眉页脚、乱码、多余空行。脚本中可在
load_knowledge_from_file()里加入清洗逻辑:# 在读取content后添加 content = re.sub(r'\s+', ' ', content) # 合并连续空白符 content = re.sub(r'第\s*\d+\s*页', '', content) # 删除页码 content = content.strip()分段导入长文档:单个文本超过5000字时,可按章节切分,分别导入并测试。例如,将《用户手册》拆为“安装指南.txt”、“功能说明.txt”、“故障排除.txt”,再为每部分定制专属问题。
添加结构化提示:在文本开头加入一行说明,引导AI关注重点。例如:
【本文档类型】:手机产品规格说明书 【关键字段】:型号、屏幕尺寸、电池容量、摄像头参数、保修期 【正文开始】 型号:X10 Pro...
5.2 问题设计原则:问得准,才能答得准
很多用户反馈“AI答非所问”,问题往往出在提问方式。记住三个原则:
- 具体明确: “这个产品怎么样?” → “电池容量是多少毫安时?”
- 限定范围: “有哪些功能?” → “在‘核心功能’章节中列出的三项功能是什么?”
- 避免主观: “这个方案好不好?” → “方案中提到的实施周期是几天?”
你的TEST_QUESTIONS列表,就是一份“黄金问题清单”。建议每份知识文档对应一套专属问题,而非通用模板。
5.3 常见问题排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
Connection refused | WeKnora服务未启动,或端口被占用 | docker ps确认容器运行;netstat -ano | findstr :8080查端口占用 |
HTTP 413 Request Entity Too Large | 文本过大(WeKnora默认限制约10MB) | 分割大文件;或修改Ollama模型上下文长度(需重启) |
| 所有问题都返回“无法找到相关信息” | 文本中确实不含答案关键词;或存在错别字/术语不一致 | 用Ctrl+F在原文搜索问题中的关键词;检查术语统一性(如“锂电池”vs“锂电”) |
| 回答截断、不完整 | Ollama模型输出长度限制 | 在/api/ask请求中添加max_tokens参数(需WeKnora版本支持),或选用更大上下文模型 |
6. 总结:让知识真正流动起来
WeKnora的价值,从来不止于“网页上问一个问题”。当你用Python把它接入自己的工作流,它就变成了:
- 文档处理流水线:新合同入库 → 自动提取甲方/乙方/金额/违约条款 → 推送至法务系统
- 客服知识中枢:每周更新FAQ → 脚本自动导入 → 生成100条测试问答 → 验证知识覆盖度
- 学习辅助工具:学生上传课堂笔记 → 脚本自动生成5道随堂测验 → 即时反馈答案
这篇手册没有讲高深算法,只给你一个开箱即用的自动化支点。它足够简单,让你今天就能跑起来;也足够扎实,为你后续构建更复杂的AI应用打下基础。
真正的技术生产力,不在于模型多大,而在于你能否把它稳稳地、可靠地、一遍又一遍地,用在解决真实问题的路上。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。