微信扫码
添加专属顾问
我要投稿
轻松打造企业级AI问答机器人,RAG技术应用全解析。 核心内容: 1. RAG技术基本概念与应用场景 2. 构建企业知识库与元数据整合 3. 向量数据库与定时更新知识库的实现方法
RAG 已经几乎可以说是 AI 入门应用,实现方式很多,低代码平台,手搓代码都可以实现,涉及到的核心技术包括,知识库、提示词工程、向量数据库、LLM、全文检索、 query 重写等。
本实例使用的时 FAISS 向量数据库,使用 crontab,定时拉取更新知识(知识内容托管在 github),之后,存储到向量数据库。核心代码逻辑在,index_documents.py 文件内:
# Read the markdown file
with open(file_path, encoding="utf-8") as file:
content = file.read()
# Convert markdown to HTML and then extract text to remove markdown formatting
html = markdown2.markdown(content)
soup = BeautifulSoup(html, "html.parser")
text = soup.get_text()
# Create a Document object with metadata
relative_path = os.path.relpath(file_path, directory_path)
doc = Document(
page_content=text,
metadata={
"source": file_path,
"filename": os.path.basename(file_path),
"path": relative_path,
},
)
# index document
# Add to vector store
if not self.vector_store:
self.vector_store = FAISS.from_documents(
documents=documents, embedding=self.embeddings
)
else:
self.vector_store.add_documents(documents)
在实际的问答场景中,用户问的问题,可能非常粗糙,比如,我登录不了了,如何注册,2FA,如果直接拿这些 query 词去搜索知识库,可能搜不到知识,所以需要对用户的 query 做一次重写,可以是用规则做映射,也可以让 LLM 生产多 query 词,本文使用 langchian 的 MultiQueryRetriever,在获取相关文档时,会自动做 query 重写。
重写后的 query,能检索到更多的数据:
# Initialize MultiQueryRetrieverretriever = MultiQueryRetriever.from_llm( retriever=vectorstore.as_retriever(), llm=llm)
在 RAG 系统中,不同的 retriever 有各自的优缺点,比如:
向量搜索(Vector Search):适用于语义搜索,但有时可能无法匹配精确的关键字。
关键词搜索(BM25 / TF-IDF):适用于关键词匹配,但难以处理语义相关的查询。
基于元数据的搜索:在结构化数据(如 SQL 或基于标签的数据库)中效果较好。
所以,在实际开发的过程中,组合了向量搜索 + 关键词搜索的方式,来提升检索能力,代码实现参考:
# Create keyword-based BM25 retriever
self.bm25_retriever = BM25Retriever.from_documents(self.documents)
self.bm25_retriever.k = 3 # 获取 top 3 的文章
# Create semantic retriever
self.semantic_retriever = self.vector_store.as_retriever(
search_kwargs={"k": 5, "search_type": "similarity"}
) # 获取 top 5 的文章
# Create ensemble retriever (combines both approaches)
self.hybrid_retriever = EnsembleRetriever(
retrievers=[self.bm25_retriever, self.semantic_retriever],
weights=[0.3, 0.7], # Weight semantic search higher
) # 分配不同 retriever 的权重,关键词搜索占 30%,语意搜索占 70%
代码中的权重,主要用于给检索到的文章评分,通常会按加权和计算, 公式中的 wbm25, wsemantic 就是代码中设定的权重:
Prompt 优化
最后,对于 LLM,本质上是概率模型,无论给什么问题,它都会给出最有可能的回复(概率TOPn),出现所谓的幻觉。 所以,query LLM 大语言模型时,需要做提示词优化,给 LLM 加限制,一般情况下,提示词中,会特别写一句,如果没有检索到相关的内容,请直接回答不知道,避免 LLM 胡编乱造,产生影响。
到这里,基本上把核心的技术都涉及到了,如果要提升效果,涉及到的各个技术都有很大的优化空间,也需要做更细致的测试评估。
END
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-10-27
2024-09-04
2024-07-18
2024-05-05
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07