用 Python + Ollama 简单做一个 AI 搜索引擎(本地版 Perplexity,完整代码结构 +简单代码 + 可落地 + 配置环境说明)
这篇文章,尝试着想用AI做一个本地搜索:
做一个 本地 AI 搜索引擎(类似 Perplexity)
它能做三件事:
输入问题
从本地知识库检索
用大模型生成“带理解”的答案
而且:
一、最终效果
用户输入:
什么是RAG?
系统输出:
RAG(Retrieval-Augmented
Generation)是一种结合检索
和生成的技术...
二、整体架构(先理解再写代码)
核心就 4 层:
用户问题 ↓Embedding(向量化) ↓向量检索(找相关内容) ↓Ollama(生成答案)
一句话来说就是:
先查资料,再让 AI 组织语言
三、环境准备(很关键)
1. 电脑配置建议
最低配置:
推荐配置(体验更好):
CPU:8核+
内存:16GB+
GPU(可选):NVIDIA
2. 安装 Ollama
官网下载安装(Mac / Linux / Windows)
安装完成后:
说明:
3. 安装 Python 依赖
pip install ollama faiss-cpu sentence-transformers
四、项目结构(工程化写法)
ai_search/ ├── main.py ├── rag/ │ ├── embedding.py │ ├── vector_store.py │ ├── retriever.py │ └── generator.py ├── data/ │ └── docs.txt └── config.py
五、核心代码实现(一步一步来)
1. 简单准备知识库
# data/docs.txtRAG 是一种结合检索和生成的技术。Ollama 是一个本地运行大模型的工具。Python 是一种流行的编程语言。
2. embedding.py(文本向量化)
# rag/embedding.pyfrom sentence_transformers import SentenceTransformermodel = SentenceTransformer("all-MiniLM-L6-v2")def embed(texts): return model.encode(texts)
3. vector_store.py(向量数据库)
# rag/vector_store.pyimport faissimport numpy as npclass VectorStore: def __init__(self, dim): self.index = faiss.IndexFlatL2(dim) self.texts = [] def add(self, embeddings, texts): self.index.add(np.array(embeddings)) self.texts.extend(texts) def search(self, query_embedding, k=3): D, I = self.index.search(query_embedding, k) return [self.texts[i] for i in I[0]]
4. retriever.py(检索器)
# rag/retriever.pyfrom .embedding import embeddef retrieve(query, store): q_emb = embed([query]) return store.search(q_emb)
5. generator.py(AI生成答案)
# rag/generator.pyimport ollamadef generate_answer(query, context): prompt = f"""请基于以下内容回答问题:{context}问题:{query}""" res = ollama.chat( model="llama3", messages=[{"role": "user", "content": prompt}], ) return res["message"]["content"]
6. main.py(主流程)
# main.pyfrom rag.embedding import embedfrom rag.vector_store import VectorStorefrom rag.retriever import retrievefrom rag.generator import generate_answer# 1. 读取数据with open("data/docs.txt", "r", encoding="utf-8") as f: docs = f.readlines()# 2. 向量化embeddings = embed(docs)# 3. 构建向量库store = VectorStore(len(embeddings[0]))store.add(embeddings, docs)# 4. 交互while True: query = input(">>> ") results = retrieve(query, store) context = "\n".join(results) answer = generate_answer(query, context) print("\n答案:", answer)
六、运行效果
输入:
>>> 什么是Ollama?
输出(示例):
Ollama 是一个可以在本地运行大
语言模型的工具...
七、这个项目所做的内容
核心不是代码,而是这三点:
1. 检索优先
先找资料,再回答
2. 本地运行
隐私安全 + 零成本
3. 可扩展
你可以加:
八、一些后续可以升级,继续做的点
1. 支持文件上传(PDF / Word)
2. 使用更强 embedding
bge-large
3. 加缓存(提升速度)
4. Web UI(FastAPI + 前端)