当前位置: 首页 > news >正文

使用 EasySearch 构建 RAG(检索增强生成)系统

一、背景与目标

随着生成式 AI 技术的发展,RAG(Retrieval-Augmented Generation)成为企业接入私有知识的重要手段。相比传统的问答系统,RAG 将检索与生成结合,允许模型在生成答案前先访问企业自有数据,从而提升准确率和可控性。

本文将介绍如何使用国产向量搜索引擎 EasySearch 构建一个简洁的 RAG 应用,结合 SentenceTransformers 进行语义向量化,利用 EasySearch 检索最相关文段,再调用 OpenAI 模型(如 GPT-4)生成最终回答。


二、系统结构概览

用户问题 → 文本向量化 → EasySearch 检索 → 构建 Prompt → OpenAI 回答 → 返回结果

模块拆分如下:

  • embed.py:文本向量生成模块
  • indexer.py:将知识库内容写入 EasySearch
  • retriever.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。通过本文提供的范例项目,你可以轻松搭建自己的企业知识问答系统或智能客服原型,快速验证检索增强生成的能力。

相关文章:

  • 温江网站制作最新新闻事件今天疫情
  • 可信赖的昆明网站建设关键词排名点击软件工具
  • 美乐乐网站模板怎么自己创建网站
  • 企网夫唯seo培训
  • wordpress设置网站背景图片百度一下就知道手机版
  • 免费网站怎么盈利模式抖音seo搜索优化
  • 根据不同的环境打包
  • 西班牙证券交易所智能交易系统开发报告
  • 化于无形的 lambda 语法
  • 【网站内容安全检测】之2:从网站所有URL页面中提取所有外部及内部域名信息
  • Django
  • 写入P99延迟突破1秒含义
  • MySQL原理--Hash索引和B+树索引的区别
  • 碳化硅MOS四开关 Buck-Boost DC-DC 变换器
  • 在cmake中指定clang编译cuda文件
  • TensorFlow深度学习实战:构建神经网络全指南
  • 企业内部安全组网技术解析:安全通道选型、零信任架构与数据合规加密防护
  • Linux RDMA网络配置手册
  • 11 MySQL 如何优化数据查询方案?
  • Cookie 在 HTTP 中的作用HTTP 中的状态码
  • HuggingFace下载的模型缓存到了C盘,如何安全迁移到其他盘
  • 通达信 蛟龙腾飞突破信号系统
  • 【深度学习新浪潮】空间计算的医疗应用技术分析(简要版)
  • 数学:多项式相乘法则详解
  • 刷题 | 牛客 - js中等题-下 (更ing)45/54知识点解答
  • Android14音频子系统-Linux音频子系统ALSA