在企业环境中,准确高效地从大量非结构化数据(如 PDF 文件)中检索信息至关重要。基于检索增强生成(RAG)的系统在这方面发挥着重要作用,但提升其准确性是一个复杂且具有挑战性的任务。本文将详细介绍提高企业 RAG 准确性的逐步指南,涵盖从数据提取到检索的各个关键步骤。
1. 从 PDF 中提取知识
1.1 上传与记录创建
用户上传 PDF 文件(未来还将支持音频和视频等其他文件类型)。系统将文件保存到磁盘(近期计划迁移到 AWS S3 存储桶以更好地满足企业需求),并在数据库中插入记录,创建处理状态条目。使用支持多种数据类型、混合搜索和单次检索的 SingleStore 数据库。同时,将处理 PDF 的任务放入后台队列,通过 Redis 和 Celery 进行异步处理和跟踪。
# Pseudo-code
save_file_to_disk(pdf)
db_insert(document_record, status=”started”)
queue_processing_task(pdf)
1.2 解析与分块 PDF
打开文件并验证大小限制和密码保护,若文件不可读则尽早终止处理。将文件内容提取为文本或 Markdown 格式,可使用 Llamaparse(来自 Llamaindex)替代之前的 PyMudf,其免费版每天支持 1000 次文档解析,并能更好地处理表格和图像提取。分析文档结构(如目录、标题等),利用 Gemini Flash 2.0 基于语义将文本分割成有意义的块,若语义分块失败,则采用简单的分割方式,并在块之间添加重叠部分以保持上下文连贯性。
# Pseudo-code
validate_pdf(pdf)
text = extract_text(pdf)
chunks = semantic_chunking(text) or fallback_chunking(text)
add_overlaps(chunks)
1.3 生成嵌入
使用嵌入模型将每个文本块转换为高维向量,例如使用 OpenAI 的 large ada 模型,维度设置为 1536。将文本块及其嵌入向量存储在数据库中,在 SingleStore 中,将文本块和文本分别存储在同一表的不同列,便于维护和检索。
# Pseudo-code
for chunk in chunks:
vector = generate_embedding(chunk.text)
db_insert(embedding_record, vector)
1.4 使用大语言模型提取实体和关系
这一步对整体准确性影响很大。将语义组织好的文本块发送给 OpenAI,通过特定的提示要求其返回每个块中的实体和关系,包括关键实体(名称、类型、描述、别名)。映射实体之间的关系,避免重复添加数据,将提取的 “知识” 存储在结构化表中。
# Pseudo-code
for chunk in chunks:
entities, relationships = extract_knowledge(chunk.text)
db_insert(entities)
db_insert(relationships)
1.5 最终处理状态
若所有步骤处理正确,将状态更新为 “已完成”,以便前端随时轮询并显示正确状态;若处理失败,则标记为 “失败”,并清理临时数据。
# Pseudo-code
if success:
update_status(“completed”)
else:
update_status(“failed”)
cleanup_partial_data()
2. 知识检索(RAG 管道)
2.1 用户查询
用户向系统提交查询请求。
# Pseudo-code
query = get_user_query()
2.2 预处理和扩展查询
系统对查询进行规范化处理,去除标点符号、标准化空白字符,并使用大语言模型(如 Groq,处理速度更快)扩展同义词。
# Pseudo-code
query = preprocess_query(query)
expanded_query = expand_query(query)
2.3 嵌入查询和搜索向量
使用与提取时相同的 ada 模型将查询嵌入为高维向量,在文档嵌入数据库中使用语义搜索(如在 SingleStore 中使用点积运算)查找最匹配的文本块。
# Pseudo-code
query_vector = generate_embedding(expanded_query)
top_chunks = vector_search(query_vector)
2.4 全文搜索
并行进行全文搜索以补充向量搜索,在 SingleStore 中可使用 MATCH 语句实现。
# Pseudo-code
text_results = full_text_search(query)
2.5 合并和排序结果
将向量搜索和全文搜索的结果合并,并根据相关性重新排序,可调整返回的前 k 个结果数量(如 k = 10 或更高效果更好),过滤掉低置信度的结果。
# Pseudo-code
merged_results = merge_and_rank(top_chunks, text_results)
filtered_results = filter_low_confidence(merged_results)
2.6 检索实体和关系
若检索到的文本块存在实体和关系,则将其包含在响应中。
# Pseudo-code
for result in filtered_results:
entities, relationships = fetch_knowledge(result)
enrich_result(result, entities, relationships)
2.7 生成最终答案
利用提示增强上下文,将相关数据发送给大语言模型(如 gpt3o - mini)生成最终响应。
# Pseudo-code
final_answer = generate_llm_response(filtered_results)
2.8 返回答案给用户
系统将响应作为结构化 JSON 有效负载返回,并附带原始数据库搜索结果,以便在需要时进行调试和调整。
# Pseudo-code
return_response(final_answer)
3. 性能优化与实现
在实践中,发现检索过程的响应时间过长(约 8 秒),主要瓶颈在于大语言模型的调用(每次约 1.5 - 2 秒),而 SingleStore 数据库查询时间通常在 600 毫秒以内。切换到 Groq 进行部分大语言模型调用后,响应时间缩短至 3.5 秒。为进一步优化,可尝试并行调用而非串行调用。
为简化管理和提高数据库响应时间,实现了单次检索查询的代码。通过 OpenAI 的 Embeddings API 生成查询嵌入向量,在 SingleStore 中执行混合搜索 SQL 查询,同时获取文本块、向量得分、文本得分、综合得分以及相关的实体和关系信息。
import os
import json
import mysql.connector
from openai import OpenAI
# Define database connection parameters (assumed from env vars)
DB_CONFIG = {
"host": os.getenv("SINGLESTORE_HOST", "localhost"),
"port": int(os.getenv("SINGLESTORE_PORT", "3306")),
"user": os.getenv("SINGLESTORE_USER", "root"),
"password": os.getenv("SINGLESTORE_PASSWORD", ""),
"database": os.getenv("SINGLESTORE_DATABASE", "knowledge_graph")
}
def get_query_embedding(query: str) -> list:
"""
Generate a 1536-dimensional embedding for the query using OpenAI embeddings API.
"""
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
response = client.embeddings.create(
model="text-embedding-ada-002",
input=query
)
return response.data[0].embedding # Extract embedding vector
def retrieve_rag_results(query: str) -> list:
"""
Execute the hybrid search SQL query in SingleStore and return the top-ranked results.
"""
conn = mysql.connector.connect(**DB_CONFIG)
cursor = conn.cursor(dictionary=True)
# Generate query embedding
query_embedding = get_query_embedding(query)
embedding_str = json.dumps(query_embedding) # Convert to JSON for SQL compatibility
# Set the query embedding session variable
cursor.execute("SET @qvec = %s", (embedding_str,))
# Hybrid Search SQL Query (same as provided earlier)
sql_query = """
SELECT
d.doc_id,
d.content,
(d.embedding <*> @qvec) AS vector_score,
MATCH(TABLE Document_Embeddings) AGAINST(%s) AS text_score,
(0.7 * (d.embedding <*> @qvec) + 0.3 * MATCH(TABLE Document_Embeddings) AGAINST(%s)) AS combined_score,
JSON_AGG(DISTINCT JSON_OBJECT(
'entity_id', e.entity_id,
'name', e.name,
'description', e.description,
'category', e.category
)) AS entities,
JSON_AGG(DISTINCT JSON_OBJECT(
'relationship_id', r.relationship_id,
'source_entity_id', r.source_entity_id,
'target_entity_id', r.target_entity_id,
'relation_type', r.relation_type
)) AS relationships
FROM Document_Embeddings d
LEFT JOIN Relationships r ON r.doc_id = d.doc_id
LEFT JOIN Entities e ON e.entity_id IN (r.source_entity_id, r.target_entity_id)
WHERE MATCH(TABLE Document_Embeddings) AGAINST(%s)
GROUP BY d.doc_id, d.content, d.embedding
ORDER BY combined_score DESC
LIMIT 10;
"""
# Execute the query
cursor.execute(sql_query, (query, query, query))
results = cursor.fetchall()
cursor.close()
conn.close()
return results # Return list of retrieved documents with entities and relationships
4. 经验教训与未来改进方向
提高 RAG 准确性并保持低延迟是一项艰巨的任务,尤其是在处理结构化数据时。未来可从以下方面进行改进:
4.1 准确性提升 - 提取阶段
- 外部化和试验实体提取提示
尝试不同的提示策略,以更准确地从文本块中提取实体。
- 在处理前总结文本块
可能对提高准确性有显著影响。
- 添加更好的失败重试机制
确保在各个处理步骤出现故障时能够有效恢复。
4.2 准确性提升 - 检索阶段
- 使用更好的查询扩展技术
如自定义词典、特定行业术语等,提高查询的相关性。
- 微调向量与文本搜索的权重
目前已在配置文件中进行外部化设置,可进一步优化。
- 添加第二个大语言模型进行重新排名
但需要权衡延迟问题。
- 调整检索窗口大小
优化召回率与相关性之间的平衡。
- 生成文本块级别的摘要
避免将原始文本直接发送给大语言模型,减少处理负担。
通过以上逐步指南和持续改进的方向,企业可以不断优化 RAG 系统的准确性,更好地满足在大量非结构化数据中高效检索信息的需求,提升业务效率和决策质量。
大模型&AI产品经理如何学习
求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。
1.学习路线图
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方图片前往获取
3.技术文档和电子书
这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
4.LLM面试题和面经合集
这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集***
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓