零基础搭建 AI 搜索系统:从知识库导入到上线部署全流程
AI搜索 部署完整教程|零基础可学
随着大模型的发展,“AI搜索”已经成为很多个人站长、企业知识库、内容平台和内部办公系统的热门方向。传统搜索通常依赖关键词匹配,而AI搜索不仅能找到相关资料,还能理解用户问题、总结答案、引用来源,甚至进行多轮追问。简单来说,AI搜索就是“搜索引擎 + 向量数据库 + 大语言模型”的结合。
本文将用零基础也能理解的方式,带你从概念、环境准备、项目搭建、数据导入、向量检索、模型接入,到最终部署上线,完整走一遍AI搜索系统的部署流程。即使你没有太多编程经验,也可以按照步骤逐步完成。
一、什么是AI搜索?
AI搜索通常指基于大语言模型和语义检索能力的新一代搜索系统。它和传统搜索最大的区别在于:传统搜索更看重“关键词是否出现”,而AI搜索更看重“语义是否相关”。
举个例子:
用户搜索:
怎么提高网站打开速度?
传统搜索可能会匹配“网站”“打开”“速度”等关键词,然后返回包含这些词的网页。
AI搜索则会理解用户真正想问的是:
如何优化网站性能?
于是它可能检索到关于CDN、图片压缩、缓存策略、代码拆分、服务器优化等内容,并把结果整理成一段清晰的答案。
一个典型的AI搜索系统通常包含以下几个部分:
- 数据源:文档、网页、PDF、Markdown、数据库内容等。
- 文本切分:将长文档切成适合检索的小段。
- 向量化模型:把文字转换成向量。
- 向量数据库:存储向量并支持相似度搜索。
- 大语言模型:根据检索结果生成自然语言答案。
- 前端界面:提供用户输入问题和查看答案的页面。
- 后端服务:负责连接模型、数据库和业务逻辑。
二、AI搜索的基本工作流程
在正式部署之前,我们先理解AI搜索的运行流程。
当用户输入一个问题后,系统一般会经历以下步骤:
- 用户输入问题。
- 系统将问题转换成向量。
- 向量数据库根据语义相似度找到相关文档片段。
- 系统把相关片段和用户问题一起发送给大语言模型。
- 大语言模型结合资料生成答案。
- 前端展示答案,并可附带引用来源。
这个过程也被称为 RAG,全称是 Retrieval-Augmented Generation,中文可以理解为“检索增强生成”。
RAG的优势是明显的:
- 可以减少大模型胡编乱造;
- 可以让模型回答私有知识库中的内容;
- 可以更新数据而不需要重新训练模型;
- 部署成本相对可控;
- 适合企业知识库、客服问答、文档搜索、个人资料库等场景。
三、部署前需要准备什么?
本文采用一个比较通用、适合新手的部署方案:
- 操作系统:Ubuntu 22.04 或 Windows + Docker Desktop
- 后端:Python + FastAPI
- 向量数据库:ChromaDB
- 大语言模型:可使用 OpenAI API、兼容OpenAI格式的国产模型API,或本地Ollama模型
- 前端:简单HTML页面
- 部署方式:Docker / 服务器运行
如果你是零基础,建议优先使用云服务器或本地电脑进行测试。云服务器推荐配置:
| 项目 | 推荐配置 |
|---|---|
| CPU | 2核及以上 |
| 内存 | 4GB及以上 |
| 硬盘 | 40GB及以上 |
| 系统 | Ubuntu 22.04 |
| 带宽 | 3Mbps及以上 |
如果你想运行本地大模型,例如Qwen、Llama等,服务器配置要求会更高,最好有GPU。但如果只是调用在线API,普通服务器即可。
四、安装基础环境
以下命令以Ubuntu系统为例。
1. 更新系统
sudo apt update
sudo apt upgrade -y
2. 安装Python和pip
sudo apt install python3 python3-pip python3-venv -y
查看版本:
python3 --version
pip3 --version
3. 安装Git
sudo apt install git -y
4. 创建项目目录
mkdir ai-search-demo
cd ai-search-demo
5. 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
激活成功后,命令行前面通常会出现:
(venv)
五、安装项目依赖
在项目目录下创建 requirements.txt 文件:
nano requirements.txt
写入以下内容:
fastapi
uvicorn
chromadb
openai
python-dotenv
sentence-transformers
pydantic
保存后安装依赖:
pip install -r requirements.txt
如果下载速度较慢,可以使用国内镜像:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
这里简单解释一下这些依赖的作用:
- FastAPI:用于搭建后端接口;
- Uvicorn:用于运行FastAPI服务;
- ChromaDB:本地向量数据库;
- OpenAI:调用OpenAI或兼容OpenAI格式的大模型接口;
- python-dotenv:读取环境变量;
- sentence-transformers:本地文本向量化模型;
- pydantic:数据校验。
六、创建环境变量配置
为了避免把API Key直接写在代码里,我们使用 .env 文件保存配置。
创建文件:
nano .env
写入内容:
OPENAI_API_KEY=你的API密钥
OPENAI_BASE_URL=https://api.openai.com/v1
LLM_MODEL=gpt-4o-mini
如果你使用的是兼容OpenAI格式的其他模型服务,只需要修改 OPENAI_BASE_URL 和 LLM_MODEL 即可。
例如某些国产模型平台会提供类似这样的地址:
OPENAI_BASE_URL=https://xxx.example.com/v1
LLM_MODEL=xxx-chat-model
请注意,不同平台的模型名称、接口地址可能不同,需要以官方文档为准。
七、准备知识库文档
我们先用最简单的文本文件作为知识库。
创建 docs 文件夹:
mkdir docs
创建一份测试文档:
nano docs/company.txt
写入示例内容:
星河科技有限公司成立于2020年,主要业务包括企业AI知识库、智能客服系统、数据分析平台和自动化办公工具。
公司客服工作时间为周一至周五,上午9点到下午6点。节假日客服响应时间可能延迟。
企业AI知识库产品支持PDF、Word、Markdown、网页链接等多种数据导入方式,支持权限管理、多轮问答和答案引用来源。
智能客服系统可以接入微信公众号、企业微信、网站在线客服和APP客服入口。
你后续可以把自己的文章、产品手册、说明文档、制度文件等放到 docs 文件夹中。
八、编写文档导入脚本
接下来,我们要把文档切分并写入向量数据库。
创建 ingest.py:
nano ingest.py
写入以下代码:
import os
import chromadb
from sentence_transformers import SentenceTransformer
DOCS_DIR = "docs"
DB_DIR = "chroma_db"
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
client = chromadb.PersistentClient(path=DB_DIR)
collection = client.get_or_create_collection(name="ai_search_docs")
def split_text(text, chunk_size=300, overlap=50):
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunk = text[start:end]
chunks.append(chunk)
start += chunk_size - overlap
return chunks
def load_documents():
all_chunks = []
ids = []
metadatas = []
index = 0
for filename in os.listdir(DOCS_DIR):
file_path = os.path.join(DOCS_DIR, filename)
if not os.path.isfile(file_path):
continue
if not filename.endswith(".txt"):
continue
with open(file_path, "r", encoding="utf-8") as f:
text = f.read()
chunks = split_text(text)
for chunk in chunks:
all_chunks.append(chunk)
ids.append(f"doc_{index}")
metadatas.append({"source": filename})
index += 1
return all_chunks, ids, metadatas
def main():
documents, ids, metadatas = load_documents()
if not documents:
print("没有找到可导入的文档")
return
embeddings = model.encode(documents).tolist()
collection.add(
documents=documents,
embeddings=embeddings,
ids=ids,
metadatas=metadatas
)
print(f"成功导入 {len(documents)} 个文档片段")
if __name__ == "__main__":
main()
运行导入脚本:
python ingest.py
如果看到类似输出:
成功导入 3 个文档片段
说明知识库已经成功写入向量数据库。
第一次运行时,sentence-transformers 会下载向量模型,需要等待一段时间。如果服务器访问外网较慢,可以考虑提前下载模型,或者使用支持API的Embedding服务。
九、编写AI搜索后端接口
创建 main.py:
nano main.py
写入以下代码:
import os
import chromadb
from dotenv import load_dotenv
from fastapi import FastAPI
from pydantic import BaseModel
from openai import OpenAI
from sentence_transformers import SentenceTransformer
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_BASE_URL = os.getenv("OPENAI_BASE_URL")
LLM_MODEL = os.getenv("LLM_MODEL", "gpt-4o-mini")
DB_DIR = "chroma_db"
app = FastAPI(title="AI Search Demo")
embed_model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
chroma_client = chromadb.PersistentClient(path=DB_DIR)
collection = chroma_client.get_or_create_collection(name="ai_search_docs")
llm_client = OpenAI(
api_key=OPENAI_API_KEY,
base_url=OPENAI_BASE_URL
)
class SearchRequest(BaseModel):
query: str
@app.get("/")
def home():
return {"message": "AI Search API is running"}
@app.post("/search")
def search(req: SearchRequest):
query = req.query.strip()
if not query:
return {"answer": "请输入问题", "sources": []}
query_embedding = embed_model.encode([query]).tolist()[0]
results = collection.query(
query_embeddings=[query_embedding],
n_results=3
)
documents = results.get("documents", [[]])[0]
metadatas = results.get("metadatas", [[]])[0]
context = "\n\n".join(documents)
prompt = f"""
你是一个严谨的AI搜索助手。请根据给定资料回答用户问题。
要求:
1. 只能基于资料回答,不要编造。
2. 如果资料中没有答案,请说明“当前知识库中没有找到相关信息”。
3. 回答要清晰、简洁、有条理。
用户问题:
{query}
参考资料:
{context}
"""
completion = llm_client.chat.completions.create(
model=LLM_MODEL,
messages=[
{"role": "system", "content": "你是一个专业的AI搜索助手。"},
{"role": "user", "content": prompt}
],
temperature=0.2
)
answer = completion.choices[0].message.content
sources = []
for item in metadatas:
if item and "source" in item:
sources.append(item["source"])
return {
"query": query,
"answer": answer,
"sources": list(set(sources))
}
启动服务:
uvicorn main:app --host 0.0.0.0 --port 8000
如果看到:
Uvicorn running on http://0.0.0.0:8000
说明后端服务已经运行。
打开浏览器访问:
http://服务器IP:8000
如果返回:
{"message":"AI Search API is running"}
说明部署成功。
十、测试AI搜索接口
可以使用 curl 测试:
curl -X POST http://127.0.0.1:8000/search \
-H "Content-Type: application/json" \
-d '{"query":"公司客服工作时间是什么时候?"}'
正常情况下,你会得到类似结果:
{
"query": "公司客服工作时间是什么时候?",
"answer": "公司客服工作时间为周一至周五,上午9点到下午6点。节假日客服响应时间可能延迟。",
"sources": ["company.txt"]
}
这说明AI搜索系统已经能够从知识库中检索相关内容,并调用大模型生成答案。
十一、创建一个简单前端页面
为了方便使用,我们可以创建一个简单HTML页面。
新建 static 文件夹:
mkdir static
创建 static/index.html:
nano static/index.html
写入以下代码:
AI搜索
AI搜索
答案会显示在这里
然后修改 main.py,加入静态文件支持:
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
并在 app = FastAPI(...) 后面添加:
app.mount("/static", StaticFiles(directory="static"), name="static")
@app.get("/app")
def app_page():
return FileResponse("static/index.html")
重新启动服务:
uvicorn main:app --host 0.0.0.0 --port 8000
访问:
http://服务器IP:8000/app
你就可以在网页中输入问题并获得AI搜索答案。
十二、使用Docker部署
如果你希望部署更稳定,建议使用Docker。Docker可以把运行环境打包,避免“本地能跑,服务器不能跑”的问题。
1. 安装Docker
Ubuntu安装Docker:
sudo apt install docker.io -y
sudo systemctl enable docker
sudo systemctl start docker
查看版本:
docker --version
2. 创建Dockerfile
在项目根目录创建 Dockerfile:
nano Dockerfile
写入:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
3. 构建镜像
docker build -t ai-search-demo .
4. 运行容器
docker run -d \
--name ai-search \
-p 8000:8000 \
--env-file .env \
ai-search-demo
查看容器状态:
docker ps
查看日志:
docker logs -f ai-search
访问:
http://服务器IP:8000/app
十三、生产环境建议
如果你准备把AI搜索系统真正用于公司或对外服务,建议继续完善以下内容。
1. 增加用户权限
企业知识库通常包含内部资料,因此不能所有人都能访问。可以增加登录系统、Token鉴权、角色权限等功能。
2. 支持更多文档格式
示例只支持 .txt 文件。实际项目中常见格式包括:
- Word
- Excel
- Markdown
- HTML
- 网页链接
- 数据库内容
可以使用以下库进行解析:
pypdfpython-docxunstructuredbeautifulsoup4pandas
3. 优化文本切分策略
文档切分会直接影响搜索效果。太短会丢失上下文,太长会影响匹配精度。一般建议:
- 普通知识库:300到800字一段;
- 技术文档:按标题层级切分;
- 法律合同:按条款切分;
- FAQ:按问答对切分。
4. 增加答案引用
为了提升可信度,AI搜索最好展示引用来源,例如文档名称、章节标题、页码、原文片段等。这样用户可以快速判断答案是否可靠。
5. 增加重排序
向量检索返回的结果不一定总是最准确,可以增加Rerank模型进行二次排序。常见做法是:
- 向量检索取前20条;
- Rerank模型重新排序;
- 取前3到5条交给大模型生成答案。
这样可以显著提升搜索准确率。
6. 使用更强的Embedding模型
本文使用的是轻量级多语言向量模型,适合入门。如果用于生产环境,可以考虑更强的Embedding模型,例如:
- OpenAI Embedding
- BGE系列模型
- Qwen Embedding
- Jina Embeddings
- text2vec模型
Embedding模型越适合你的语言和业务场景,检索效果通常越好。
7. 配置HTTPS和域名
正式上线时建议配置域名和HTTPS。可以使用Nginx反向代理FastAPI服务,再通过Certbot申请免费SSL证书。
简单Nginx配置示例:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
十四、常见问题排查
1. 访问不了8000端口怎么办?
检查服务是否启动:
ps aux | grep uvicorn
检查服务器防火墙和云厂商安全组是否开放8000端口。
Ubuntu防火墙开放端口:
sudo ufw allow 8000
2. API Key报错怎么办?
请检查 .env 文件中的配置是否正确:
OPENAI_API_KEY=你的真实密钥
OPENAI_BASE_URL=正确的接口地址
LLM_MODEL=正确的模型名称
同时确认账户余额、模型权限和接口格式是否兼容。
3. 搜索结果不准确怎么办?
可以从以下几个方面优化:
- 更换更好的Embedding模型;
- 调整文档切分大小;
- 增加文档数量和质量;
- 增加Rerank重排序;
- 优化Prompt;
- 清理重复、过期、低质量资料。
4. 导入文档后没有变化怎么办?
可能是旧数据仍然存在。可以删除 chroma_db 文件夹后重新导入:
rm -rf chroma_db
python ingest.py
注意:这会清空已有向量数据,请谨慎操作。
十五、总结
到这里,一个基础版AI搜索系统已经完成部署。它具备以下能力:
- 支持导入本地文本知识库;
- 支持文档切分;
- 支持文本向量化;
- 支持向量数据库检索;
- 支持调用大语言模型生成答案;
- 支持网页端提问;
- 支持Docker部署。
对于零基础学习者来说,本文方案足够帮助你理解AI搜索的核心原理和完整流程。真正的AI搜索并不是简单调用一个大模型,而是要把“数据处理、语义检索、上下文构建、模型生成、前端交互、部署运维”串成一条稳定链路。
如果你后续想继续升级,可以从三个方向入手:
- 提升检索质量:更好的Embedding、更合理的切分、更强的Rerank。
- 提升回答质量:优化Prompt、增加引用、控制模型幻觉。
- 提升系统体验:增加登录权限、多轮对话、文件上传、后台管理、实时同步。
AI搜索是大模型落地中非常实用的方向,无论是个人知识库、企业文档问答,还是客服系统和内容搜索,都可以基于本文的基础架构继续扩展。只要你按照步骤实践一遍,就能真正理解AI搜索从零到上线的完整过程。