第5节RAG知识库上传解析和验证AI Agent 拖拉拽AI Agent 拖拉拽上一节第4节UI页面对接流式应答界面本节第5节RAG知识库上传解析和验证下一节待更新以大模型向量存储的方式提交本地文件到知识库。并在 AI 对话中增强检索知识库符合 AI 对话内容的资料合并提交问题。技术方案以 Spring AI 提供的向量模型处理框架将上传文件以 TikaDocumentReader 方式进行解析再通过 TokenTextSplitter 拆分文件。完成这些操作后在遍历文档添加标记。标记的作用是为了可以区分不同的知识库内容。完成这些动作后把这些拆解并打标的文件存储到 postgresql 向量库中。方案流程文件上传与解析文件上传 : 用户通过前端界面或 API 上传文件文件可以是多种格式如 MD、TXT、SQL 等。文件解析 : 使用 TikaDocumentReader 对上传的文件进行解析提取出文本内容。TikaDocumentReader 能够处理多种文件格式并提取出结构化的文本数据。文本拆分文本拆分 : 使用 TokenTextSplitter 将解析后的文本内容拆分为更小的片段。拆分策略可以根据需求进行调整例如按句子、段落或固定长度的 token 进行拆分。拆分后的文本片段 : 每个文本片段将作为后续处理和存储的基本单元。文本标记标记添加 : 在遍历拆分后的文本片段时为每个片段添加标记。标记的作用是区分不同的知识库内容例如通过标记标识文件的来源、类别或其他元数据信息。标记格式 : 标记可以是简单的字符串标签也可以是结构化的 JSON 数据具体格式根据业务需求确定。向量化与存储向量化 : 使用 Spring AI 提供的向量模型将标记后的文本片段转换为向量表示。向量化过程将文本内容映射到高维向量空间便于后续的相似性搜索和检索。存储到PostgreSQL向量库 : 将向量化后的文本片段及其标记存储到 PostgreSQL 向量库中。PostgreSQL 提供了高效的向量索引和搜索功能能够支持大规模的文本数据存储和检索。应用场景知识库管理 : 适用于需要管理多个知识库内容的场景通过标记区分不同来源的知识库。文档检索 : 支持基于内容的文档检索通过向量化实现高效的相似性搜索。智能问答 : 适用于构建智能问答系统通过向量化存储和检索实现快速的知识匹配。代码评审 结合代码库评审具体的代码块会更加准确。编程开发 可用于编程开发中需求理解、代码查询、流程图等。功能实现引入组件dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-tika-document-reader/artifactId/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-pgvector-store-spring-boot-starter/artifactId/dependency文件配置server:port:8090spring:datasource:driver-class-name:org.postgresql.Driverurl:jdbc:postgresql://172.27.213.102:5432/ai-chat-botusername:postgrespassword:postgrestype:com.zaxxer.hikari.HikariDataSourceai:ollama:base-url:http://127.0.0.1:11434embedding:options:num-batch:768model:nomic-embed-text# Redisredis:sdk:config:host:172.27.213.102port:6378pool-size:10min-idle-size:5idle-timeout:30000connect-timeout:5000retry-attempts:3retry-interval:1000ping-interval:60000keep-alive:truelogging:level:root:infoconfig:classpath:logback-spring.xml向量存储Spring AI 提供了简单 SimpleVectorStore 实现类把文档信息缓存到内存中。以及 PgVectorStore 实现类把文档存储到向量库。ConfigurationpublicclassRAGEmbeddingConfig{BeanpublicTokenTextSplittertokenTextSplitter(){returnnewTokenTextSplitter();}BeanpublicOllamaApiollamaApi(Value(${spring.ai.ollama.base-url})StringbaseUrl){returnnewOllamaApi(baseUrl);}BeanpublicSimpleVectorStoresimpleVectorStore(OllamaApiollamaApi){OllamaEmbeddingClientollamaEmbeddingClientnewOllamaEmbeddingClient(ollamaApi);ollamaEmbeddingClient.withDefaultOptions(OllamaOptions.create().withModel(nomic-embed-text));returnnewSimpleVectorStore(ollamaEmbeddingClient);}BeanpublicPgVectorStorepgVectorStore(OllamaApiollamaApi,JdbcTemplatejdbcTemplate){OllamaEmbeddingClientembeddingClientnewOllamaEmbeddingClient(ollamaApi);embeddingClient.withDefaultOptions(OllamaOptions.create().withModel(nomic-embed-text));returnnewPgVectorStore(jdbcTemplate,embeddingClient);}}向量库的指定也可以通过实例化的时候通过 withModel 指定。SimpleVectorStore把知识库缓存到内存。PgVectorStore把知识库通过 JdbcTemplate 也就是 pgsql 操作存储到向量库。TokenTextSplitter用于切割文本的操作。上传知识库Testpublicvoidchat(){Stringmessage你好王大锤那年人;StringsystemPrompt Use the information from the DOCUMENTS section to provide accurate answers but act as if you knew this information innately. If unsure, simply state that you dont know. Another thing you need to note is that your reply must be in Chinese! DOCUMENTS: {documents} ;simpleVectorStore.accept(loadKnowledgeDocuments());SearchRequestrequestSearchRequest.query(message).withTopK(5);ListDocumentdocumentssimpleVectorStore.similaritySearch(request);StringdocumentsCollectorsdocuments.stream().map(Document::getContent).collect(Collectors.joining());MessageragMessagenewSystemPromptTemplate(systemPrompt).createMessage(Map.of(documents,documentsCollectors));ArrayListMessagemessagesnewArrayList();messages.add(newUserMessage(message));messages.add(ragMessage);ChatResponsechatResponseollamaChatClient.call(newPrompt(messages,OllamaOptions.create().withModel(deepseek-r1:1.5b)));log.info(test result: {},JSON.toJSONString(chatResponse));}在有知识库的加持下我们提问的信息就可以从知识库通过向量方式检索出匹配的信息之后一起作为问题提问。那么你可以想象下如果你想做个代码需求的扩展但你不想梳理你要修改的代码范围就可以通过知识库检索来辅助你完成需求的处理。
第5节:RAG知识库上传,解析和验证
第5节RAG知识库上传解析和验证AI Agent 拖拉拽AI Agent 拖拉拽上一节第4节UI页面对接流式应答界面本节第5节RAG知识库上传解析和验证下一节待更新以大模型向量存储的方式提交本地文件到知识库。并在 AI 对话中增强检索知识库符合 AI 对话内容的资料合并提交问题。技术方案以 Spring AI 提供的向量模型处理框架将上传文件以 TikaDocumentReader 方式进行解析再通过 TokenTextSplitter 拆分文件。完成这些操作后在遍历文档添加标记。标记的作用是为了可以区分不同的知识库内容。完成这些动作后把这些拆解并打标的文件存储到 postgresql 向量库中。方案流程文件上传与解析文件上传 : 用户通过前端界面或 API 上传文件文件可以是多种格式如 MD、TXT、SQL 等。文件解析 : 使用 TikaDocumentReader 对上传的文件进行解析提取出文本内容。TikaDocumentReader 能够处理多种文件格式并提取出结构化的文本数据。文本拆分文本拆分 : 使用 TokenTextSplitter 将解析后的文本内容拆分为更小的片段。拆分策略可以根据需求进行调整例如按句子、段落或固定长度的 token 进行拆分。拆分后的文本片段 : 每个文本片段将作为后续处理和存储的基本单元。文本标记标记添加 : 在遍历拆分后的文本片段时为每个片段添加标记。标记的作用是区分不同的知识库内容例如通过标记标识文件的来源、类别或其他元数据信息。标记格式 : 标记可以是简单的字符串标签也可以是结构化的 JSON 数据具体格式根据业务需求确定。向量化与存储向量化 : 使用 Spring AI 提供的向量模型将标记后的文本片段转换为向量表示。向量化过程将文本内容映射到高维向量空间便于后续的相似性搜索和检索。存储到PostgreSQL向量库 : 将向量化后的文本片段及其标记存储到 PostgreSQL 向量库中。PostgreSQL 提供了高效的向量索引和搜索功能能够支持大规模的文本数据存储和检索。应用场景知识库管理 : 适用于需要管理多个知识库内容的场景通过标记区分不同来源的知识库。文档检索 : 支持基于内容的文档检索通过向量化实现高效的相似性搜索。智能问答 : 适用于构建智能问答系统通过向量化存储和检索实现快速的知识匹配。代码评审 结合代码库评审具体的代码块会更加准确。编程开发 可用于编程开发中需求理解、代码查询、流程图等。功能实现引入组件dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-tika-document-reader/artifactId/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-pgvector-store-spring-boot-starter/artifactId/dependency文件配置server:port:8090spring:datasource:driver-class-name:org.postgresql.Driverurl:jdbc:postgresql://172.27.213.102:5432/ai-chat-botusername:postgrespassword:postgrestype:com.zaxxer.hikari.HikariDataSourceai:ollama:base-url:http://127.0.0.1:11434embedding:options:num-batch:768model:nomic-embed-text# Redisredis:sdk:config:host:172.27.213.102port:6378pool-size:10min-idle-size:5idle-timeout:30000connect-timeout:5000retry-attempts:3retry-interval:1000ping-interval:60000keep-alive:truelogging:level:root:infoconfig:classpath:logback-spring.xml向量存储Spring AI 提供了简单 SimpleVectorStore 实现类把文档信息缓存到内存中。以及 PgVectorStore 实现类把文档存储到向量库。ConfigurationpublicclassRAGEmbeddingConfig{BeanpublicTokenTextSplittertokenTextSplitter(){returnnewTokenTextSplitter();}BeanpublicOllamaApiollamaApi(Value(${spring.ai.ollama.base-url})StringbaseUrl){returnnewOllamaApi(baseUrl);}BeanpublicSimpleVectorStoresimpleVectorStore(OllamaApiollamaApi){OllamaEmbeddingClientollamaEmbeddingClientnewOllamaEmbeddingClient(ollamaApi);ollamaEmbeddingClient.withDefaultOptions(OllamaOptions.create().withModel(nomic-embed-text));returnnewSimpleVectorStore(ollamaEmbeddingClient);}BeanpublicPgVectorStorepgVectorStore(OllamaApiollamaApi,JdbcTemplatejdbcTemplate){OllamaEmbeddingClientembeddingClientnewOllamaEmbeddingClient(ollamaApi);embeddingClient.withDefaultOptions(OllamaOptions.create().withModel(nomic-embed-text));returnnewPgVectorStore(jdbcTemplate,embeddingClient);}}向量库的指定也可以通过实例化的时候通过 withModel 指定。SimpleVectorStore把知识库缓存到内存。PgVectorStore把知识库通过 JdbcTemplate 也就是 pgsql 操作存储到向量库。TokenTextSplitter用于切割文本的操作。上传知识库Testpublicvoidchat(){Stringmessage你好王大锤那年人;StringsystemPrompt Use the information from the DOCUMENTS section to provide accurate answers but act as if you knew this information innately. If unsure, simply state that you dont know. Another thing you need to note is that your reply must be in Chinese! DOCUMENTS: {documents} ;simpleVectorStore.accept(loadKnowledgeDocuments());SearchRequestrequestSearchRequest.query(message).withTopK(5);ListDocumentdocumentssimpleVectorStore.similaritySearch(request);StringdocumentsCollectorsdocuments.stream().map(Document::getContent).collect(Collectors.joining());MessageragMessagenewSystemPromptTemplate(systemPrompt).createMessage(Map.of(documents,documentsCollectors));ArrayListMessagemessagesnewArrayList();messages.add(newUserMessage(message));messages.add(ragMessage);ChatResponsechatResponseollamaChatClient.call(newPrompt(messages,OllamaOptions.create().withModel(deepseek-r1:1.5b)));log.info(test result: {},JSON.toJSONString(chatResponse));}在有知识库的加持下我们提问的信息就可以从知识库通过向量方式检索出匹配的信息之后一起作为问题提问。那么你可以想象下如果你想做个代码需求的扩展但你不想梳理你要修改的代码范围就可以通过知识库检索来辅助你完成需求的处理。