上一篇 下一篇 分享链接 返回 返回顶部

零基础搭建 AI 搜索系统:从知识库导入到上线部署全流程

发布人:慈云数据-客服中心 发布时间:16小时前 阅读量:2

AI搜索 部署完整教程|零基础可学

随着大模型的发展,“AI搜索”已经成为很多个人站长、企业知识库、内容平台和内部办公系统的热门方向。传统搜索通常依赖关键词匹配,而AI搜索不仅能找到相关资料,还能理解用户问题、总结答案、引用来源,甚至进行多轮追问。简单来说,AI搜索就是“搜索引擎 + 向量数据库 + 大语言模型”的结合。

本文将用零基础也能理解的方式,带你从概念、环境准备、项目搭建、数据导入、向量检索、模型接入,到最终部署上线,完整走一遍AI搜索系统的部署流程。即使你没有太多编程经验,也可以按照步骤逐步完成。


一、什么是AI搜索?

AI搜索通常指基于大语言模型和语义检索能力的新一代搜索系统。它和传统搜索最大的区别在于:传统搜索更看重“关键词是否出现”,而AI搜索更看重“语义是否相关”。

举个例子:

用户搜索:

怎么提高网站打开速度?

传统搜索可能会匹配“网站”“打开”“速度”等关键词,然后返回包含这些词的网页。

AI搜索则会理解用户真正想问的是:

如何优化网站性能?

于是它可能检索到关于CDN、图片压缩、缓存策略、代码拆分、服务器优化等内容,并把结果整理成一段清晰的答案。

一个典型的AI搜索系统通常包含以下几个部分:

  1. 数据源:文档、网页、PDF、Markdown、数据库内容等。
  2. 文本切分:将长文档切成适合检索的小段。
  3. 向量化模型:把文字转换成向量。
  4. 向量数据库:存储向量并支持相似度搜索。
  5. 大语言模型:根据检索结果生成自然语言答案。
  6. 前端界面:提供用户输入问题和查看答案的页面。
  7. 后端服务:负责连接模型、数据库和业务逻辑。

二、AI搜索的基本工作流程

在正式部署之前,我们先理解AI搜索的运行流程。

当用户输入一个问题后,系统一般会经历以下步骤:

  1. 用户输入问题。
  2. 系统将问题转换成向量。
  3. 向量数据库根据语义相似度找到相关文档片段。
  4. 系统把相关片段和用户问题一起发送给大语言模型。
  5. 大语言模型结合资料生成答案。
  6. 前端展示答案,并可附带引用来源。

这个过程也被称为 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_URLLLM_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 文件。实际项目中常见格式包括:

  • PDF
  • Word
  • Excel
  • Markdown
  • HTML
  • 网页链接
  • 数据库内容

可以使用以下库进行解析:

  • pypdf
  • python-docx
  • unstructured
  • beautifulsoup4
  • pandas

3. 优化文本切分策略

文档切分会直接影响搜索效果。太短会丢失上下文,太长会影响匹配精度。一般建议:

  • 普通知识库:300到800字一段;
  • 技术文档:按标题层级切分;
  • 法律合同:按条款切分;
  • FAQ:按问答对切分。

4. 增加答案引用

为了提升可信度,AI搜索最好展示引用来源,例如文档名称、章节标题、页码、原文片段等。这样用户可以快速判断答案是否可靠。

5. 增加重排序

向量检索返回的结果不一定总是最准确,可以增加Rerank模型进行二次排序。常见做法是:

  1. 向量检索取前20条;
  2. Rerank模型重新排序;
  3. 取前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搜索并不是简单调用一个大模型,而是要把“数据处理、语义检索、上下文构建、模型生成、前端交互、部署运维”串成一条稳定链路。

如果你后续想继续升级,可以从三个方向入手:

  1. 提升检索质量:更好的Embedding、更合理的切分、更强的Rerank。
  2. 提升回答质量:优化Prompt、增加引用、控制模型幻觉。
  3. 提升系统体验:增加登录权限、多轮对话、文件上传、后台管理、实时同步。

AI搜索是大模型落地中非常实用的方向,无论是个人知识库、企业文档问答,还是客服系统和内容搜索,都可以基于本文的基础架构继续扩展。只要你按照步骤实践一遍,就能真正理解AI搜索从零到上线的完整过程。

目录结构
全文