趋近智
检索器组件已准备好获取相关信息,下一步很自然地就是整合检索增强生成(RAG)的“生成”部分。这需要连接一个大型语言模型(LLM),它会将用户的查询和检索到的背景信息综合成一个连贯的最终答案。
LLM充当推理 (inference)引擎。它不仅仅重复检索到的文本;它将这些文本用作辅助知识,以此构成直接回答原始问题、并以所提供的背景信息为基础的回复。
有两种主要方法可以将LLM集成到你的RAG管道中:
transformers库,或专门的服务框架,如Ollama或vLLM。让我们看看如何实现这些方法。
使用API通常是最快的上手方法。提供商管理模型的托管、扩展和维护。你的应用程序将增强后的提示(查询 + 背景信息)发送到API端点,并接收生成的文本。
步骤:
gpt-3.5-turbo、claude-3-opus、gemini-pro)。pip安装必要的Python客户端库(例如,pip install openai、pip install anthropic)。create、complete或generate)。示例(OpenAI集成):
# 注意:需要安装'openai'库并设置OPENAI_API_KEY环境变量。
import os
from openai import OpenAI
# 1. 实例化客户端(使用环境变量进行认证)
try:
client = OpenAI()
# api_key也可以显式传递:OpenAI(api_key="你的API密钥")
except Exception as e:
print(f"Error initializing OpenAI client: {e}")
# 适当处理错误(例如,退出、记录日志、抛出异常)
exit()
# 2. 准备增强型提示(示例结构)
user_query = "What were the main findings of the climate report?"
retrieved_context = """
Document Snippet 1: The report highlights a significant increase in global average temperatures...
Document Snippet 2: Key findings include accelerated sea-level rise and more frequent extreme weather events...
"""
augmented_prompt = f"""
Based on the following context, answer the user's query.
Context:
{retrieved_context}
Query: {user_query}
Answer:
"""
# 3. 进行API调用
try:
response = client.chat.completions.create(
model="gpt-3.5-turbo", # 或另一个合适的模型
messages=[
{"role": "system", "content": "你是一个根据所提供背景信息进行回复的有用助手。"},
{"role": "user", "content": augmented_prompt}
],
temperature=0.7, # 控制随机性(创造性与确定性)
max_tokens=150 # 限制生成响应的长度
)
# 4. 处理响应
if response.choices:
generated_text = response.choices[0].message.content.strip()
print("LLM响应:")
print(generated_text)
else:
print("未生成响应。")
except Exception as e:
print(f"Error during OpenAI API call: {e}")
# 处理API错误(例如,速率限制、认证问题)
API的考量:
在本地运行模型让你对环境和数据隐私有更多掌控,但需要管理计算资源和模型设置。Hugging Face的transformers等库使得加载和运行许多开源模型相对简单。
步骤:
transformers和一个后端,如PyTorch (torch) 或TensorFlow (tensorflow)。根据模型,你可能需要额外的依赖。(pip install transformers torch)generate函数。示例(Hugging Face transformers集成):
# 注意:需要安装'transformers'和'torch'(或'tensorflow')。
# 根据模型,可能需要大量内存/显存。
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
import torch # 或 import tensorflow as tf
# 1. 选择一个模型(示例:一个更小、更易于管理的模型)
model_name = "gpt2" # 如果资源允许,请替换为更大/更好的模型,例如:"mistralai/Mistral-7B-Instruct-v0.1"
# 2. 加载模型和分词器(首次运行时下载权重)
try:
# 使用pipeline以获得更简单的接口(处理分词/解码)
# 指定设备:'cuda'表示GPU(如果可用且已配置),否则为'cpu'
device = 0 if torch.cuda.is_available() else -1 # pipeline约定:device=0表示第一个GPU,-1表示CPU
generator_pipeline = pipeline(
"text-generation",
model=model_name,
device=device
)
print(f"模型 {model_name} 已加载到设备:{'GPU' if device == 0 else 'CPU'}")
# 或者,手动加载以获得更多控制:
# tokenizer = AutoTokenizer.from_pretrained(model_name)
# model = AutoModelForCausalLM.from_pretrained(model_name)
# model.to('cuda' if torch.cuda.is_available() else 'cpu') # 将模型移动到设备
except Exception as e:
print(f"Error loading model {model_name}: {e}")
# 处理错误(例如,找不到模型,内存不足)
exit()
# 3. 准备增强型提示
user_query = "What is the capital of France?"
retrieved_context = "France is a country in Western Europe. Paris is its capital and largest city."
# 基本提示模板
augmented_prompt = f"""
Context: {retrieved_context}
Question: {user_query}
Answer: """
# 4. 使用pipeline生成文本
try:
# Pipeline处理分词、生成和解码
responses = generator_pipeline(
augmented_prompt,
max_new_tokens=50, # 限制在提示*之后*生成的令牌数量
num_return_sequences=1,
eos_token_id=generator_pipeline.tokenizer.eos_token_id # 在序列结束令牌处停止生成
)
generated_text = responses[0]['generated_text']
# 通常,pipeline的输出包含提示。我们可能只想要答案部分。
# 简单方法:找到提示的末尾并获取其后的文本。
answer_part = generated_text[len(augmented_prompt):].strip()
print("\nLLM响应(答案部分):")
print(answer_part)
# --- 手动生成(如果未使用pipeline) ---
# inputs = tokenizer(augmented_prompt, return_tensors="pt").to(model.device)
# outputs = model.generate(**inputs, max_new_tokens=50)
# decoded_output = tokenizer.decode(outputs[0], skip_special_tokens=True)
# print("\nLLM响应(手动):")
# print(decoded_output)
except Exception as e:
print(f"Error during text generation: {e}")
# 处理生成错误
本地模型的考量:
像LangChain和LlamaIndex这样的框架提供了更高级别的抽象,简化了生成器集成。你通常会在框架的对象中配置你想使用的LLM(无论是基于API的还是本地的)。
示例(LangChain):
# 注意:这是一个示例,需要安装LangChain和提供商库。
# --- API型LLM的配置 ---
# from langchain_openai import ChatOpenAI
# llm = ChatOpen OpenAI(model_name="gpt-3.5-turbo", temperature=0.7, openai_api_key="你的API密钥")
# --- 通过Hugging Face配置本地LLM ---
# from langchain_community.llms import HuggingFacePipeline
# llm = HuggingFacePipeline.from_model_id(
# model_id="gpt2",
# task="text-generation",
# pipeline_kwargs={"max_new_tokens": 100},
# device=0 # 如果可用,使用GPU 0
# )
# --- RAG链的后续部分 ---
# 假设'retriever'已配置且'prompt_template'已定义
# from langchain_core.runnables import RunnablePassthrough
# from langchain_core.output_parsers import StrOutputParser
# rag_chain = (
# {"context": retriever, "question": RunnablePassthrough()} # 根据输入问题获取背景信息
# | prompt_template # 格式化提示
# | llm # 将增强型提示传递给已配置的LLM
# | StrOutputParser() # 解析LLM输出字符串
# )
# result = rag_chain.invoke("What is the capital of France?")
# print(result)
这些框架处理API调用或本地模型交互的样板代码,让你专注于管道逻辑。在下一节中组合组件时,我们会看到更多这种结构。
集成生成器是一个核心步骤。无论你选择API的便利性还是本地模型的控制权,目标都是一样的:为LLM提供用户的提问以及从你的知识库中获取的相关背景信息,使其能够生成有根据且准确的回复。既然我们有了实现检索器和生成器的方法,我们就可以将它们连接起来了。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
transformers 库加载和运行预训练模型(包括本地LLM)的官方指南和API参考。© 2026 ApX Machine Learning用心打造