基于本地部署的 LLM(Qwen3.5:4b)和 RAG(Retrieval-Augmented Generation)技术,从中文新闻数据集构建私有知识库,实现基于事实的问答。
用户问题
│
▼
┌──────────────┐ 相似度检索 ┌──────────────┐
│ Embedding │ ──────────────► │ ChromaDB │
│ bge-small-zh │ │ 向量数据库 │
└──────────────┘ └──────┬───────┘
│ Top-K chunks
▼
┌──────────────┐
│ Prompt 构建 │
│ (上下文+问题) │
└──────┬───────┘
│
▼
┌──────────────┐
│ Qwen3.5:4b │
│ (Ollama) │
└──────┬───────┘
│
▼
回答 + 来源
| 组件 | 技术 | 说明 |
|---|---|---|
| LLM | Qwen3.5:4b via Ollama | 本地推理,支持 thinking 模式 |
| Embedding | BAAI/bge-small-zh-v1.5 | 中文语义向量模型,GPU 加速 |
| 向量数据库 | ChromaDB | 轻量级本地持久化 |
| 数据源 | OpenNewsArchive (HuggingFace) | 880万篇中文新闻 |
| 框架 | LangChain | RAG 编排 |
| CLI | Rich | 终端美化输出 |
# 1. 创建 conda 环境
conda create -n myrag python=3.10 -y
conda activate myrag
# 2. 安装 PyTorch(CUDA 版本)
pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu130
# 3. 安装项目依赖
pip install -r requirements.txt
# 4. 拉取 LLM 模型
ollama pull qwen3.5:4b# 导入 500 篇新闻(默认)
python ingest.py
# 或指定数量
python ingest.py -n 100
# 自定义切块参数
python ingest.py -n 200 --chunk-size 500 --chunk-overlap 100运行后会在当前目录生成 chroma_db/ 文件夹。
python main.py进入交互界面后:
- 直接输入中文问题进行查询
- 输入
/think切换推理模式(ON: 显示思维链推理过程 / OFF: 快速回答) - 输入
quit退出
你的问题 > 股市近期表现如何?
─────────────────── 推理过程 ───────────────────
(模型的思维链推理...)
───────────────────── 回答 ─────────────────────
根据检索到的新闻报道,近期A股市场表现强劲...
─────────────────── 参考来源 ───────────────────
[1] 后市将展开慢牛行情
[2] 沪深股市再创新高
...
耗时统计: 检索 0.3s | LLM 生成 45.2s | 总计 45.5s
NewsRAG/
├── README.md # 本文件
├── requirements.txt # Python 依赖
├── ingest.py # 数据导入管线(加载→切块→向量化→存储)
├── rag.py # RAG 查询引擎(检索→构建 Prompt→调用 LLM)
├── main.py # CLI 交互界面
└── chroma_db/ # (运行后生成)持久化的向量数据库
可在 rag.py 中修改以下常量:
| 常量 | 默认值 | 说明 |
|---|---|---|
LLM_MODEL |
qwen3.5:4b |
Ollama 模型名称 |
EMBEDDING_MODEL |
BAAI/bge-small-zh-v1.5 |
Embedding 模型 |
OLLAMA_URL |
http://localhost:11434 |
Ollama 服务地址 |