LangChain文本嵌入模型

本文详细讲解如何使用 LangChain 构建检索增强生成(RAG) 系统,覆盖智谱 AI 集成、中文嵌入模型、文本分块、Chroma 向量数据库、语义搜索等核心知识点,附完整可运行代码与最佳实践。


一、RAG 与 LangChain 概述

1. 什么是 RAG

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索大语言模型生成的技术:

  1. 检索阶段:将用户的问题向量化,在向量数据库中搜索最相关的文档片段
  2. 生成阶段:将检索到的文档片段作为上下文,连同用户问题一起发送给大模型,生成基于私有数据的准确回答
  • 核心优势:解决大模型“知识截止日期”和“幻觉”问题,让大模型使用企业私有数据回答问题

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. 企业级最佳实践

  1. 嵌入模型选择
    • 中文场景优先用 BGE 系列(bge-small-zh-v1.5 性价比最高)
    • 有预算可以用智谱 embedding-3(效果更好)
  2. 文本分块
    • 必须用中文专用的 separators
    • 根据文档类型调整 chunk_size
    • 始终保留 chunk_overlap
  3. 向量数据库
    • 原型开发用 Chroma(本地、免费)
    • 生产环境用 Milvus/Pinecone(分布式、高性能)
  4. RAG 提示词
    • 明确要求模型“仅根据参考文档回答”
    • 要求模型“不知道就说不知道”,减少幻觉
    • 参考文档和用户问题用清晰的分隔符分开

十、总结

本文覆盖了 LangChain + 向量数据库 RAG 系统的完整流程:

  1. 环境准备与依赖安装
  2. 智谱 AI(GLM-4 + Embedding)集成
  3. BGE 中文嵌入模型使用
  4. 文档加载与中文文本分块
  5. Chroma 向量数据库持久化与语义搜索
  6. 完整 RAG 系统实战
  7. 常见问题与最佳实践
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐