本文安装环境mac os,m系列处理器;python版本:3.12
之前使用的是uv(pip),但是安装faiss的时候一直报各种各样的错误,所以选择使用conda
安装conda
- 下载并安装Miniforge
bash
# 1. 下载适配的 Miniforge 安装包(国内镜像加速)
curl -L https://mirrors.tuna.tsinghua.edu.cn/github-release/conda-forge/miniforge/LatestRelease/Miniforge3-MacOSX-arm64.sh -o Miniforge3.sh
# 2. 赋予执行权限
chmod +x Miniforge3.sh
# 3. 静默安装(-b 不弹窗,-p 指定安装路径,推荐用户目录)
bash Miniforge3.sh -b -p ~/miniforge3
- 配置 Conda(解决国内下载慢)
bash
# 1. 激活 Conda 环境(临时生效)
source ~/miniforge3/bin/activate
# 2. 配置清华源(加速 Conda 包下载,2026年可用)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/
conda config --set show_channel_urls yes
# 3. 配置 pip 清华源(后续安装 LangChain 用)
mkdir -p ~/.pip
echo "[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn" > ~/.pip/pip.conf
- 验证安装是否成功
bash
# 1. 重启终端,执行激活命令
source ~/miniforge3/bin/activate
# 2. 查看 Conda 版本
conda --version
# 输出类似:conda 24.9.2 即成功
# 3. 查看当前环境
conda info --envs
# 输出包含 base 环境,说明安装完成
- 自动激活 Conda(可选)
bash
echo 'source ~/miniforge3/bin/activate' >> ~/.zshrc
source ~/.zshrc
- 创建自定义专属环境,这里叫ai_tag
bash
# 1. 创建 Python 3.12 环境(命名为 ai_rag)
conda create -n ai_rag python=3.12 -y
# 2. 激活该环境
conda activate ai_rag
卸载conda
bash
rm -rf ~/miniforge3
sed -i '' '/miniforge3/d' ~/.zshrc # 移除自动激活配置
conda安装Faiss和numpy
bash
conda install numpy=1.26.4 faiss-cpu=1.9.0 -y
conda安装langchain
- 激活环境
- 用 pip安装 LangChain 核心包
bash
pip install langchain langchain-openai。
- 用 pip 安装 LangChain 扩展包(必装)
- LangChain 的 OpenAI 对接、向量库集成等核心功能依赖扩展包,这些包仅在 PyPI 上提供,在 Conda 环境中直接用 pip 安装即可(会自动适配当前 Conda 环境):
bash
# 安装核心扩展包(适配你的 RAG 开发)
pip install langchain-openai langchain-community pymilvus -i https://pypi.tuna.tsinghua.edu.cn/simple
#langchain-openai:对接 OpenAI GPT/Embeddings(RAG 核心);
#langchain-community:集成 FAISS/Milvus 等向量库;
#pymilvus:对接 Milvus 向量数据库(可选,若用 Milvus 则装);
#清华源:解决国内下载慢的问题。
- 验证安装是否成功
- 创建测试文件 test_langchain.py,运行以下代码验证:
bash
"""
验证代码(适配版本:langchain 1.2.6 + langchain-community 0.4.1 + langchain-openai 1.1.7)
修复:MockEmbeddings 继承 LangChain 官方 Embeddings 抽象类,符合 0.4.1 版本规范
"""
import sys
import subprocess
import numpy as np
import faiss
# ========== 核心导入(严格适配你的版本) ==========
# LangChain 核心
import langchain
import langchain_core
# 关键:导入 LangChain 官方 Embeddings 抽象类
from langchain_core.embeddings import Embeddings
# FAISS 集成(langchain-community 0.4.1 规范)
from langchain_community.vectorstores import FAISS as LangChainFAISS
# 文本拆分器(1.1.0 版本)
from langchain_text_splitters import CharacterTextSplitter
# ========== 版本获取函数 ==========
def get_pkg_version(pkg_name: str) -> str:
"""通过 pip show 获取包版本,避免 __version__ 缺失"""
try:
result = subprocess.run(
[sys.executable, "-m", "pip", "show", pkg_name],
capture_output=True,
text=True,
check=True
)
for line in result.stdout.split("\n"):
if line.startswith("Version:"):
return line.split(":", 1)[1].strip()
return "版本解析失败"
except:
return "包未安装"
# ========== 1. 版本与环境验证 ==========
print("="*60 + " 环境与版本验证 " + "="*60)
print(f"✅ Python 路径:{sys.executable}")
print(f"✅ NumPy 版本:{np.__version__}")
print(f"✅ FAISS 版本:{faiss.__version__}")
print(f"✅ LangChain 核心版本:{langchain.__version__}")
print(f"✅ LangChain-Core 版本:{langchain_core.__version__}")
print(f"✅ LangChain-Community 版本:{get_pkg_version('langchain-community')}")
print(f"✅ LangChain-OpenAI 版本:{get_pkg_version('langchain-openai')}")
print(f"✅ LangChain-Text-Splitters 版本:{get_pkg_version('langchain-text-splitters')}")
print(f"✅ LangChain-Classic 版本:{get_pkg_version('langchain-classic')}")
print("="*128)
# ========== 2. FAISS 基础功能验证 ==========
print("\n" + "="*60 + " FAISS 核心功能验证 " + "="*60)
VECTOR_DIM = 1536 # 适配 OpenAI Embeddings 1.1.7 版本默认维度
test_vectors = np.random.random((50, VECTOR_DIM)).astype(np.float32)
# 构建 FAISS 索引
faiss_index = faiss.IndexFlatL2(VECTOR_DIM)
faiss_index.add(test_vectors)
print(f"✅ FAISS 索引创建成功,插入 {faiss_index.ntotal} 个向量")
# 测试相似检索
query_vec = np.random.random((1, VECTOR_DIM)).astype(np.float32)
distances, indices = faiss_index.search(query_vec, k=3)
print(f"✅ Top3 相似向量索引:{indices[0]}")
print(f"✅ 对应距离(越小越相似):{distances[0]}")
print("="*128)
# ========== 3. 适配 LangChain 规范的 Mock Embeddings ==========
class MockOpenAIEmbeddings(Embeddings):
"""
修复核心:继承 LangChain 官方 Embeddings 抽象类
实现所有必需方法,符合 0.4.1 版本的调用规范
"""
def embed_documents(self, texts: list[str]) -> list[list[float]]:
"""批量嵌入文档(必需实现)"""
return [np.random.random(VECTOR_DIM).tolist() for _ in texts]
def embed_query(self, text: str) -> list[float]:
"""嵌入查询文本(必需实现)"""
return np.random.random(VECTOR_DIM).tolist()
# 可选:实现 __call__ 方法,兼容旧版可调用逻辑
def __call__(self, text: str) -> list[float]:
return self.embed_query(text)
# ========== 4. LangChain 核心功能验证 ==========
print("\n" + "="*60 + " LangChain 核心功能验证 " + "="*60)
# 4.1 文本拆分器
text_splitter = CharacterTextSplitter(
chunk_size=200,
chunk_overlap=20,
separator="\n"
)
test_text = """
滑雪SSR是短回转半径的滑雪板,板腰窄、转弯灵活,非常适合新手练习基础转弯动作。
FAISS是Meta(原Facebook)开发的高效向量检索库,支持亿级向量的快速相似性检索,是RAG架构的核心组件。
LangChain 1.2.6 兼容 langchain-core 1.2.7,langchain-community 0.4.1 优化了第三方工具集成逻辑。
langchain-openai 1.1.7 适配了 OpenAI 最新的 Embeddings API,默认向量维度为1536。
Conda环境适合安装需要编译的Python包(如FAISS、NumPy),避免本地编译失败的问题。
"""
text_chunks = text_splitter.split_text(test_text.strip())
print(f"✅ 文本拆分完成,共生成 {len(text_chunks)} 个片段:")
for i, chunk in enumerate(text_chunks, 1):
print(f" {i}. {chunk[:50]}..." if len(chunk) > 50 else f" {i}. {chunk}")
# 4.2 初始化合规的 Embeddings 对象
embeddings = MockOpenAIEmbeddings()
# 4.3 构建 LangChain-FAISS 向量库(修复核心)
vector_db = LangChainFAISS.from_texts(
texts=text_chunks,
embedding=embeddings, # 传入合规的 Embeddings 对象
normalize_L2=True
)
print(f"\n✅ LangChain-FAISS 向量库构建成功,包含 {vector_db.index.ntotal} 个向量")
# 4.4 RAG 相似检索(无报错)
query = "新手适合用滑雪SSR吗?"
similar_docs = vector_db.similarity_search(
query=query,
k=2,
score_threshold=0.8
)
print(f"\n✅ 检索查询:{query}")
print(f"✅ 找到 {len(similar_docs)} 条相关文档:")
for i, doc in enumerate(similar_docs, 1):
print(f" {i}. 内容:{doc.page_content}")
print(f" 元数据:{doc.metadata}\n")
# ========== 5. 最终验证结果 ==========
print("="*128)
print("\n🎉 所有验证项均通过!关键修复总结:")
print(f" ✅ MockEmbeddings 继承 LangChain 官方 Embeddings 抽象类")
print(f" ✅ 实现 embed_documents/embed_query 必需方法")
print(f" ✅ 新增 __call__ 方法,兼容可调用逻辑")
print(f" ✅ 适配 langchain-community 0.4.1 的 Embeddings 规范")