RAG 问答系统
RAG(Retrieval-Augmented Generation)通过将外部知识库与 LLM 结合,让模型能够基于最新、最相关的信息进行回答。
为什么搜索比微调更好
- 模型权重:通过微调学习(成本高、更新慢)
- 模型输入:通过输入消息插入知识(灵活、实时)
两阶段检索方法
- 搜索阶段:使用 embedding 相似度搜索相关文档
- 问答阶段:将搜索到的文档与问题一起发送给 LLM
实现代码
from openai import OpenAI import numpy as npclient = OpenAI()
def get_embedding(text): response = client.embeddings.create( model=“text-embedding-3-small”, input=text ) return np.array(response.data[0].embedding)
def cosine_similarity(v1, v2): return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
def search_documents(query, documents, top_k=3): query_emb = get_embedding(query) doc_embs = [get_embedding(doc) for doc in documents] sims = [cosine_similarity(query_emb, emb) for emb in doc_embs] top_indices = np.argsort(sims)[-top_k:][::-1] return [documents[i] for i in top_indices]
def answer_question(query, documents): relevant_docs = search_documents(query, documents) context = “\n”.join(relevant_docs) response = client.chat.completions.create( model=“gpt-4o”, messages=[ {“role”: “system”, “content”: f”基于以下文档回答问题:\n{context}”}, {“role”: “user”, “content”: query} ] ) return response.choices[0].message.content
优化策略
- 使用混合搜索(向量 + 关键词)
- 实现 HyDE(假设性文档嵌入)
- 添加元数据过滤
- 使用交叉编码器重排序