红信鸽科技头像
关注
用 ThinkAi 给企业搭一个 RAG 知识库问答系统封面图

用 ThinkAi 给企业搭一个 RAG 知识库问答系统

用 ThinkAi 给企业搭一个 RAG 知识库问答系统(含代码)

业务方刚塞过来几十本行业操作手册和几百个 PDF,说下周就要上线一个智能客服。如果是以前,我可能得先骂人,然后开始头疼怎么接入向量数据库、怎么切分文档、怎么调用大模型 API。但现在,有了红信鸽科技开源的 ThinkAi,这套流程其实可以压缩到半天内跑通。

场景:企业内部知识库的快速搭建

我们面临的典型场景是:公司内部有大量非结构化文档(Word、PDF、Markdown),员工遇到业务问题需要快速检索答案。传统方案要么自研(成本高、周期长),要么用通用 SaaS(数据安全顾虑)。

ThinkAi 的 RAG 模块设计初衷就是解决这个痛点。它的核心思路是:文档预处理 -> 向量化存储 -> 检索增强生成。整个链路支持通过简单的配置和少量代码完成。

落地方案:基于 ThinkAi 构建 RAG 问答服务

1. 架构简述

整个系统分为三层:

  • 接入层:接收用户提问(REST API 或 WebSocket)。
  • RAG 处理层:这是 ThinkAi 的核心,包含文档解析、文本分块(Chunking)、Embedding 向量化、向量检索。
  • 生成层:将检索到的上下文与用户问题组合,发送给 LLM(如通义千问、OpenAI、本地部署的 Llama)进行回答。

ThinkAi 屏蔽了底层向量数据库(如 Milvus、Chroma、PgVector)的差异,统一封装了接口。

示意图

2. 关键实现步骤与代码

第一步:引入依赖

在 Maven 项目中引入 ThinkAi 的 RAG 相关依赖。假设你使用的是 Spring Boot 环境:

```xml

com.hongxinge
think-ai-spring-boot-starter
最新版本



org.postgresql
postgresql

```

第二步:配置文件

application.yml 中配置 Embedding 模型和向量库连接。ThinkAi 支持多种 Embedding 模型,推荐使用专门优化过中文的模型以获得更好的召回率。

```yaml
think:
ai:
rag:
embedding:
model: text-embedding-v3 # 可配置为通义、OpenAI 或本地模型
api-key: ${EMBEDDING_API_KEY}
vector-store:
type: postgres # 支持 postgres, milvus, chroma 等
config:
host: localhost
port: 5432
database: rag_db
username: postgres
password: ${DB_PASSWORD}
llm:
provider: qwen # 或 openai, azure
api-key: ${LLM_API_KEY}
model: qwen-plus
```

第三步:加载文档与切片

这是最容易踩坑的地方。文档切片的策略直接影响检索效果。ThinkAi 提供了灵活的 DocumentLoaderTextSplitter

```java
import com.hongxinge.ai.rag.document.DocumentLoader;
import com.hongxinge.ai.rag.chunk.Chunk;
import com.hongxinge.ai.rag.chunk.TextSplitter;
import com.hongxinge.ai.rag.embed.EmbeddingService;
import com.hongxinge.ai.rag.store.VectorStoreService;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.List;

@Service
public class KnowledgeBaseService {

private final DocumentLoader documentLoader;
private final TextSplitter textSplitter;
private final EmbeddingService embeddingService;
private final VectorStoreService vectorStoreService;

// 注入依赖...

public void ingestDocument(String filePath) {
// 1. 加载文档
List chunks = documentLoader.load(new File(filePath));

// 2. 文本切分
// 注意:不同文档类型(PDF vs Markdown)可能需要不同的 splitter
// 这里使用默认的 RecursiveCharacterTextSplitter,chunk size 设为 500,overlap 为 50
List splitChunks = textSplitter.split(chunks, 500, 50);

// 3. 向量化并存储
// embeddingService 会批量调用 Embedding API,注意控制频率避免限流
vectorStoreService.save(splitChunks);
}
}
```

第四步:实现问答接口

```java
@RestController
@RequestMapping("/api/kb")
public class ChatController {

示意图

@Autowired
private RagService ragService;

@PostMapping("/ask")
public String ask(@RequestBody AskRequest request) {
// 调用 ThinkAi 封装的 RAG 链式调用
// retrieve: 检索相关文档片段
// generate: 结合上下文生成回答
return ragService.query(request.getQuestion());
}
}
```

优缺点与注意事项

优点:

  • 开箱即用:ThinkAi 统一了文档解析、切分、向量化和检索的接口,无需自己对接多个库。
  • 可扩展性强:底层向量库和 LLM 提供商均可通过配置切换,方便根据成本和安全需求调整。
  • 生态友好:与 Spring Boot 无缝集成,适合现有的 Java 技术栈团队。

缺点与坑:

  • 文档切分效果依赖配置:默认的切片策略不一定适合所有文档。比如技术手册含有大量表格和代码块,可能需要自定义 TextSplitter 逻辑,或者针对 PDF 使用专门的 OCR + 结构化解析能力。我之前就遇到过切片后丢失关键上下文的情况,导致回答幻觉。
  • 嵌入模型的选择:如果企业内部数据涉及专业术语(如医疗、法律),通用的 Embedding 模型可能效果不佳。建议评估是否需要在特定领域数据上微调 Embedding 模型,或者选用在该领域表现更好的商业模型。
  • 向量库的性能与成本:对于亿级向量规模,PostgreSQL + pgvector 可能不是最优解,建议评估迁移到 Milvus 或专用向量数据库。同时,要注意向量数据的清理和更新机制,避免死数据占用空间。

总结:

对于中小企业或内部工具开发,用 ThinkAi 搭建 RAG 知识库是一个高效且低门槛的选择。它把复杂的 AI 工程化细节封装得很好,让开发者能聚焦在业务逻辑上。当然,要在生产环境稳定运行,还需要在文档处理策略、检索效果调优和成本控制上做持续迭代。

如果你对具体的配置细节或源码实现感兴趣,可以访问红信鸽科技的 GitHub 组织(https://github.com/hongxinge)查看 ThinkAi 仓库,那里有更详细的文档和示例代码。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/mafei_it/article/details/164582610

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--