当前位置: 首页 > 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。通过本文提供的范例项目,你可以轻松搭建自己的企业知识问答系统或智能客服原型,快速验证检索增强生成的能力。

http://www.dtcms.com/a/259413.html

相关文章:

  • 根据不同的环境打包
  • 西班牙证券交易所智能交易系统开发报告
  • 化于无形的 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
  • selenium UI自动化元素定位中classname和CSS区别
  • 如何打造Apache Top-Level开源时序数据库IoTDB
  • 中国地图分幅编号计算工具
  • Nuclei安装+使用+基础教程(附安装包)-windows下
  • Altium Designer实现类似Allegro Z-Copy功能
  • AI正在使软件发生根本变化 | AI大咖说
  • 车牌识别与标注:基于百度OCR与OpenCV的实现(一)
  • HarmonyOS 5分布式数据库有哪些性能指标?
  • POJ2718-Smallest Difference(穷竭搜索:全排列)
  • vue3递归组件的使用