初始化知识库工程
2024年5月15日...大约 6 分钟
1. 环境安装配置
此工程使用 Docker 部署 ollama、postgresql、redis 环境的脚本。因为使用 Docker 可以随时方便卸载,不会污染本地电脑的本机环境(Docker 相当于架在你电脑系统上的一个单独安全区域的虚拟环境)。而且后续部署 Linux 云服务器也会非常顺手。
1.1 Dokcer 安装
关于 Docker 安装教程,请阅读这篇文章来完成安装:Docker命令记录。
Docker 配置镜像加速:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://hub.rat.dev",
"https://docker.1panel.live",
"https://proxy.1panel.live"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1.2 安装 docker 服务脚本
首先需要在项目中 docs/dev-ops
目录下找到相应的脚本,如图下图所示。

# docker-comopse -f docker-compose-environment.yml up -d
services:
# 对话模型
# ollama pull deepseek-r1:1.5b
# 运行模型
# ollama run deepseek-r1:1.5b
# 联网模型
# ollama pull nomic-embed-text
ollama:
image: ollama/ollama:0.5.13
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
redis:
image: redis:6.2
container_name: redis
restart: always
hostname: redis
privileged: true
ports:
- 16379:6379
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- my-network
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 10s
timeout: 5s
retries: 3
# RedisAdmin https://github.com/joeferner/redis-commander
# 账密 admin/admin
redis-admin:
image: spryker/redis-commander:0.8.0
container_name: redis-admin
hostname: redis-commander
restart: always
ports:
- 8081:8081
environment:
- REDIS_HOSTS=local:redis:6379
- REDIS_PASSWORD=d608ba75-09dd-4d0f-ad17-210303cc1aa2
- HTTP_USER=admin
- HTTP_PASSWORD=admin
- LANG=C.UTF-8
- LANGUAGE=C.UTF-8
- LC_ALL=C.UTF-8
networks:
- my-network
depends_on:
redis:
condition: service_healthy
vector_db:
image: pgvector/pgvector:0.7.0-pg16
container_name: vector_db
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=springai
- PGPASSWORD=postgres
volumes:
- ./pgvector/sql/init.sql:/docker-entrypoint-initdb.d/init.sql
logging:
options:
max-size: 10m
max-file: "3"
ports:
- '5432:5432'
healthcheck:
test: "pg_isready -U postgres -d vector_store"
interval: 2s
timeout: 20s
retries: 10
networks:
- my-network
networks:
my-network:
driver: bridge
- Windows + wsl2,本地使用 powershell 切换到工程文件夹,执行
docker-compose -f docker-compose-environment-aliyun.yml up -d
- Mac 电脑的适配性会更好,直接点击这里的绿色箭头即可安装。
- 如果本机配置有问题(windows、虚拟机可能有适配问题),不要浪费时间,直接选择云服务器即可。课程中有云服务器的操作教程,部署起来更方便。
1.3 命令的执行
在云服务器上需要进入到 docker-compose-environment.yml
所在的目录下执行 docker-compose -f docker-compose-environment.yml up -d
执行安装命令。
如果安装过程中出现比较慢的情况,更换 Docker 镜像源就可以解决。还有另一种方式,先在国外服务器下载相应的 docker 镜像,把镜像打包发布到 阿里云镜像仓库中,通过阿里云镜像仓库下载也能解决下载镜像慢的情况。
1.4 DeepSeek 安装
Ollama 官网:https://ollama.com/
在官网的 Models 中找到 deepseek-r1 模型。

进入本服务器安装的 ollama 容器中,拉取模型并运行:

# 进入容器
docker exec -it ollama /bin/bash
# 拉取模型,推荐小一点,够做开发就可以
ollama pull deepseek-r1:1.5b
# (可选)运行模型,运行后关闭,继续安装模型。Ctrl/Command + D
ollama run deepseek-r1:1.5b
# 向量文本
ollama pull nomic-embed-text
- 首先,安装完成后,可以执行运行之后在后台进行对话。对话完成需要关闭的话,运行 Ctrl + D 关闭。
- 之后,安装联网模型。这个过程要持续一会。
- 注意:不要上来就下载很大的模型,会导致机器运行不起来的。
2. 创建后端工程
1. 在 Idea 中创建工程

在创建父工程之后,项目里会有一个src 删掉即可。
随后鼠标点击右键选择 Module、创建 api、app、trigger 三个分层模块。api 定义接口,trigger 实现接口,app 配置、启动。
2. 父工程的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.cactusli</groupId>
<artifactId>ai-rag-cactusli</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>lxf-rag-api</module>
<module>lxf-rag-app</module>
<module>lxf-rag-trigger</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-ai.version>0.8.1</spring-ai.version>
</properties>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0</url>
</license>
</licenses>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.3</version>
<relativePath/>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.28</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.44.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>5.13.0.202109080827-r</version>
</dependency>
<dependency>
<groupId>cn.cactusli</groupId>
<artifactId>lxf-rag-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>cn.cactusli</groupId>
<artifactId>lxf-rag-trigger</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.7</version>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<java_jvm>-Xms1G -Xmx1G -server -XX:MaxPermSize=256M -Xss256K -Dspring.profiles.active=test -XX:+DisableExplicitGC -XX:+UseG1GC -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/xfg-frame-archetype-lite-boot -Xloggc:/export/Logs/boot.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps</java_jvm>
<profileActive>dev</profileActive>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<java_jvm>-Xms1G -Xmx1G -server -XX:MaxPermSize=256M -Xss256K -Dspring.profiles.active=test -XX:+DisableExplicitGC -XX:+UseG1GC -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/xfg-frame-archetype-lite-boot -Xloggc:/export/Logs/boot.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps</java_jvm>
<profileActive>test</profileActive>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<java_jvm>-Xms6G -Xmx6G -server -XX:MaxPermSize=256M -Xss256K -Dspring.profiles.active=release -XX:+DisableExplicitGC -XX:+UseG1GC -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/fq-mall-activity-app -Xloggc:/export/Logs/boot.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps</java_jvm>
<profileActive>prod</profileActive>
</properties>
</profile>
</profiles>
</project>
pom 文件简单介绍:
- modules 用于管理复杂项目,将功能拆分为多个模块,提高代码复用性和维护性。
- properties 统一管理版本号、配置参数,避免硬编码,提高可维护性。‘
- repositories 当项目依赖的库不在中央仓库中,或者需要使用特定版本(如里程碑版或快照版)时,指定额外的仓库。
- licenses 声明项目的法律许可,便于其他开发者了解使用限制。
- parent 使用 Spring Boot 或其他框架时,通过继承父 POM 简化配置。
- dependencyManagement 在多模块项目中统一依赖版本,避免版本冲突。
- build 自定义构建过程,例如指定编译器版本、资源编码等。
- profiles 根据环境动态调整构建配置,例如开发时使用较小内存,生产时优化性能。
3. 调用 deepseek 接口
curl http://218.249.73.249:11434/api/generate \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-r1:1.5b",
"prompt": "你是哪个模型?你能帮我处理什么问题?",
"stream": false
}'
返回的结果:
{
"context": [
151644,
105043,
104673,
104949,
......
],
"created_at": "2025-03-13T04:15:16.08613087Z",
"done": true,
"done_reason": "stop",
"eval_count": 53,
"eval_duration": 3908000000,
"load_duration": 48800287,
"model": "deepseek-r1:1.5b",
"prompt_eval_count": 13,
"prompt_eval_duration": 67000000,
"response": "<think>\n我是DeepSeek-R1,一个由深度求索公司开发的智能助手,我会尽我所能为您提供帮助。\n</think>\n\n我是DeepSeek-R1,一个由深度求索公司开发的智能助手,我会尽我所能为您提供帮助。",
"total_duration": 4025910555
}
通过执行结果可以看到,我们成功的部署了 Ollama DeepSeek而且 已经可以使用 API 调用了。
赞助