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

从零搭建企业内部智能知识库:架构、部署到命令实战

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

AI搜索 企业知识库搭建|附完整命令

在企业数字化转型过程中,“知识”往往是最重要、也最容易被低效使用的资产。大量制度文档、产品手册、项目资料、会议纪要、研发规范、客户案例、售后记录散落在飞书、钉钉、企业微信、共享网盘、Confluence、Notion、GitLab、邮件和本地文件夹中。员工需要答案时,常常不是没有资料,而是找不到、看不懂、无法快速定位。

传统关键词搜索只能解决“我知道我要搜什么”的问题,而基于大模型与向量检索的 AI搜索 / 企业知识库,可以进一步解决“我不知道该怎么搜,但我想得到答案”的问题。它不仅能检索文档,还能理解语义、归纳总结、引用来源,并以自然语言形式返回结果。

本文将从架构设计、技术选型、部署步骤、数据导入、向量化、问答接口到常见优化,完整介绍如何搭建一套企业内部 AI 搜索知识库,并附上可直接执行的命令示例。


一、什么是企业 AI 搜索知识库?

企业 AI 搜索知识库,通常是指将企业内部的非结构化或半结构化资料进行清洗、切分、向量化存储,并通过大语言模型结合检索增强生成技术,也就是 RAG,来实现智能问答、语义搜索、文档溯源和知识管理的系统。

它的核心能力包括:

  1. 语义检索
    不再依赖完全匹配关键词,而是理解用户问题的含义。例如用户输入“新员工入职需要准备什么”,系统可以匹配到“员工入职流程”“人事资料提交清单”“IT账号开通规范”等文档。

  2. 基于文档回答问题
    大模型不是凭空回答,而是先从知识库中检索相关资料,再根据资料生成答案。

  3. 答案可追溯
    回答中可以附带引用来源,例如文档名称、段落位置、链接地址、更新时间等,方便用户核验。

  4. 支持多类型资料
    可以导入 PDF、Word、Excel、Markdown、TXT、网页、数据库记录、代码仓库文档等。

  5. 权限隔离
    企业场景中,知识库必须考虑不同部门、不同角色、不同安全级别的数据访问权限。


二、整体架构设计

一套典型的企业 AI 搜索知识库通常由以下模块组成:

企业文档 / 网页 / 数据库 / 工单 / 代码仓库
              ↓
        数据采集与解析
              ↓
        文本清洗与切分
              ↓
        Embedding 向量化
              ↓
        向量数据库 / 全文搜索引擎
              ↓
        RAG 检索增强
              ↓
        大语言模型生成答案
              ↓
        Web 页面 / API / 企业微信 / 飞书机器人

为了便于落地,本文采用一套适合中小企业和技术团队快速部署的方案:

模块 推荐组件
大模型服务 OpenAI、通义千问、智谱、DeepSeek、本地 Ollama
Embedding 模型 bge-m3、text-embedding-3-small、m3e、gte
向量数据库 Chroma、Milvus、Qdrant、pgvector
文档解析 LangChain、LlamaIndex、Unstructured
后端服务 Python + FastAPI
前端界面 Streamlit 或 Next.js
部署方式 Docker Compose
权限系统 企业 SSO、JWT、部门级 metadata 过滤

本文为了降低部署复杂度,采用如下组合:

  • Ollama:本地运行大模型和 Embedding 模型;
  • ChromaDB:轻量级向量数据库;
  • LangChain:负责文档加载、切分、检索与 RAG 编排;
  • FastAPI:提供问答接口;
  • Streamlit:提供简单可用的 Web 搜索页面;
  • Docker Compose:快速部署。

三、服务器环境准备

建议准备一台 Linux 服务器,最低配置如下:

用途 推荐配置
测试环境 4 核 CPU / 16GB 内存 / 100GB 磁盘
小型企业 8 核 CPU / 32GB 内存 / 500GB SSD
本地大模型推理 NVIDIA GPU 16GB 显存以上更佳

如果只是做原型验证,可以使用 CPU 模式运行小模型;如果企业文档较多、并发较高,建议使用 GPU 或外部大模型 API。

以下命令以 Ubuntu 22.04 为例。


四、安装基础环境

1. 更新系统

sudo apt update && sudo apt upgrade -y

2. 安装常用工具

sudo apt install -y curl wget git vim unzip build-essential python3 python3-pip python3-venv

3. 安装 Docker

curl -fsSL https://get.docker.com | sudo bash

4. 启动 Docker 并设置开机自启

sudo systemctl enable docker
sudo systemctl start docker

5. 安装 Docker Compose 插件

sudo apt install -y docker-compose-plugin

6. 验证安装

docker --version
docker compose version

五、安装 Ollama 本地大模型服务

Ollama 可以非常方便地在本地运行大语言模型和 Embedding 模型,适合企业内部知识库测试和私有化部署。

1. 安装 Ollama

curl -fsSL https://ollama.com/install.sh | sh

2. 启动服务

sudo systemctl enable ollama
sudo systemctl start ollama

3. 拉取大语言模型

如果服务器配置一般,可以先使用轻量模型:

ollama pull qwen2.5:7b

或者使用更强的模型:

ollama pull qwen2.5:14b

也可以使用 DeepSeek 系列模型:

ollama pull deepseek-r1:7b

4. 拉取 Embedding 模型

ollama pull bge-m3

5. 测试模型

ollama run qwen2.5:7b

输入:

你好,请用一句话介绍什么是企业知识库。

如果模型能够正常回复,说明本地模型服务已经可用。


六、创建项目目录

mkdir -p ~/ai-search-kb
cd ~/ai-search-kb

创建基础目录结构:

mkdir -p data docs app chroma_db

目录说明:

ai-search-kb/
├── app/              # 后端和前端代码
├── data/             # 原始文档目录
├── docs/             # 项目说明文档
├── chroma_db/        # Chroma 向量数据库持久化目录
└── requirements.txt  # Python 依赖

七、准备 Python 虚拟环境

cd ~/ai-search-kb
python3 -m venv .venv
source .venv/bin/activate

升级 pip:

pip install --upgrade pip

创建依赖文件:

cat > requirements.txt << 'EOF'
fastapi==0.115.6
uvicorn==0.34.0
streamlit==1.41.1
langchain==0.3.13
langchain-community==0.3.13
langchain-ollama==0.2.2
chromadb==0.5.23
pypdf==5.1.0
python-docx==1.1.2
unstructured==0.16.11
markdown==3.7
python-multipart==0.0.20
requests==2.32.3
EOF

安装依赖:

pip install -r requirements.txt

八、准备企业文档数据

将企业文档放入 data 目录,例如:

cp /path/to/your/files/*.pdf ~/ai-search-kb/data/
cp /path/to/your/files/*.docx ~/ai-search-kb/data/
cp /path/to/your/files/*.md ~/ai-search-kb/data/
cp /path/to/your/files/*.txt ~/ai-search-kb/data/

如果没有测试文档,可以创建一份示例制度文档:

cat > data/员工入职流程.md << 'EOF'
# 员工入职流程

新员工入职前,HR需要提前三个工作日发送入职通知,并收集身份证复印件、学历证明、银行卡信息和紧急联系人信息。

入职当天,员工需要完成劳动合同签署、保密协议签署、员工手册阅读确认以及办公设备领取。

IT部门需要在员工入职前一天完成企业邮箱、OA账号、代码仓库账号和VPN权限开通。

试用期为三个月,直属主管需要在入职后第一周安排导师,并在第一个月结束时进行试用期沟通。
EOF

再创建一份技术规范文档:

cat > data/API开发规范.md << 'EOF'
# API开发规范

所有后端API必须采用RESTful风格,接口路径使用小写英文单词,多个单词之间使用中划线连接。

接口返回格式统一为JSON,必须包含code、message和data三个字段。

生产环境接口必须启用鉴权,禁止在URL中传递敏感信息,例如token、密码、身份证号等。

接口错误码需要统一维护,业务错误码从10000开始,系统错误码从50000开始。

所有新增接口必须补充OpenAPI文档,并在合并到主分支前完成接口测试。
EOF

九、编写文档入库脚本

文档入库的核心流程是:

  1. 加载文档;
  2. 将文档切分成较小片段;
  3. 调用 Embedding 模型生成向量;
  4. 写入 ChromaDB。

创建入库脚本:

cat > app/ingest.py << 'EOF'
import os
from pathlib import Path

from langchain_community.document_loaders import (
    TextLoader,
    PyPDFLoader,
    Docx2txtLoader,
    UnstructuredMarkdownLoader,
)
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import Chroma

BASE_DIR = Path(__file__).resolve().parent.parent
DATA_DIR = BASE_DIR / "data"
CHROMA_DIR = BASE_DIR / "chroma_db"

def load_documents():
    documents = []

    for file_path in DATA_DIR.rglob("*"):
        if file_path.is_dir():
            continue

        suffix = file_path.suffix.lower()

        try:
            if suffix == ".pdf":
                loader = PyPDFLoader(str(file_path))
            elif suffix == ".docx":
                loader = Docx2txtLoader(str(file_path))
            elif suffix == ".md":
                loader = UnstructuredMarkdownLoader(str(file_path))
            elif suffix == ".txt":
                loader = TextLoader(str(file_path), encoding="utf-8")
            else:
                print(f"跳过不支持的文件类型: {file_path}")
                continue

            docs = loader.load()

            for doc in docs:
                doc.metadata["source"] = str(file_path.name)
                doc.metadata["path"] = str(file_path)

            documents.extend(docs)
            print(f"已加载: {file_path}")

        except Exception as e:
            print(f"加载失败: {file_path}, 错误: {e}")

    return documents

def main():
    print("开始加载文档...")
    documents = load_documents()
    print(f"原始文档数量: {len(documents)}")

    if not documents:
        print("没有可入库的文档")
        return

    splitter = RecursiveCharacterTextSplitter(
        chunk_size=800,
        chunk_overlap=120,
        separators=["\n\n", "\n", "。", ";", ",", " ", ""]
    )

    chunks = splitter.split_documents(documents)
    print(f"切分后片段数量: {len(chunks)}")

    embeddings = OllamaEmbeddings(
        model="bge-m3",
        base_url="http://localhost:11434"
    )

    print("开始写入向量数据库...")
    vectorstore = Chroma.from_documents(
        documents=chunks,
        embedding=embeddings,
        persist_directory=str(CHROMA_DIR),
        collection_name="enterprise_kb"
    )

    print("知识库入库完成")
    print(f"向量数据库目录: {CHROMA_DIR}")

if __name__ == "__main__":
    main()
EOF

执行入库:

python app/ingest.py

如果看到类似输出,说明向量库创建成功:

开始加载文档...
已加载: data/员工入职流程.md
已加载: data/API开发规范.md
原始文档数量: 2
切分后片段数量: 4
开始写入向量数据库...
知识库入库完成

十、编写 AI 搜索问答 API

接下来使用 FastAPI 提供一个 /ask 接口。用户提交问题后,系统从 ChromaDB 检索相关片段,再把片段和问题交给大模型生成答案。

创建 API 文件:

cat > app/api.py << 'EOF'
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List

from langchain_ollama import OllamaEmbeddings, ChatOllama
from langchain_community.vectorstores import Chroma
from langchain.prompts import ChatPromptTemplate

app = FastAPI(title="Enterprise AI Search KB")

CHROMA_DIR = "chroma_db"

class AskRequest(BaseModel):
    question: str
    top_k: int = 4

class SourceItem(BaseModel):
    source: str
    content: str

class AskResponse(BaseModel):
    answer: str
    sources: List[SourceItem]

embeddings = OllamaEmbeddings(
    model="bge-m3",
    base_url="http://localhost:11434"
)

vectorstore = Chroma(
    persist_directory=CHROMA_DIR,
    embedding_function=embeddings,
    collection_name="enterprise_kb"
)

llm = ChatOllama(
    model="qwen2.5:7b",
    base_url="http://localhost:11434",
    temperature=0.2
)

prompt = ChatPromptTemplate.from_template("""
你是企业内部知识库助手。请严格根据下面的参考资料回答用户问题。

要求:
1. 如果参考资料中没有答案,请明确说明“知识库中未找到相关信息”,不要编造。
2. 回答要简洁、准确、结构清晰。
3. 涉及流程、规范、清单时,优先使用列表。
4. 最后给出引用来源。

参考资料:
{context}

用户问题:
{question}
""")

@app.post("/ask", response_model=AskResponse)
def ask(req: AskRequest):
    docs = vectorstore.similarity_search(req.question, k=req.top_k)

    context_parts = []
    sources = []

    for i, doc in enumerate(docs, start=1):
        source = doc.metadata.get("source", "unknown")
        content = doc.page_content
        context_parts.append(f"[资料{i}] 来源:{source}\n内容:{content}")
        sources.append(SourceItem(source=source, content=content[:300]))

    context = "\n\n".join(context_parts)

    chain = prompt | llm
    result = chain.invoke({
        "context": context,
        "question": req.question
    })

    return AskResponse(
        answer=result.content,
        sources=sources
    )
EOF

启动 API 服务:

uvicorn app.api:app --host 0.0.0.0 --port 8000

测试接口:

curl -X POST "http://localhost:8000/ask" \
  -H "Content-Type: application/json" \
  -d '{"question":"新员工入职当天需要完成哪些事情?","top_k":4}'

可能得到如下结果:

{
  "answer": "新员工入职当天需要完成以下事项:\n\n1. 签署劳动合同;\n2. 签署保密协议;\n3. 阅读并确认员工手册;\n4. 领取办公设备。\n\n引用来源:员工入职流程.md",
  "sources": [
    {
      "source": "员工入职流程.md",
      "content": "新员工入职前,HR需要提前三个工作日发送入职通知..."
    }
  ]
}

十一、编写简单 Web 搜索页面

为了让非技术人员也能使用,可以用 Streamlit 快速搭建一个页面。

创建页面文件:

cat > app/web.py << 'EOF'
import streamlit as st
import requests

st.set_page_config(page_title="企业AI搜索知识库", page_icon="🔎", layout="wide")

st.title("🔎 企业AI搜索知识库")
st.caption("基于企业内部文档的智能问答与语义检索")

api_url = st.sidebar.text_input("API地址", "http://localhost:8000/ask")
top_k = st.sidebar.slider("检索片段数量", min_value=1, max_value=10, value=4)

question = st.text_area("请输入你的问题", placeholder="例如:新员工入职当天需要完成哪些事情?")

if st.button("开始搜索", type="primary"):
    if not question.strip():
        st.warning("请输入问题")
    else:
        with st.spinner("正在检索知识库并生成答案..."):
            resp = requests.post(api_url, json={
                "question": question,
                "top_k": top_k
            })

            if resp.status_code != 200:
                st.error(f"请求失败:{resp.text}")
            else:
                data = resp.json()
                st.subheader("答案")
                st.markdown(data["answer"])

                st.subheader("引用来源")
                for item in data["sources"]:
                    with st.expander(item["source"]):
                        st.write(item["content"])
EOF

启动页面:

streamlit run app/web.py --server.port 8501 --server.address 0.0.0.0

浏览器访问:

http://服务器IP:8501

十二、使用 Docker Compose 部署

如果希望更规范地部署,可以将 API 和 Web 服务容器化。由于 Ollama 通常运行在宿主机,也可以让容器访问宿主机的 11434 端口。

创建 Dockerfile

cat > Dockerfile << 'EOF'
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir --upgrade pip \
    && pip install --no-cache-dir -r requirements.txt

COPY . /app

EXPOSE 8000 8501
EOF

创建 docker-compose.yml

cat > docker-compose.yml << 'EOF'
services:
  api:
    build: .
    container_name: ai-search-api
    command: uvicorn app.api:app --host 0.0.0.0 --port 8000
    volumes:
      - ./data:/app/data
      - ./chroma_db:/app/chroma_db
    ports:
      - "8000:8000"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      - OLLAMA_BASE_URL=http://host.docker.internal:11434

  web:
    build: .
    container_name: ai-search-web
    command: streamlit run app/web.py --server.port 8501 --server.address 0.0.0.0
    volumes:
      - ./data:/app/data
      - ./chroma_db:/app/chroma_db
    ports:
      - "8501:8501"
    depends_on:
      - api
EOF

注意:如果在容器中使用 host.docker.internal 访问 Ollama,需要将代码里的 Ollama 地址改为读取环境变量。

修改 app/api.pyapp/ingest.py 中的 base_url,建议统一写成:

import os
OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434")

然后将:

base_url="http://localhost:11434"

替换为:

base_url=OLLAMA_BASE_URL

启动服务:

docker compose up -d --build

查看日志:

docker compose logs -f

停止服务:

docker compose down

十三、企业知识库的关键优化点

基础系统搭建完成后,真正决定效果的不是“能不能回答”,而是“回答是否准确、稳定、可控”。企业落地时建议重点优化以下方面。

1. 文档切分策略

切分过大,会导致检索结果不精准;切分过小,会导致上下文缺失。一般建议:

  • 制度类文档:chunk_size 600~1000;
  • 技术文档:chunk_size 800~1200;
  • FAQ 文档:按问答对切分;
  • 表格文档:尽量按行、主题或 Sheet 切分;
  • 合同类文档:按章节和条款切分。

如果企业文档结构规范,最好先按标题层级切分,再按长度补充切分,这样检索质量会更高。

2. 混合检索

单纯向量检索适合语义相近的问题,但对于产品型号、错误码、工单编号、客户名称、接口路径等精确匹配内容,传统关键词搜索更有效。因此生产系统建议采用:

向量检索 + BM25关键词检索 + 重排序模型

常见方案包括:

  • Elasticsearch + 向量检索;
  • OpenSearch;
  • Milvus + ES;
  • Qdrant + BM25;
  • bge-reranker 或 Cohere Rerank。

3. Rerank 重排序

向量数据库返回的 Top K 结果不一定最适合直接给大模型。加入重排序模型后,可以显著提升答案准确率。

例如检索阶段取 Top 20,再重排序选 Top 5:

用户问题 → 向量检索Top20 → Rerank排序 → 选Top5 → 大模型回答

4. 元数据与权限控制

企业知识库一定要给文档加 metadata,例如:

{
  "source": "员工手册.pdf",
  "department": "HR",
  "security_level": "internal",
  "owner": "hr_team",
  "updated_at": "2025-01-01"
}

检索时根据用户身份过滤:

filter={"department": {"$in": ["HR", "ALL"]}}

否则很容易出现越权访问,例如普通员工搜到财务预算、薪资数据、客户合同等敏感内容。

5. 文档更新机制

知识库不是一次性项目,而是持续运营系统。建议设置:

  • 每天定时扫描新增文档;
  • 对变更文档重新入库;
  • 对删除文档同步删除向量;
  • 保留文档版本;
  • 显示文档更新时间;
  • 对过期文档自动标记。

可以用 crontab 设置定时任务:

crontab -e

添加每天凌晨 2 点自动入库:

0 2 * * * cd /home/ubuntu/ai-search-kb && /home/ubuntu/ai-search-kb/.venv/bin/python app/ingest.py >> ingest.log 2>&1

6. 答案质量评估

企业上线前,应准备一批标准问题集,例如:

1. 新员工入职需要哪些材料?
2. API返回格式有什么要求?
3. 生产环境接口是否可以在URL中传token?
4. 试用期多久?
5. 新接口上线前需要补充什么文档?

对每个问题评估:

  • 是否命中正确文档;
  • 回答是否完整;
  • 是否出现幻觉;
  • 是否引用来源;
  • 无答案时是否拒答;
  • 是否符合企业语气和规范。

十四、安全与合规建议

企业知识库涉及大量内部资料,安全设计必须前置,而不是上线后补救。

1. 模型选择

如果资料敏感,优先选择私有化部署模型,如:

  • Qwen;
  • DeepSeek;
  • Llama;
  • Baichuan;
  • ChatGLM;
  • Yi。

如果使用公有云大模型 API,需要确认:

  • 数据是否用于训练;
  • 是否支持企业数据隔离;
  • 是否支持日志关闭;
  • 是否满足公司合规要求;
  • 是否签署数据处理协议。

2. 网络隔离

建议将知识库部署在企业内网,通过 VPN 或 SSO 访问,不直接暴露公网。

如必须暴露公网,至少配置 Nginx HTTPS 反向代理、访问鉴权和限流。

安装 Nginx:

sudo apt install -y nginx

示例反向代理配置:

sudo cat > /etc/nginx/sites-available/ai-search-kb << 'EOF'
server {
    listen 80;
    server_name kb.example.com;

    location / {
        proxy_pass http://127.0.0.1:8501;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
EOF

启用配置:

sudo ln -s /etc/nginx/sites-available/ai-search-kb /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

3. 日志脱敏

问答日志对于优化很重要,但其中可能包含敏感信息。建议对以下内容脱敏:

  • 手机号;
  • 身份证号;
  • 银行卡号;
  • token;
  • 密码;
  • 客户姓名;
  • 合同金额;
  • 内部系统地址。

十五、常见问题排查

1. Ollama 无法连接

检查服务状态:

systemctl status ollama

检查端口:

curl http://localhost:11434/api/tags

如果在 Docker 容器中访问宿主机 Ollama,请确认使用:

http://host.docker.internal:11434

2. 入库速度慢

可能原因:

  • 文档太多;
  • Embedding 模型较大;
  • CPU 推理较慢;
  • chunk 切分过细。

优化方式:

  • 使用 GPU;
  • 减小文档量分批入库;
  • 使用更快的 Embedding 模型;
  • 做增量入库;
  • 避免重复处理未变化文档。

3. 回答胡编乱造

优化方式:

  • Prompt 中明确“不知道就说不知道”;
  • 降低 temperature;
  • 提高检索准确率;
  • 引入 rerank;
  • 限制模型只能根据上下文回答;
  • 增加引用来源展示。

4. 搜不到明明存在的内容

可能原因:

  • 文档解析失败;
  • 文档是扫描版 PDF;
  • 切分不合理;
  • top_k 太小;
  • 用户问题与文档表述差异过大;
  • 缺少 OCR。

对于扫描版 PDF,需要先做 OCR,例如使用 PaddleOCR 或云 OCR 服务。


十六、生产环境推荐架构

如果企业要正式上线,建议从本文的轻量架构升级为生产架构:

文档源:网盘 / 飞书 / Confluence / GitLab / 数据库
        ↓
采集服务:定时同步 + Webhook
        ↓
解析服务:PDF / Office / OCR / HTML / Markdown
        ↓
清洗切分:结构化切分 + 元数据提取
        ↓
索引服务:Embedding + BM25 + Rerank
        ↓
存储层:Milvus/Qdrant + Elasticsearch + PostgreSQL
        ↓
权限层:SSO + RBAC + ABAC
        ↓
问答层:RAG + LLM + Prompt模板
        ↓
应用层:Web / API / 飞书机器人 / 企业微信机器人
        ↓
运营层:日志分析 + 反馈闭环 + 效果评估

对于中大型企业,尤其需要关注:

  • 多租户隔离;
  • 部门权限;
  • 审计日志;
  • 灰度发布;
  • 高可用部署;
  • 向量库备份;
  • 文档版本管理;
  • 模型成本控制;
  • 问答质量持续评估。

十七、完整命令汇总

下面给出从零开始的核心命令汇总,方便直接复制执行。

# 1. 系统更新
sudo apt update && sudo apt upgrade -y

# 2. 安装基础工具
sudo apt install -y curl wget git vim unzip build-essential python3 python3-pip python3-venv

# 3. 安装 Docker
curl -fsSL https://get.docker.com | sudo bash
sudo systemctl enable docker
sudo systemctl start docker

# 4. 安装 Docker Compose
sudo apt install -y docker-compose-plugin

# 5. 安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh
sudo systemctl enable ollama
sudo systemctl start ollama

# 6. 拉取模型
ollama pull qwen2.5:7b
ollama pull bge-m3

# 7. 创建项目
mkdir -p ~/ai-search-kb
cd ~/ai-search-kb
mkdir -p data docs app chroma_db

# 8. 创建虚拟环境
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip

# 9. 创建依赖文件
cat > requirements.txt << 'EOF'
fastapi==0.115.6
uvicorn==0.34.0
streamlit==1.41.1
langchain==0.3.13
langchain-community==0.3.13
langchain-ollama==0.2.2
chromadb==0.5.23
pypdf==5.1.0
python-docx==1.1.2
unstructured==0.16.11
markdown==3.7
python-multipart==0.0.20
requests==2.32.3
EOF

# 10. 安装依赖
pip install -r requirements.txt

# 11. 准备测试文档
cat > data/员工入职流程.md << 'EOF'
# 员工入职流程

新员工入职前,HR需要提前三个工作日发送入职通知,并收集身份证复印件、学历证明、银行卡信息和紧急联系人信息。

入职当天,员工需要完成劳动合同签署、保密协议签署、员工手册阅读确认以及办公设备领取。

IT部门需要在员工入职前一天完成企业邮箱、OA账号、代码仓库账号和VPN权限开通。

试用期为三个月,直属主管需要在入职后第一周安排导师,并在第一个月结束时进行试用期沟通。
EOF

十八、总结

企业 AI 搜索知识库的价值,不只是“把文档变成聊天机器人”,而是让组织知识真正流动起来。它可以降低员工查资料的时间成本,减少重复咨询,提高新人培训效率,帮助研发、销售、客服、HR、法务等部门快速获取准确答案。

但需要注意的是,AI 搜索不是简单接入一个大模型就能完成。真正可用的企业知识库,必须同时做好文档治理、数据清洗、检索策略、权限控制、答案溯源、安全合规和持续运营。

本文提供的方案适合快速搭建原型,也可以作为生产系统的起点。对于小团队,可以先用 Ollama + Chroma + LangChain 跑通流程;对于正式企业级场景,则建议进一步引入 Milvus、Elasticsearch、Rerank、SSO、审计日志和自动化文档同步机制。

一句话总结:AI 搜索的核心不是让模型记住企业知识,而是让模型能够安全、准确、可追溯地使用企业知识。

目录结构
全文