GTE模型与LangChain集成指南:构建高效RAG系统

发布时间:2026/7/31 14:50:33

GTE模型与LangChain集成指南:构建高效RAG系统 GTE模型与LangChain集成指南构建高效RAG系统1. 引言你是否曾经遇到过这样的场景想让大语言模型回答专业问题但它却一本正经地胡说八道或者需要处理大量文档但模型总是记不住关键信息这就是RAG系统要解决的核心问题。RAG检索增强生成就像给大语言模型配了一个超级外脑——它先从一个知识库中检索相关信息然后再让模型基于这些信息生成回答。这样既能保证答案的准确性又能让模型处理它原本不知道的知识。今天我们要聊的GTE模型就是阿里巴巴达摩院推出的文本嵌入模型专门负责把文本转换成计算机能理解的向量。而LangChain则是一个强大的框架能帮我们把各种AI组件像搭积木一样组合起来。把这两者结合起来你就能构建一个既聪明又靠谱的问答系统。2. 环境准备与安装在开始之前我们需要准备好运行环境。别担心整个过程很简单跟着步骤来就行。首先安装必要的Python包pip install langchain transformers torch sentence-transformers pip install chromadb # 向量数据库 pip install sentencepiece # 分词器依赖如果你想要更好的性能可以安装带CUDA支持的PyTorchpip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118现在让我们检查一下环境是否正常import torch print(fPyTorch版本: {torch.__version__}) print(fCUDA是否可用: {torch.cuda.is_available()}) print(fGPU数量: {torch.cuda.device_count()})如果看到CUDA可用说明你的GPU已经准备就绪后续的向量计算会快很多。3. GTE模型快速入门GTE模型的作用就像是一个翻译官把人类能看懂的文本翻译成计算机能理解的数字向量。这些向量有一个很神奇的特性意思相近的文本它们的向量在空间中的位置也很接近。让我们先来体验一下GTE模型的基本用法from transformers import AutoModel, AutoTokenizer import torch.nn.functional as F # 加载GTE多语言基础模型 model_name Alibaba-NLP/gte-multilingual-base tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModel.from_pretrained(model_name, trust_remote_codeTrue) # 准备一些示例文本 texts [ 机器学习是什么, 人工智能的基本概念, 今天的天气真不错, 如何做西红柿炒鸡蛋 ] # 将文本转换为向量 def get_embeddings(texts): inputs tokenizer(texts, paddingTrue, truncationTrue, max_length512, return_tensorspt) with torch.no_grad(): outputs model(**inputs) # 取[CLS]位置的向量作为整个文本的表示 embeddings outputs.last_hidden_state[:, 0] # 归一化处理 embeddings F.normalize(embeddings, p2, dim1) return embeddings embeddings get_embeddings(texts) print(f生成的向量维度: {embeddings.shape})运行这段代码你会看到每个文本都被转换成了一个768维的向量。这些向量看起来就是一堆数字但它们实际上包含了文本的语义信息。4. LangChain集成实战现在来到最有趣的部分——把GTE模型和LangChain结合起来。LangChain提供了一个统一的接口来处理各种嵌入模型让我们的代码更加简洁。首先我们创建一个自定义的GTE嵌入类from langchain.embeddings.base import Embeddings from typing import List import numpy as np class GTEEmbeddings(Embeddings): def __init__(self, model_nameAlibaba-NLP/gte-multilingual-base): self.tokenizer AutoTokenizer.from_pretrained(model_name) self.model AutoModel.from_pretrained(model_name, trust_remote_codeTrue) self.model.eval() # 设置为评估模式 def embed_documents(self, texts: List[str]) - List[List[float]]: inputs self.tokenizer(texts, paddingTrue, truncationTrue, max_length512, return_tensorspt) with torch.no_grad(): outputs self.model(**inputs) embeddings outputs.last_hidden_state[:, 0] embeddings F.normalize(embeddings, p2, dim1) return embeddings.tolist() def embed_query(self, text: str) - List[float]: return self.embed_documents([text])[0] # 使用自定义嵌入类 gte_embeddings GTEEmbeddings()接下来我们设置向量数据库。这里使用ChromaDB它是一个轻量级且易用的向量数据库from langchain.vectorstores import Chroma from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 加载示例文档 loader TextLoader(sample_document.txt) # 你的文档文件 documents loader.load() # 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50 ) texts text_splitter.split_documents(documents) # 创建向量数据库 vectorstore Chroma.from_documents( documentstexts, embeddinggte_embeddings, persist_directory./chroma_db )5. 构建完整RAG系统现在让我们把各个组件组装起来构建一个完整的问答系统from langchain.chains import RetrievalQA from langchain.llms import OpenAI from langchain.prompts import PromptTemplate # 设置LLM这里使用OpenAI你也可以用其他模型 llm OpenAI(temperature0) # 创建检索器 retriever vectorstore.as_retriever( search_typesimilarity, search_kwargs{k: 3} ) # 自定义提示模板 prompt_template 使用以下上下文来回答最后的问题。如果你不知道答案就说你不知道不要编造答案。 上下文: {context} 问题: {question} 有帮助的回答: PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 创建QA链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue ) # 测试问答系统 question 机器学习的主要应用领域有哪些 result qa_chain({query: question}) print(f问题: {question}) print(f回答: {result[result]}) print(来源文档:) for doc in result[source_documents]: print(f- {doc.metadata[source]}: {doc.page_content[:100]}...)这个系统的工作流程是先使用GTE模型把问题转换成向量然后在向量数据库中查找最相关的文档片段最后让大语言模型基于这些片段生成回答。6. 效果优化技巧为了让RAG系统表现更好这里有一些实用技巧调整分块大小# 不同的内容类型适合不同的分块大小 chunk_sizes { 技术文档: 500, 新闻文章: 300, 对话记录: 200, 法律条文: 1000 }优化检索策略# 使用多种检索方式组合 from langchain.retrievers import BM25Retriever, EnsembleRetriever # 创建基于关键词的检索器 bm25_retriever BM25Retriever.from_documents(texts) bm25_retriever.k 2 # 组合向量检索和关键词检索 ensemble_retriever EnsembleRetriever( retrievers[retriever, bm25_retriever], weights[0.7, 0.3] )添加重排序from langchain.retrievers.document_compressors import LLMChainReranker # 使用LLM对检索结果进行重排序 reranker LLMChainReranker(llmllm) compressed_retriever ContextualCompressionRetriever( base_compressorreranker, base_retrieverensemble_retriever )7. 常见问题解决在实际使用中你可能会遇到这些问题内存不足# 使用量化减少内存占用 model AutoModel.from_pretrained(model_name, trust_remote_codeTrue, torch_dtypetorch.float16) # 半精度 # 或者使用更小的模型 small_model Alibaba-NLP/gte-multilingual-small处理长文本# 对于长文本可以分段处理 def embed_long_text(text, max_length512): chunks [text[i:imax_length] for i in range(0, len(text), max_length)] chunk_embeddings get_embeddings(chunks) # 取平均作为整体表示 return torch.mean(chunk_embeddings, dim0)性能优化# 批量处理提高效率 def batch_embed(texts, batch_size32): all_embeddings [] for i in range(0, len(texts), batch_size): batch texts[i:ibatch_size] batch_embeddings get_embeddings(batch) all_embeddings.append(batch_embeddings) return torch.cat(all_embeddings, dim0)8. 总结通过这篇教程我们完整走过了构建RAG系统的全过程。从环境准备到模型集成从基础用法到高级优化你现在应该能够自己搭建一个智能问答系统了。GTE模型的优势在于它的多语言支持和不错的性能表现而LangChain则让整个构建过程变得异常简单。这种组合特别适合需要处理中文文档的场景相比直接使用OpenAI的接口不仅成本更低而且数据隐私也更有保障。实际用下来这套方案的效果还是挺令人满意的。检索准确率不错响应速度也够快最重要的是整个架构很灵活你可以根据需要替换任何一个组件。比如想要更好的嵌入模型可以换BGE想要更强的语言模型可以换GPT-4想要不同的向量数据库也可以换Weaviate或者Pinecone。如果你刚开始接触RAG建议先从简单的文档问答做起熟悉了整个流程后再尝试更复杂的应用。过程中遇到问题很正常多调试多优化慢慢就能掌握其中的窍门了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻