1.4 技术栈概览 — AI知识库搭建全攻略 本节导读:系统梳理AI知识库建设所需的完整技术栈,从数据存储到应用层架构,帮助读者建立技术选型全局观,明确各组件的职责与协作关系。 学习目标 掌握AI知识库完整技术栈架构图 了解核心组件的技术原理与选型标准 能够根据项目需求进行合理技术选型 理解各组件间的依赖关系与集成要点 核心概念 AI知识库技术栈是一个分层的系统架构,涵盖从数据存储到应用服务的完整链路。每个层级都有特定的技术选型和实现方案: 环境准备 / 前置知识 基础依赖 Python 3.8+(推荐3.10+) Git 2.
本节导读:系统梳理AI知识库建设所需的完整技术栈,从数据存储到应用层架构,帮助读者建立技术选型全局观,明确各组件的职责与协作关系。
AI知识库技术栈是一个分层的系统架构,涵盖从数据存储到应用服务的完整链路。每个层级都有特定的技术选型和实现方案:
┌─────────────────────────────────────────┐ │ 应用服务层 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │API网关 │ │用户界面 │ │业务逻辑 │ │ │ └─────────┘ └─────────┘ └─────────┘ │ └─────────────────────────────────────────┘ ↑ ↑ ┌─────────────────────────────────────────┐ │ 应用框架层 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │LangChain│ │LlamaIndex│ │自定义框架│ │ │ └─────────┘ └─────────┘ └─────────┘ │ └─────────────────────────────────────────┘ ↑ ↑ ┌─────────────────────────────────────────┐ │ 向量数据库层 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │Milvus │ │Pinecone │ │ Chroma │ │ │ └─────────┘ └─────────┘ └─────────┘ │ └─────────────────────────────────────────┘ ↑ ↑ ┌─────────────────────────────────────────┐ │ 向量化模型层 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │OpenAI │ │BGE-M3 │ │Sentence │ │ │ │Embedding│ │ │ │-Transform│ │ │ └─────────┘ └─────────┘ └─────────┘ │ └─────────────────────────────────────────┘ ↑ ↑ ┌─────────────────────────────────────────┐ │ 文档处理层 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │PDF解析 │ │Markdown │ │HTML提取 │ │ │ └─────────┘ └─────────┘ └─────────┘ │ └─────────────────────────────────────────┘
向量数据库是AI知识库的核心组件,负责存储和检索向量化的文档。
| 特性 | Milvus | Pinecone | Chroma | FAISS | Qdrant |
|---|---|---|---|---|---|
| 开源 | ✅ | ❌ | ✅ | ✅ | ✅ |
| 扩展性 | 高 | 中 | 低 | 中 | 高 |
| 易用性 | 中 | 高 | 高 | 低 | 中 |
| 企业级 | ✅ | ✅ | ❌ | ❌ | ✅ |
| 云原生 | ✅ | ✅ | ✅ | ❌ | ✅ |
Milvus:最适合大规模部署
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType, utility import numpy as np # 连接到Milvus connections.connect("default", host="localhost", port="19530") # 定义Schema schema = CollectionSchema([ FieldSchema("id", DataType.INT64, is_primary=True), FieldSchema("vector", DataType.FLOAT_VECTOR, dim=768), FieldSchema("text", DataType.STRING) ]) # 创建集合 collection = Collection("ai_knowledge_base", schema) # 创建索引 index_params = { "metric_type": "L2", "index_type": "IVF_FLAT", "params": {"nlist": 1024} } collection.create_index("vector", index_params) # 插入数据 vectors = np.random.rand(100, 768).astype(np.float32) texts = [f"文档内容{i}" for i in range(100)] ids = list(range(100)) collection.insert([ [ids, vectors, texts] ])
Chroma:最适合快速原型开发
import chromadb from chromadb.utils import embedding_functions # 初始化Chroma chroma_client = chromadb.Client() # 创建或获取集合 collection = chroma_client.get_or_create_collection("ai_kb") # 使用OpenAI嵌入 embedding_function = embedding_functions.OpenAIEmbeddingFunction( api_key="your-api-key" ) # 插入文档 documents = [ "AI知识库是基于大语言模型和向量数据库的技术解决方案", "RAG技术通过检索增强生成提高了回答的准确性和可靠性", "向量数据库支持高效的语义搜索和相似度计算" ] collection.add( documents=documents, embeddings=[embedding_function(doc) for doc in documents], metadatas=[{"source": doc} for doc in documents], ids=[f"doc_{i}" for i in range(len(documents))] ) # 检询 results = collection.query( query_texts=["什么是AI知识库"], n_results=3 )
嵌入模型负责将文本转换为向量表示,直接影响检索效果。
| 模型 | 维度 | 开源 | 性能 | 成本 | 适用场景 |
|---|---|---|---|---|---|
| text-embedding-ada-002 | 1536 | ❌ | 高 | 高 | 生产环境 |
| text-embedding-3-small | 1536 | ❌ | 中 | 中 | 平衡选择 |
| text-embedding-3-large | 3072 | ❌ | 高 | 高 | 高精度需求 |
| BGE-M3 | 1024 | ✅ | 高 | 免费 | 开源方案 |
| Sentence-BERT | 768 | ✅ | 中 | 免费 | 成本敏感 |
OpenAI Embedding:最适合生产环境
from openai import OpenAI import numpy as np client = OpenAI(api_key="your-api-key") def get_embedding(text): response = client.embeddings.create( input=text, model="text-embedding-3-small" ) return np.array(response.data[0].embedding) # 使用示例 text = "AI知识库的核心是提供精准的信息检索" embedding = get_embedding(text) print(f"向量维度: {len(embedding)}")
BGE-M3:最适合开源方案
from FlagEmbedding import BGEM3FlagModel import numpy as np # 初始化模型 model = BGEM3FlagModel('BAAI/bge-m3', device='cpu') def get_bge_embedding(text): embeddings = model.encode(text, batch_size=1, max_length=8192) return embeddings['dense_vecs'][0] # 使用示例 text = "开源向量数据库在知识库建设中具有重要意义" embedding = get_bge_embedding(text) print(f"向量维度: {len(embedding)}")
应用框架负责连接向量数据库和语言模型,提供统一的API接口。
| 框架 | 特点 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| LangChain | 功能全面 | 生态系统完善 | 学习曲线陡 | 复杂项目 |
| LlamaIndex | 专注RAG | 文档处理强 | 生态相对小 | 知识密集型 |
| Haystack | 模块化 | 灵活扩展 | 配置复杂 | 企业应用 |
| Custom | 定制化 | 针对性强 | 开发成本高 | 特殊需求 |
LangChain:最适合复杂项目
from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores import Chroma from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.chains import RetrievalQA from langchain.document_loaders import TextLoader # 加载文档 loader = TextLoader("documents/ai_knowledge_base.txt") documents = loader.load() # 文档分块 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200 ) chunks = text_splitter.split_documents(documents) # 创建向量存储 embeddings = OpenAIEmbeddings(model="text-embedding-3-small") vectorstore = Chroma.from_documents( documents=chunks, embedding=embeddings, persist_directory="./chroma_db" ) # 创建检索链 llm = ChatOpenAI(model="gpt-4") qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever(), return_source_documents=True ) # 使用示例 question = "什么是AI知识库的核心价值?" result = qa_chain.invoke(question) print(result["result"])
LlamaIndex:最适合知识密集型项目
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from llama_index.core.node_parser import SentenceSplitter from llama_index.core.query_engine import RetrieverQueryEngine from llama_index.core.retrievers import VectorIndexRetriever # 加载文档 documents = SimpleDirectoryReader("./documents").load_data() # 创建索引 index = VectorStoreIndex.from_documents(documents) # 创建检索引擎 query_engine = index.as_query_engine() # 使用示例 response = query_engine.query( "AI知识库在哪些场景中应用最广泛?" ) print(response)
文档处理负责将原始文档转换为可检索的结构化数据。
from langchain_community.document_loaders import ( PyPDFLoader, TextLoader, CSVLoader, UnstructuredHTMLLoader ) from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_transformers import Html2TextTransformer # PDF文档处理 def process_pdf(file_path): loader = PyPDFLoader(file_path) documents = loader.load() # 文档分块 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, length_function=len ) chunks = text_splitter.split_documents(documents) return chunks # Markdown文档处理 def process_markdown(file_path): loader = TextLoader(file_path) documents = loader.load() # Markdown特有的分块处理 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1500, chunk_overlap=100, separators=["\n\n", "\n", ". ", " ", ""] ) chunks = text_splitter.split_documents(documents) return chunks # HTML文档处理 def process_html(file_path): loader = UnstructuredHTMLLoader(file_path) documents = loader.load() # 转换为纯文本 html2text = Html2TextTransformer() documents = html2text.transform_documents(documents) # 分块 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200 ) chunks = text_splitter.split_documents(documents) return chunks
import os from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores import Chroma from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.chains import RetrievalQA from langchain_community.document_loaders import PyPDFLoader from langchain_community.document_transformers import Html2TextTransformer class AILKnowledgeBase: def __init__(self, api_key, persist_directory="./chroma_db"): self.api_key = api_key self.persist_directory = persist_directory self.embeddings = OpenAIEmbeddings( model="text-embedding-3-small", api_key=api_key ) self.llm = ChatOpenAI( model="gpt-4", api_key=api_key ) self.vectorstore = None self.qa_chain = None def load_documents(self, file_paths): """加载文档""" documents = [] for file_path in file_paths: if file_path.endswith('.pdf'): loader = PyPDFLoader(file_path) docs = loader.load() elif file_path.endswith('.md'): loader = TextLoader(file_path) docs = loader.load() elif file_path.endswith('.html'): loader = UnstructuredHTMLLoader(file_path) docs = loader.load() docs = Html2TextTransformer().transform_documents(docs) else: continue documents.extend(docs) return documents def process_documents(self, documents): """处理文档:分块""" text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, length_function=len, separators=["\n\n", "\n", ". ", " ", ""] ) chunks = text_splitter.split_documents(documents) return chunks def build_vectorstore(self, chunks): """构建向量存储""" self.vectorstore = Chroma.from_documents( documents=chunks, embedding=self.embeddings, persist_directory=self.persist_directory ) # 持久化 self.vectorstore.persist() def create_qa_chain(self): """创建问答链""" self.qa_chain = RetrievalQA.from_chain_type( llm=self.llm, chain_type="stuff", retriever=self.vectorstore.as_retriever(), return_source_documents=True ) def query(self, question): """查询知识库""" if not self.qa_chain: raise ValueError("QA chain not initialized") result = self.qa_chain.invoke(question) return result def load_from_storage(self): """从存储加载向量数据库""" self.vectorstore = Chroma( persist_directory=self.persist_directory, embedding_function=self.embeddings ) self.create_qa_chain() # 使用示例 kb = AILKnowledgeBase( api_key="your-openai-api-key", persist_directory="./ai_kb_db" ) # 加载文档 file_paths = [ "documents/ai_basics.md", "documents/rag_tutorial.pdf", "documents/technical_specs.html" ] documents = kb.load_documents(file_paths) # 处理文档 chunks = kb.process_documents(documents) print(f"文档分块数量: {len(chunks)}") # 构建知识库 kb.build_vectorstore(chunks) kb.create_qa_chain() # 测试查询 question = "什么是检索增强生成(RAG)技术?" result = kb.query(question) print("回答:", result['result']) print("来源文档:") for doc in result['source_documents']: print(f"- {doc.metadata.get('source', 'Unknown')}: {doc.page_content[:100]}...")
A:选择向量数据库需要考虑以下因素:
A:嵌入模型直接影响知识库的检索效果,具体影响:
A:文档分块的关键要点:
A:优化检索效果的策略:
通过本节学习,我们系统掌握了AI知识库的完整技术栈,包括向量数据库、嵌入模型、应用框架和文档处理等核心组件。技术选型需要综合考虑数据规模、成本预算、技术能力和应用场景等因素。
关键收获:
下一节衔接:在理解技术栈的基础上,下一章将深入讲解核心技术原理,重点关注向量数据库的底层架构和检索算法,为后续的架构设计奠定理论基础。
关键词:AI知识库搭建全攻略, 技术栈, 向量数据库, 嵌入模型, LangChain, 检索增强生成, 系统架构, 技术选型
难度:进阶
预计阅读:30 分钟