# study_ai **Repository Path**: zhangjiawei_509/study_ai ## Basic Information - **Project Name**: study_ai - **Description**: langchain4j学习 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-12 - **Last Updated**: 2025-05-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AI 学习与实践平台 这是一个基于 LangChain4j 和 Spring Boot 构建的 AI 应用开发学习平台,集成了多种 AI 能力,包括 LLM 对话、向量嵌入、知识库问答 (RAG)、联网搜索等功能。本项目旨在提供一个完整的 AI 应用开发学习框架,帮助开发者快速上手 AI 应用开发。 ## 项目特性 - **大模型对话**:集成阿里千问大模型,支持基础对话和流式对话响应 - **向量嵌入**:支持文本向量化,实现语义检索能力 - **知识库问答 (RAG)**:结合向量数据库,实现基于知识库的智能问答 - **联网搜索**:集成 SearXNG 搜索引擎,支持实时联网获取信息 - **文档处理**:支持文档加载、分割和向量化,便于构建知识库 - **会话记忆**:支持多轮对话记忆,提供更连贯的对话体验 ## 核心组件说明 ### AiAssistant `AiAssistant` 是一个带有记忆能力的 AI 助手接口,用于实现基础的对话功能。 **主要特点**: - 支持会话记忆功能,可以记住对话上下文 - 提供普通文本响应和流式响应两种模式 - 使用 `@MemoryId` 标识不同的会话,支持多用户并发对话 - 可以集成各种工具 (Tools) 进行功能扩展 **使用场景**: - 简单的问答场景 - 需要记住上下文的多轮对话 - 不需要外部知识库的通用对话 ### RagAssistant `RagAssistant` 是一个具有检索增强生成能力的 AI 助手接口,能够结合外部知识进行回答。 **主要特点**: - 支持基于向量数据库的知识检索 - 支持联网搜索获取实时信息 - 提供系统消息模板定制,可以预设角色和行为规则 - 支持从资源文件加载提示词模板 **使用场景**: - 需要基于专业知识库回答问题 - 需要最新信息的实时查询 - 需要扮演特定角色的对话场景 - 企业知识库问答系统 ## 配置说明 ### AiConfig 配置详解 `AiConfig` 是项目的核心配置类,负责初始化和配置 AI 相关的组件。 #### 1. 大模型配置 ```java @Bean @Primary QwenChatModel qwenChatModel1(QwenProperties properties, List chatModelListenerList) { return QwenChatModel.builder() .apiKey(properties.getApiKey()) .modelName(properties.getModelName()) .listeners(chatModelListenerList) .build(); } ``` **参数说明**: - `apiKey`: 千问大模型的 API 密钥,从 application.properties 中读取 - `modelName`: 使用的模型名称,如 qwen-max - `listeners`: 聊天模型监听器列表,用于日志记录和监控 **使用场景**: - 当需要自定义大模型参数时 - 需要添加日志记录或监控时 - 需要覆盖默认模型配置时 #### 2. RagAssistant 配置 ```java @Bean public RagAssistant ragAssistant(ChatLanguageModel qwenChatModel1, StreamingChatLanguageModel qwenStreamingChatModel, Collection tools, ChatMemoryProvider chatMemoryProvider, RetrievalAugmentor retrievalAugmentor) { return AiServices.builder(RagAssistant.class) .tools(tools.toArray()) .chatLanguageModel(qwenChatModel1) .streamingChatLanguageModel(qwenStreamingChatModel) .retrievalAugmentor(retrievalAugmentor) .chatMemoryProvider(chatMemoryProvider) .build(); } ``` **参数说明**: - `chatLanguageModel`: 用于非流式对话的语言模型 - `streamingChatLanguageModel`: 用于流式对话的语言模型 - `tools`: 可用工具列表,用于扩展助手能力 - `chatMemoryProvider`: 对话记忆提供者,用于管理对话历史 - `retrievalAugmentor`: 检索增强器,用于结合知识库和网络搜索 **使用场景**: - 构建企业级知识库问答系统 - 需要同时支持知识库检索和联网搜索的场景 - 需要记住对话上下文并提供流式响应的应用 #### 3. AiAssistant 配置 ```java @Bean public AiAssistant aiAssistant(ChatLanguageModel qwenChatModel1, StreamingChatLanguageModel qwenStreamingChatModel, ChatMemoryProvider chatMemoryProvider, Collection tools) { return AiServices.builder(AiAssistant.class) .chatLanguageModel(qwenChatModel1) .tools(tools.toArray()) .streamingChatLanguageModel(qwenStreamingChatModel) .chatMemoryProvider(chatMemoryProvider) .build(); } ``` **参数说明**: - `chatLanguageModel`: 用于非流式对话的语言模型 - `streamingChatLanguageModel`: 用于流式对话的语言模型 - `chatMemoryProvider`: 对话记忆提供者,用于管理对话历史 - `tools`: 可用工具列表,用于扩展助手能力 **使用场景**: - 简单的对话机器人应用 - 不需要外部知识库的通用对话场景 - 需要记住对话上下文的客服系统 #### 4. 记忆管理配置 ```java @Bean public ChatMemoryProvider chatMemoryProvider(){ return memoryId -> MessageWindowChatMemory.builder() .id(memoryId) .maxMessages(10) .chatMemoryStore(dbChatMemoryStore()) .build(); } @Bean public ChatMemoryStore dbChatMemoryStore() { return new DbChatMemoryStore(); } ``` **参数说明**: - `memoryId`: 会话 ID,用于区分不同的对话 - `maxMessages`: 最大记忆消息数,控制上下文长度 - `chatMemoryStore`: 对话记忆存储,可以是内存存储或数据库存储 **使用场景**: - 需要持久化对话历史的应用 - 多用户并发对话的系统 - 需要控制上下文长度的场景 #### 5. 向量存储配置 ```java @Bean public EmbeddingStore embeddingStore() { return new InMemoryEmbeddingStore<>(); } ``` **使用场景**: - 开发和测试环境 - 小规模知识库应用 - 不需要持久化向量数据的场景 对于生产环境,可以考虑使用 Redis 或其他向量数据库: ```java @Bean public EmbeddingStore redisEmbeddingStore(RedisProperties redisProperties) { return RedisEmbeddingStore.builder() .host(redisProperties.getHost()) .port(redisProperties.getPort()) .build(); } ``` #### 6. 文档预加载配置 ```java @Bean public CommandLineRunner ingestTermOfServiceToVectorStore(QwenEmbeddingModel qwenEmbeddingModel, EmbeddingStore embeddingStore) { // 文档路径和处理逻辑 // ... } ``` **参数说明**: - `qwenEmbeddingModel`: 用于文本向量化的嵌入模型 - `embeddingStore`: 向量存储,用于存储文档向量 **使用场景**: - 需要在应用启动时预加载知识库的场景 - 静态文档的向量化和存储 - 构建基础知识库的初始化过程 ## 功能模块 ### 1. 基础对话 提供与千问大模型的基础对话能力,支持流式和非流式响应。 ``` GET /ai/chat?message=你好 GET /ai/memory_chat_id?message=你好&memoryId=1 GET /ai/memory_stream_chat?message=你好&memoryId=1 ``` ### 2. 知识库问答 (RAG) 结合向量数据库实现基于知识库的智能问答,支持多种检索策略。 ``` GET /rag/memory_chat?message=退费政策是什么 GET /rag/memory_stream_chat?message=退费政策是什么&webSearchEnable=true GET /rag/stream/flux?memoryId=123&question=退费政策是什么&webSearchEnable=true ``` ### 3. 向量嵌入 提供文本向量化、向量存储和相似性检索功能。 ``` GET /embedding/embed?message=我想了解退票规则 GET /embedding/embed/search GET /embedding/embed/split GET /embedding/embed/rag ``` ### 4. 联网搜索 整合 SearXNG 搜索引擎,支持实时联网获取信息。 ``` GET /retrieval/search?message=最新科技新闻 GET /retrieval/test ``` ## 技术栈 - **Spring Boot 3.x**:应用框架 - **LangChain4j**:大语言模型应用开发框架 - **千问大模型**:阿里云的大语言模型 - **SearXNG**:元搜索引擎,提供联网搜索功能 - **Redis**:可选用作向量数据库 - **Hutool & Fastjson**:工具库 ## 配置要求 ### 基础配置 项目的主要配置在 `application.properties` 文件中: ```properties # 千问大模型配置 langchain4j.community.dashscope.chat-model.api-key=your_api_key langchain4j.community.dashscope.chat-model.model-name=qwen-max langchain4j.community.dashscope.streaming-chat-model.api-key=your_api_key langchain4j.community.dashscope.streaming-chat-model.model-name=qwen-max langchain4j.community.dashscope.embedding-model.api-key=your_api_key langchain4j.community.dashscope.embedding-model.model-name=text-embedding-v2 # 日志级别 logging.level.dev.langchain4j=debug logging.level.dev.ai4j=debug # Redis配置(可选,用于向量存储) redis.host=your_redis_host redis.port=6379 # 高德地图API配置(可选,用于天气查询示例) gaode.baseUrl=https://restapi.amap.com/v3/weather/weatherInfo gaode.api-key=your_gaode_api_key # SearXNG搜索引擎配置 searxng.base-url=http://your_searxng_host:port/ searxng.engines=google,bing,360search ``` ### 运行环境要求 - **JDK 17+** - **Maven 3.6+** - **内存**: 建议 4GB+ - **存储**: 根据知识库大小而定,建议 10GB+ - **SearXNG 服务**:需要部署一个 SearXNG 搜索引擎服务(可选) ## 快速开始 1. 克隆本项目到本地 2. 配置 `application.properties` 文件,填入你的 API 密钥 3. 执行 `mvn spring-boot:run` 命令启动项目 4. 访问 `http://localhost:8080` 进行测试 ## SearXNG 服务部署说明 如需使用联网搜索功能,需要部署 SearXNG 服务: 1. 部署 SearXNG 服务(可使用 Docker) ```bash docker pull searxng/searxng docker run -d -p 8080:8080 searxng/searxng ## 注意事项 - 使用前需要申请千问大模型的 API 密钥 - SearXNG 服务需要能访问互联网 - 如需使用 Redis 作为向量数据库,请确保 Redis 服务可用 - 处理大型文档可能需要较高的内存资源