LangChain文本嵌入模型
·
LangChain文本嵌入模型
本文详细讲解如何使用 LangChain 构建检索增强生成(RAG) 系统,覆盖智谱 AI 集成、中文嵌入模型、文本分块、Chroma 向量数据库、语义搜索等核心知识点,附完整可运行代码与最佳实践。
一、RAG 与 LangChain 概述
1. 什么是 RAG
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索与大语言模型生成的技术:
- 检索阶段:将用户的问题向量化,在向量数据库中搜索最相关的文档片段
- 生成阶段:将检索到的文档片段作为上下文,连同用户问题一起发送给大模型,生成基于私有数据的准确回答
- 核心优势:解决大模型“知识截止日期”和“幻觉”问题,让大模型使用企业私有数据回答问题
2. 什么是 LangChain
LangChain 是一个用于开发大语言模型应用的框架,提供了统一的接口来连接:
- 各种大模型(OpenAI、智谱 AI、Claude 等)
- 各种嵌入模型(OpenAI Embeddings、HuggingFace、智谱 embedding 等)
- 各种向量数据库(Chroma、Pinecone、Milvus 等)
- 各种文档加载器(PDF、Word、TXT、网页等)
二、环境准备:安装依赖
1. 核心依赖安装
# 基础 LangChain
pip install langchain langchain-core langchain-community
# 智谱 AI 集成
pip install zhipuai
# HuggingFace 嵌入模型(中文支持)
pip install langchain-huggingface sentence-transformers
# Chroma 向量数据库(本地持久化)
pip install chromadb==1.0.15
# 文本处理工具
pip install tiktoken
2. 依赖说明
| 包名 | 作用 |
|---|---|
langchain |
LangChain 核心框架 |
langchain-community |
第三方集成(智谱 AI、Chroma 等) |
zhipuai |
智谱 AI 官方 SDK |
langchain-huggingface |
HuggingFace 嵌入模型集成 |
sentence-transformers |
中文嵌入模型(bge 系列) |
chromadb |
本地向量数据库 |
三、智谱 AI 集成:GLM-4 对话与 Embedding
1. GLM-4 对话模型集成
import os
from langchain_community.chat_models import ChatZhipuAI
from langchain.schema import HumanMessage, SystemMessage
# 配置 API Key(请替换为你的实际 Key)
os.environ["ZHIPUAI_API_KEY"] = "你的智谱API Key"
# 初始化 GLM-4 模型
chat = ChatZhipuAI(
model="glm-4",
temperature=0.5, # 生成文本的随机程度:0-1,越小越确定
max_tokens=2048
)
# 简单对话
response = chat.invoke([
SystemMessage(content="你是一个专业的AI助手,回答简洁准确。"),
HumanMessage(content="什么是RAG?")
])
print("GLM-4回答:", response.content)
2. 智谱 Embedding-3 向量模型集成
智谱提供了兼容 OpenAI 格式的 Embedding API,可以直接通过 OpenAIEmbeddings 调用:
from langchain_openai import OpenAIEmbeddings
# 初始化智谱 Embedding-3 模型
embeddings = OpenAIEmbeddings(
openai_api_base="https://open.bigmodel.cn/api/paas/v4/",
openai_api_key="你的智谱API Key",
model="embedding-3"
)
# 测试:将文本转换为向量
text = "如何使用LangChain构建RAG系统"
vector = embeddings.embed_query(text)
print(f"向量维度:{len(vector)}")
print(f"前5个数值:{vector[:5]}")
四、中文嵌入模型:BGE 系列(推荐!)
智谱 Embedding 虽然方便,但对于中文场景,BGE(BAAI General Embedding) 系列模型是更优选择,开源免费、中文效果好。
1. 下载 BGE 模型
访问 HuggingFace 下载 bge-small-zh-v1.5(轻量快速,适合入门):
- 模型地址:https://huggingface.co/BAAI/bge-small-zh-v1.5
- 下载后将模型文件夹放在项目目录下
2. 使用 BGE 生成中文向量
from langchain_huggingface import HuggingFaceEmbeddings
# 模型路径(替换为你的实际路径)
model_path = "./bge-small-zh-v1.5"
# 初始化 BGE 嵌入模型
embeddings = HuggingFaceEmbeddings(
model_name=model_path,
model_kwargs={'device': 'cpu'}, # 有GPU可改为 'cuda'
encode_kwargs={'normalize_embeddings': True} # 归一化,提高相似度计算准确性
)
# 测试:生成向量
query = "如何申请年假?"
vector = embeddings.embed_query(query)
print(f"向量生成成功!维度:{len(vector)}")
print(f"前5个数值:{vector[:5]}")
五、文档加载与中文文本分块(核心!)
1. 文档加载:支持多种格式
LangChain 提供了丰富的文档加载器,这里以最常用的 TXT 文本为例:
from langchain_community.document_loaders import TextLoader
# 加载 TXT 文件(请确保 policy.txt 存在)
loader = TextLoader('policy.txt', encoding='utf-8')
documents = loader.load()
print(f"加载了 {len(documents)} 个文档")
print(f"文档内容预览:\n{documents[0].page_content[:500]}...")
2. 中文文本分块:RecursiveCharacterTextSplitter
大模型的上下文长度有限,必须将长文档切分为合适大小的“块”(Chunk)。中文分块需要特别注意标点符号和语义完整性:
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 配置中文文本分块器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=100, # 每个块的大小(字符数,中文建议 100-500)
chunk_overlap=20, # 块之间的重叠(避免上下文丢失,建议 chunk_size 的 10%-20%)
separators=[ # 中文分隔符优先级(从高到低)
"\n\n", # 双换行(段落分隔)
"\n", # 单换行
"。", # 句号
"!", # 感叹号
"?", # 问号
",", # 逗号
";", # 分号
":", # 冒号
" ", # 空格
"" # 任意字符
]
)
# 执行分块
splits = text_splitter.split_documents(documents)
print(f"总共分成了 {len(splits)} 个文本块")
print("\n第一个文本块:")
print(splits[0].page_content)
print("\n第二个文本块:")
print(splits[1].page_content)
分块最佳实践:
- 中文:chunk_size 建议 100-500 字符(根据模型上下文长度调整)
- chunk_overlap 建议为 chunk_size 的 10%-20%,保证上下文连贯性
- 必须使用中文专用的 separators,避免把一句话切两半
六、Chroma 向量数据库:持久化与语义搜索
1. 向量数据库持久化
将分块后的文本向量化并存储到 Chroma 数据库中,实现数据持久化:
from langchain_community.vectorstores import Chroma
# 1. 创建/加载 Chroma 数据库
db = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory="./chroma_db" # 数据库存储路径(本地文件夹)
)
# 2. 持久化到磁盘(重要!)
db.persist()
print("向量数据库创建成功!")
2. 语义搜索:相似度检索
基于向量相似度搜索最相关的文档片段:
# 加载已有的向量数据库(如果程序重启)
db = Chroma(
persist_directory="./chroma_db",
embedding_function=embeddings
)
# 执行语义搜索
query = "迟到超过30分钟会怎么样?"
docs = db.similarity_search(query, k=2) # k=2 表示返回最相关的2个结果
print("搜索结果:")
for i, doc in enumerate(docs):
print(f"\n--- 结果 {i+1} ---")
print(doc.page_content)
print(f"来源:{doc.metadata}")
3. 带分数的相似度搜索
# similarity_search_with_score 返回相似度分数(0-1,越大越相似)
docs_with_scores = db.similarity_search_with_score(query, k=2)
print("带分数的搜索结果:")
for i, (doc, score) in enumerate(docs_with_scores):
print(f"\n--- 结果 {i+1} (相似度:{score:.4f}) ---")
print(doc.page_content)
七、完整实战:简单的评论情感分类
除了 RAG,向量还可以用于简单的分类任务。下面是一个基于向量 + 逻辑回归的中文评论情感分类示例:
from langchain_huggingface import HuggingFaceEmbeddings
from sklearn.linear_model import LogisticRegression
# 1. 初始化嵌入模型
embeddings = HuggingFaceEmbeddings(model_name="./bge-small-zh-v1.5")
# 2. 准备训练数据(评论 + 标签:1=好评,0=差评)
comments = [
"太好了,非常满意!",
"不好吃,服务也差",
"一般般,没什么特别的",
"非常棒,下次还来!",
"很失望,完全不符合预期"
]
labels = [1, 0, 0, 1, 0]
# 3. 将评论转换为向量
comment_vectors = embeddings.embed_documents(comments)
# 4. 训练逻辑回归模型
clf = LogisticRegression().fit(comment_vectors, labels)
# 5. 测试新评论
test_comment = ["味道不错,环境也很好!"]
test_vector = embeddings.embed_documents(test_comment)
prediction = clf.predict(test_vector)
print("预测结果:", "好评" if prediction[0] == 1 else "差评")
八、完整 RAG 系统:检索 + 生成
将前面的所有步骤整合,构建一个完整的 RAG 系统:
import os
from langchain_community.chat_models import ChatZhipuAI
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.prompts import ChatPromptTemplate
from langchain.schema import HumanMessage, SystemMessage
# ================== 1. 初始化配置 ==================
os.environ["ZHIPUAI_API_KEY"] = "你的智谱API Key"
model_path = "./bge-small-zh-v1.5"
# 初始化模型
chat = ChatZhipuAI(model="glm-4", temperature=0.3)
embeddings = HuggingFaceEmbeddings(model_name=model_path)
# 加载向量数据库
db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
# ================== 2. 定义 RAG 提示词模板 ==================
prompt_template = """你是一个专业的公司政策问答助手。
请仅根据以下【参考文档】回答用户的问题,不要编造信息。
如果参考文档中没有相关内容,请明确告知用户。
【参考文档】
{context}
【用户问题】
{question}
"""
# ================== 3. RAG 问答函数 ==================
def rag_qa(question):
# 步骤1:检索相关文档
docs = db.similarity_search(question, k=2)
context = "\n\n".join([doc.page_content for doc in docs])
print("--- 检索到的参考文档 ---")
print(context)
print("\n--- 生成回答 ---")
# 步骤2:构建提示词
messages = [
SystemMessage(content="你是一个专业的政策问答助手。"),
HumanMessage(content=prompt_template.format(context=context, question=question))
]
# 步骤3:调用大模型生成回答
response = chat.invoke(messages)
return response.content
# ================== 4. 测试 RAG 系统 ==================
if __name__ == "__main__":
question = "工作满1年可以休几天年假?"
answer = rag_qa(question)
print("最终回答:", answer)
九、常见问题与最佳实践
1. 常见问题解答
(1)向量维度多少合适?
- 轻量模型:bge-small-zh(512维)、智谱 embedding-2(1024维)
- 通用模型:bge-base-zh(768维)、智谱 embedding-3(2048维)
- 建议:优先用轻量模型,效果不够再升级,维度越高计算越慢
(2)分块大小怎么选?
- 中文短文本(政策、FAQ):100-300 字符
- 中文长文本(文档、论文):300-500 字符
- 必须加 chunk_overlap,避免上下文丢失
(3)Chroma 数据怎么清空?
直接删除 chroma_db 文件夹即可,Chroma 是文件型数据库,没有额外服务。
(4)智谱 API 调用失败怎么办?
- 检查 API Key 是否正确
- 检查账户余额是否充足
- 检查网络连接(智谱 API 国内访问稳定)
2. 企业级最佳实践
- 嵌入模型选择:
- 中文场景优先用 BGE 系列(bge-small-zh-v1.5 性价比最高)
- 有预算可以用智谱 embedding-3(效果更好)
- 文本分块:
- 必须用中文专用的 separators
- 根据文档类型调整 chunk_size
- 始终保留 chunk_overlap
- 向量数据库:
- 原型开发用 Chroma(本地、免费)
- 生产环境用 Milvus/Pinecone(分布式、高性能)
- RAG 提示词:
- 明确要求模型“仅根据参考文档回答”
- 要求模型“不知道就说不知道”,减少幻觉
- 参考文档和用户问题用清晰的分隔符分开
十、总结
本文覆盖了 LangChain + 向量数据库 RAG 系统的完整流程:
- 环境准备与依赖安装
- 智谱 AI(GLM-4 + Embedding)集成
- BGE 中文嵌入模型使用
- 文档加载与中文文本分块
- Chroma 向量数据库持久化与语义搜索
- 完整 RAG 系统实战
- 常见问题与最佳实践
更多推荐




所有评论(0)