# Ollive Inference Chatbot：带推理日志记录的LLM聊天系统

> Ollive是一个全栈LLM聊天机器人，包含轻量级推理日志SDK、近实时摄取API和PostgreSQL存储。支持多提供商（Gemini、OpenAI、Anthropic）、流式响应和实时指标仪表板。

- 板块: [Openclaw Llm](https://www.zingnex.cn/forum/board/openclaw-llm)
- 发布时间: 2026-05-23T09:12:18.000Z
- 最近活动: 2026-05-23T09:23:50.678Z
- 热度: 159.8
- 关键词: LLM, 聊天机器人, 推理日志, 监控, PostgreSQL, 多提供商, 流式响应, PII脱敏
- 页面链接: https://www.zingnex.cn/forum/thread/ollive-inference-chatbot-llm
- Canonical: https://www.zingnex.cn/forum/thread/ollive-inference-chatbot-llm
- Markdown 来源: ingested_event

---

## 原作者与来源

- **原作者/维护者**: Nightstorm26
- **来源平台**: GitHub
- **原始标题**: ChatBot (Ollive Inference Chatbot)
- **原始链接**: https://github.com/Nightstorm26/ChatBot
- **发布时间**: 2026年5月23日

## 项目概述

Ollive Inference Chatbot是一个全栈LLM聊天应用，包含三个核心组件：轻量级推理日志SDK、近实时摄取API，以及用于存储消息和推理元数据的PostgreSQL数据库。

该项目解决了LLM应用中的一个关键需求：如何可靠地记录和监控推理调用，同时保持低延迟和良好的开发者体验。

## 核心功能

### 多轮对话支持

系统维护对话历史（最近20条消息），并将其发送给模型。这是通过简单的消息列表实现的，而非复杂的token感知上下文管理。

### 多提供商支持

- Google Gemini（默认）
- OpenAI
- Anthropic

用户可以在对话中切换不同的提供商和模型。

### 流式响应

使用SSE（Server-Sent Events）实现token-by-token的流式响应，提供更好的用户体验。

### 推理指标仪表板

实时24小时面板显示：
- 延迟统计
- 吞吐量
- 错误分布
- 各提供商统计

### PII脱敏

日志预览中对敏感信息进行脱敏处理：
- 邮箱地址
- 电话号码
- SSN
- 银行卡号
- API密钥

## 架构设计

### 项目结构

```
├── packages/inference-sdk/    # 日志包装SDK（可发布）
├── apps/api/                  # 聊天API + 摄取 + 仪表板
├── apps/web/                  # React UI
├── docker-compose.yml
├── ARCHITECTURE.md            # 设计文档
└── README.md
```

### 推理SDK设计

`@ollive/inference-sdk`包装LLM调用，捕获元数据，POST到摄取端点。采用事件风格的解耦设计：SDK → HTTP摄取（本地同进程；生产环境可分离）。

### 摄取流水线

`POST /api/ingest`端点使用Zod验证，持久化到数据库。摄取是同步HTTP（202 Accepted）；失败的摄取日志仅警告，不重试。

### 数据库模式

**conversations**：会话容器；状态（active | cancelled），可选的提供商/模型默认值。

**messages**：追加式聊天历史；外键关联conversation，ON DELETE CASCADE。

**inference_logs**：每次推理尝试一行；仅预览（非完整负载）以限制存储和PII暴露。按conversation_id、provider、status索引以支持仪表板查询。

## 技术权衡

### 预览长度限制

SDK中将预览限制在500字符；完整消息仅存储在messages表中。这是存储和可观测性之间的平衡。

### 同步摄取

摄取是同步HTTP而非异步队列。这简化了架构，但在高吞吐量场景可能成为瓶颈。失败不重试的设计意味着极端情况下可能丢失日志。

### 固定上下文窗口

上下文窗口固定为20条消息——简单且可预测；非token感知。这简化了实现，但可能在长对话中浪费token或丢失重要上下文。

## API概览

| 端点 | 描述 |
|-----|------|
| GET /api/conversations | 列对话 |
| POST /api/conversations | 创建对话 |
| GET /api/conversations/:id | 恢复——消息+元数据 |
| POST /api/conversations/:id/cancel | 取消对话 |
| POST /api/chat/message | 发送消息（stream: true启用SSE） |
| POST /api/chat/cancel-stream | 中止进行中的流 |
| GET /api/chat/providers | 可用提供商/模型 |
| POST /api/ingest | 推理日志摄取（SDK目标） |
| GET /api/dashboard/metrics | 延迟、吞吐量、错误 |

## 快速开始

### Docker方式

```bash
cp .env.example .env
# 添加至少一个密钥：
# OPENAI_API_KEY=sk-...
# ANTHROPIC_API_KEY=sk-ant-...
# GEMINI_API_KEY=your-gemini-api-key-here

docker compose up --build
```

- UI: http://localhost:5173
- API: http://localhost:3001/health

### 本地开发

前置要求：Node 20+、PostgreSQL 16（或仅Docker运行Postgres）。

```bash
npm install
cp .env.example .env
# 启动Postgres（或：docker compose up postgres -d）

npm run db:migrate
npm run dev
```

- Web: http://localhost:5173（代理 /api → :3001）
- API: http://localhost:3001

## 未来改进方向

作者列出了有时间会改进的方向：

- 重试队列（Redis/SQS）用于失败的摄取事件
- 基于token的上下文修剪
- 认证 + 多租户对话隔离
- 从inference_logs构建Grafana仪表板
- 分离摄取工作服务与读副本
- Kubernetes清单（Helm）用于自托管部署

## 技术启示

Ollive的设计为构建LLM应用提供了几个实用启示：

1. **SDK包装模式**：通过包装器捕获元数据，对应用代码侵入最小
2. **事件解耦**：SDK与摄取服务解耦，支持灵活部署
3. **PII意识**：在日志中主动脱敏敏感信息
4. **实时可观测性**：提供实时指标而非仅事后分析
5. **多提供商抽象**：统一接口支持不同LLM提供商

对于需要快速搭建带监控的LLM聊天应用的开发者，Ollive提供了一个完整且实用的参考实现。
