一个用于与您的文档进行聊天的生产就绪型RAG(检索增强生成)系统
注重隐私 • 通过MCP扩展 • 多提供商AI支持
功能 • 快速开始 • 架构 • MCP集成 • 配置 • API参考

Xantus是一个注重隐私的RAG系统,它允许您使用AI与文档进行聊天。与仅限云的解决方案不同,Xantus可以完全本地运行或使用云提供商——由您选择。
Xantus建立在一个现代、模块化的架构之上:
┌─────────────────────────────────────────────────────────┐
│ 用户 │
└────────────┬────────────────────────────┬───────────────┘
│ │
┌────────▼────────┐ ┌────────▼─────────┐
│ Streamlit UI │ │ API客户端 │
│ (端口8501) │ │ (curl, SDK) │
└────────┬────────┘ └────────┬─────────┘
│ │
└────────────┬───────────────┘
│
┌────────▼─────────┐
│ FastAPI服务器 │
│ (端口8000) │
└────────┬─────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼───────┐ ┌────▼─────┐
│ 聊天服务│ │导入服务│ │ MCP │
└──────┬──────┘ └──────┬───────┘ │ 服务 │
│ │ └────┬─────┘
│ │ │
┌──────▼───────────────▼──────────────▼─────┐
│ 依赖注入容器 │
│ (LLM • 嵌入式向量存储 • 向量存储 • MCP) │
└────────────────────┬──────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────▼────┐ ┌─────▼─────┐ ┌───▼────┐
│ LLM │ │ 嵌入式向量存储│ │ 向量存储 │
│提供商 │ │ 提供商 │ │ 存储 │
└─────────┘ └───────────┘ └────────┘
│Ollama │ │HuggingFace│ │Chroma │
│OpenAI │ │ Ollama │ │Qdrant │
│Anthropic│ │ OpenAI │ └────────┘
└─────────┘ └───────────┘
┌──────────┐
│MCP服务器│
│TypeScript│
└──────────┘
│计算器│
│文件系统│
│文本处理│
└──────────┘
| 组件 | 技术 | 目的 |
|---|---|---|
| 后端 | FastAPI + Python 3.10+ | 高性能异步API |
| RAG框架 | LlamaIndex | 文档索引和检索 |
| 用户界面 | Streamlit | 用户友好的聊天界面 |
| 配置 | Pydantic + YAML | 类型安全设置 |
| 依赖注入 | Injector | 清晰的依赖注入 |
| 向量数据库 | ChromaDB / Qdrant | 语义搜索 |
| MCP | 模型上下文协议 | 外部工具集成 |
xantus/
├── .env.example # 环境变量模板
├── .gitignore # Git忽略模式
├── config.yaml # 主配置文件
├── requirements.txt # Python依赖项
├── setup_mcp.sh # MCP设置自动化
├── start_api.sh # API服务器启动脚本
├── start_ui.sh # 用户界面启动脚本
│
├── xantus/ # 主应用包
│ ├── __init__.py
│ ├── main.py # FastAPI应用程序入口
│ ├── container.py # 依赖注入设置
│ │
│ ├── api/ # API端点
│ │ ├── chat_router.py # /v1/chat/completions
│ │ ├── ingest_router.py # /v1/ingest/*
│ │ └── embeddings_router.py # /v1/embeddings
│ │
│ ├── services/ # 业务逻辑
│ │ ├── chat_service.py # RAG驱动的聊天
│ │ ├── ingest_service.py # 文档处理
│ │ └── mcp_service.py # MCP工具编排
│ │
│ ├── components/ # 组件工厂
│ │ ├── llm/
│ │ │ └── llm_factory.py # LLM提供商工厂
│ │ ├── embeddings/
│ │ │ └── embedding_factory.py
│ │ └── vector_store/
│ │ └── vector_store_factory.py
│ │
│ ├── models/ # 数据模型
│ │ └── schemas.py # Pydantic请求/响应模型
│ │
│ └── config/ # 配置
│ └── settings.py # 使用Pyd
│
├── ui/ # 用户界面
│ └── streamlit_app.py # Streamlit聊天应用程序
│
├── mcp-servers/ # MCP集成(git子模块)
│ └── mcp-starter-template-ts/ # TypeScript MCP服务器
│ ├── dist/ # 编译JavaScript
│ │ └── start.js # 入口点
│ └── src/ # TypeScript源代码
│ └── tools/ # 工具实现
│
├── data/ # 数据目录(git忽略)
│ └── vector_store/ # 持久化向量嵌入
│
└── docs/ # 文档
├── MCP_INTEGRATION.md # MCP技术指南
├── README_MCP.md # MCP快速入门
└── SETUP_COMPLETE.md # 设置总结
python --version)node --version)# 克隆带有MCP子模块
git clone --recurse-submodules https://github.com/onamfc/rag-chat
cd xantus
# 或者如果您已经克隆但没有子模块:
git submodule update --init --recursive
# 创建虚拟环境
python -m venv venv
# 激活它
source venv/bin/activate # Linux/Mac
# 或者
venv\Scripts\activate # Windows
pip install -r requirements.txt
# 这将:
# - 初始化MCP子模块
# - 安装npm依赖项
# - 构建TypeScript MCP服务器
./setup_mcp.sh
# 复制示例文件
cp .env.example .env
# 编辑.env并添加您的API密钥(如果使用云提供商)
# 对于Anthropic:
XANTUS_LLM__API_KEY=sk-ant-api03-your-key-here
# 对于OpenAI:
# XANTUS_LLM__API_KEY=sk-your-openai-key-here
编辑config.yaml以选择您的提供商:
选项A:完全本地(注重隐私)
llm:
provider: ollama
model: llama3.2
embedding:
provider: huggingface
model: BAAI/bge-small-en-v1.5
mcp:
enabled: true # 启用MCP工具
选项B:云驱动(Anthropic)
llm:
provider: anthropic
model: claude-sonnet-4-20250514
api_key: null # 从.env读取
embedding:
provider: huggingface # 保持嵌入式向量存储本地
model: BAAI/bge-small-en-v1.5
mcp:
enabled: true
选项C:OpenAI
llm:
provider: openai
model: gpt-4
api_key: null # 从.env读取
embedding:
provider: openai
model: text-embedding-3-small
api_key: null
# 选项1:使用启动脚本
./start_api.sh
# 选项2:手动启动
python -m xantus.main
# API将在http://localhost:8000可用
# API文档在http://localhost:8000/docs
您应该看到:
INFO - 正在启动Xantus应用程序...
INFO - 加载了LLM提供商:anthropic的设置
INFO - 依赖注入容器已初始化
INFO - 在127.0.0.1:8000启动服务器
启用MCP时,您还将看到:
INFO - 正在启动MCP服务器'mcp-starter-template':node mcp-servers/...
INFO - 从'mcp-starter-template'加载了4个工具:['calculate', 'filesystem', 'text-processing', 'weather']
# 再次激活虚拟环境
source venv/bin/activate
# 启动Streamlit
streamlit run ui/streamlit_app.py
# 用户界面将在浏览器中的http://localhost:8501打开
示例问题:
MCP(模型上下文协议)允许Claude在回答问题时使用外部工具。
您的TypeScript MCP服务器(在mcp-servers/mcp-starter-template-ts/中)提供了:
| 工具 | 功能 | 示例用途 |
|---|---|---|
| 计算器 | 数学运算 | “计算Q1-Q4收入总和” |
| 文件系统 | 读/写/列出文件 | “与去年的报告在../reports/中进行比较” |
| 文本处理 | 字数统计、情感分析、大小写转换 | “分析客户反馈的情感” |
| 天气 | 天气数据(模拟) | “检查活动规划的天气” |
用户问题
↓
Xantus检索文档上下文(RAG)
↓
发送给Claude,附带可用的MCP工具
↓
Claude决定使用一个工具(例如,计算器)
↓
Xantus转发工具调用到MCP服务器(TypeScript)
↓
MCP服务器执行工具并返回结果
↓
Claude将结果整合到答案中
↓
用户获得全面的回答
在config.yaml中:
mcp:
enabled: true # 设置为false以禁用MCP
servers:
- name: "mcp-starter-template"
command: "node"
args: ["mcp-servers/mcp-starter-template-ts/dist/start.js"]
您可以连接多个MCP服务器:
mcp:
enabled: true
servers:
# 您的自定义工具
- name: "my-tools"
command: "node"
args: ["mcp-servers/mcp-starter-template-ts/dist/start.js"]
# 数据库访问
- name: "postgres"
command: "npx"
args: ["-y", "@modelcontextprotocol/server-postgres", "postgresql://localhost/mydb"]
# 网络搜索
- name: "brave-search"
command: "npx"
args: ["-y", "@modelcontextprotocol/server-brave-search"]
有关完整的MCP设置和定制:
README_MCP.md在项目根目录创建一个.env文件:
# ===== LLM API密钥 =====
# 对于Anthropic(双下划线用于嵌套配置!)
XANTUS_LLM__API_KEY=sk-ant-api03-your-key-here
# 对于OpenAI
# XANTUS_LLM__API_KEY=sk-your-openai-key-here
# ===== 嵌入式API密钥(可选)=====
# XANTUS_EMBEDDING__API_KEY=sk-your-key-here
# ===== 覆盖其他设置 =====
# 格式:XANTUS_<SECTION>__<KEY>=值
# 示例:
# XANTUS_LLM__TEMPERATURE=0.5
# XANTUS_RAG__SIMILARITY_TOP_K=10
# XANTUS_SERVER__PORT=8001
重要:对于嵌套配置,请使用双下划线(__)!
安装Ollama:https://ollama.com/download
启动Ollama:
ollama serve
拉取模型:
ollama pull llama3.2 # 用于聊天
ollama pull nomic-embed-text # 用于嵌入式向量存储
配置 config.yaml:
llm:
provider: ollama
model: llama3.2
api_base: http://localhost:11434 # 默认
embedding:
provider: ollama
model: nomic-embed-text