使用 EasySearch 构建 RAG(检索增强生成)系统
一、背景与目标
随着生成式 AI 技术的发展,RAG(Retrieval-Augmented Generation)成为企业接入私有知识的重要手段。相比传统的问答系统,RAG 将检索与生成结合,允许模型在生成答案前先访问企业自有数据,从而提升准确率和可控性。
本文将介绍如何使用国产向量搜索引擎 EasySearch 构建一个简洁的 RAG 应用,结合 SentenceTransformers
进行语义向量化,利用 EasySearch 检索最相关文段,再调用 OpenAI 模型(如 GPT-4)生成最终回答。
二、系统结构概览
用户问题 → 文本向量化 → EasySearch 检索 → 构建 Prompt → OpenAI 回答 → 返回结果
模块拆分如下:
embed.py
:文本向量生成模块indexer.py
:将知识库内容写入 EasySearchretriever.py
:基于向量相似度检索相关内容generator.py
:使用 GPT-4 生成答案app.py
:统一 API 入口
三、环境与依赖
pip install flask requests sentence-transformers
如需调用 OpenAI API,请提前设置环境变量:
export OPENAI_API_KEY=sk-xxxxxx
EasySearch 默认监听 http://localhost:9200
。
四、构建向量索引(indexer.py)
import requests
from embed import embed_textINDEX_NAME = "rag_demo"# 创建索引映射
mapping = {"mappings": {"properties": {"content": {"type": "text"},"embedding": {"type": "dense_vector", "dims": 384}}}
}
requests.put(f"http://localhost:9200/{INDEX_NAME}", json=mapping)# 写入文档
texts = ["张三是法律专家。", "李四在人工智能领域研究多年。"]
for i, text in enumerate(texts):vec = embed_text(text)doc = {"content": text, "embedding": vec.tolist()}requests.post(f"http://localhost:9200/{INDEX_NAME}/_doc/{i}", json=doc)
五、语义向量生成(embed.py)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")def embed_text(text):return model.encode(text)
六、向量相似检索(retriever.py)
import requests
from embed import embed_textINDEX_NAME = "rag_demo"def search_similar(query, top_k=3):vec = embed_text(query)payload = {"size": top_k,"query": {"script_score": {"query": {"match_all": {}},"script": {"source": "cosineSimilarity(params.query_vector, 'embedding') + 1.0","params": {"query_vector": vec.tolist()}}}}}res = requests.post(f"http://localhost:9200/{INDEX_NAME}/_search", json=payload)return [hit['_source']['content'] for hit in res.json()['hits']['hits']]
七、调用 OpenAI 生成回答(generator.py)
import os
import openaidef generate_answer(query, retrieved_docs):openai.api_key = os.getenv("OPENAI_API_KEY")context = "\n".join(f"资料{i+1}:{doc}" for i, doc in enumerate(retrieved_docs))prompt = f"根据以下资料回答问题:\n{context}\n\n问题:{query}"resp = openai.ChatCompletion.create(model="gpt-4",messages=[{"role": "user", "content": prompt}])return resp['choices'][0]['message']['content']
八、整合接口(app.py)
from flask import Flask, request, jsonify
from retriever import search_similar
from generator import generate_answerapp = Flask(__name__)@app.route("/rag", methods=["POST"])
def rag():query = request.json.get("query")docs = search_similar(query)answer = generate_answer(query, docs)return jsonify({"answer": answer, "references": docs})if __name__ == "__main__":app.run(debug=True)
九、测试与运行
curl -X POST http://localhost:5000/rag \-H "Content-Type: application/json" \-d '{"query": "谁是法律专家?"}'
返回示例:
{"answer": "张三是法律专家。","references": ["张三是法律专家。", "李四在人工智能领域研究多年。"]
}
结语
EasySearch 作为兼容 ES 的国产方案,可以无缝衔接主流向量化工具与大模型 API。通过本文提供的范例项目,你可以轻松搭建自己的企业知识问答系统或智能客服原型,快速验证检索增强生成的能力。