近年来,大规模语言模型(LLM)在生成式 AI 领域取得突破性进展,但仅依靠训练时数据的模型常会出现信息滞后或“幻觉”。RAG(Retrieval‑Augmented Generation,检索增强生成) 通过“先检索、再生成”的思路,将外部知识动态注入生成流程,大幅提升回答的准确性与可追溯性。
RAG 将整个流程拆分为两个阶段:离线索引 和 在线检索+生成。
工具 | 功能概览 | 适用场景 |
|---|---|---|
LangChain | 流程编排、记忆管理、代理 | 快速原型 & 复杂工作流 |
Haystack | 检索管道、REST API | 大规模生产部署 |
LlamaIndex | 多源数据接入、统一索引与查询 | 知识密集型场景 |
Milvus | 私有化部署、分布式向量存储 | 安全合规本地化部署 |
Pinecone | 托管向量服务、零运维 | SaaS 模式快速上线 |
from pymilvus import connections, Collection
from petals import DistributedEmbedding, DistributedLLM
# 1. 连接向量库
connections.connect(alias="default", host="localhost", port="19530")
collection = Collection("rag_docs")
# 2. 嵌入模型
embedder = DistributedEmbedding(model_name="ernie-embedding-3.0")
docs = ["RAG 技术依托检索提升生成准确性。", "文心一言提供高质量中文 Embedding。"]
vectors = embedder.embed(docs)
collection.insert([vectors, docs])
# 3. 检索与生成
query = "什么是 RAG?"
q_vec = embedder.embed([query])[]
search_res = collection.search([q_vec], limit=)
context = "n".join([hit.entity.value for hit in search_res[]])
prompt = f"已检索内容:n{context}n请回答:{query}"
llm = DistributedLLM(model_name="ernie-bot-turbo")
print(llm.generate(prompt))
import cn.qwen.ai.QwenClient;
import cn.qwen.ai.embedding.EmbeddingResponse;
import cn.qwen.ai.chat.ChatCompletionResponse;
import io.milvus.client.MilvusClient;
import io.milvus.client.SearchParam;
import java.util.Collections;
public class RagJavaExample {
public static void main(String[] args) {
// Qwen-Chat 客户端
QwenClient qwen = new QwenClient("YOUR_QWEN_API_KEY");
// 向量化
EmbeddingResponse emb = qwen.embedding("text-embedding-qwen-embedding",
"RAG 是检索增强生成技术");
float[] vector = emb.getData().get().getEmbedding();
// Milvus 检索
MilvusClient milvus = MilvusClient.builder()
.withHost("127.0.0.1")
.withPort("19530")
.build();
SearchParam param = SearchParam.newBuilder()
.withCollectionName("rag_docs")
.withVectors(Collections.singletonList(vector))
.withTopK()
.build();
var results = milvus.search(param);
// 拼接上下文 & 生成
StringBuilder ctx = new StringBuilder();
results.getResults().forEach(hit ->
ctx.append(hit.getEntity().getValue()).append("n"));
String prompt = "参考内容:n" + ctx + "n问题:什么是 RAG?";
ChatCompletionResponse chat = qwen.chat("qwen-7b-chat", prompt);
System.out.println(chat.getChoices().get().getMessage().getContent());
}
}