博客
关于我
05-faiss_chinese_path_query
阅读量:799 次
发布时间:2023-03-23

本文共 2343 字,大约阅读时间需要 7 分钟。

使用 FAISS 和 LangChain 构建 RAG 管道

引言

在自然语言处理领域,检索增强生成(Retrieval-Augmented Generation, RAG)是一项强大的技术,能够通过结合检索和生成模型,显著提升问题回答的质量。本文将介绍一个基于 FAISS 向量库和 LangChain 框架构建的 RAG 管道的实现方法。

模型引入

首先,我们需要引入必要的外部库:

from langchain_community.vectorstores import FAISSfrom langchain.embeddings.base import Embeddingsfrom langchain.chains import RetrievalQAfrom langchain.llms import Ollamaimport osimport requests

FAISS 向量库加载

接下来,我们定义一个加载 FAISS 向量库的函数,该函数将使用 nomic-embed-text 嵌入模型来生成向量表示:

class NomicEmbedText(Embeddings):    def __init__(self, base_url="http://127.0.0.1:11434"):        self.base_url = base_url            def embed_query(self, text):        response = requests.post(            f"{self.base_url}/api/embeddings",            json={"model": "nomic-embed-text:v1.5", "prompt": text}        )        if response.status_code != 200:            raise ValueError(f"嵌入生成失败: {response.text}")        return response.json()["embedding"]        def embed_documents(self, texts):        embeddings = []        for text in texts:            embedding = self.embed_query(text)            embeddings.append(embedding)        return embeddings
def load_faiss_vector_store(load_path="faiss_index"):    if not os.path.exists(load_path):        raise FileNotFoundError(f"FAISS 向量库不存在: {load_path}")        vector_store = FAISS.load_local(        folder_path=load_path,        embeddings=NomicEmbedText(),        allow_dangerous_deserialization=True    )    return vector_store

RAG 管道设置

然后,我们创建一个 RAG 管道,使用 Ollama 模型作为生成模型,并结合 FAISS 向量库作为检索器:

def setup_rag_pipeline(vector_store):    llm = Ollama(        model="deepseek-r1:1.5b",        base_url="http://127.0.0.1:11434"    )        qa_pipeline = RetrievalQA.from_chain_type(        llm=llm,        chain_type="stuff",        retriever=vector_store.as_retriever(search_kwargs={"k": 3})    )    return qa_pipeline

查询示例

最后,我们可以通过调用 RAG 管道来回答问题:

def query_rag_pipeline(qa_pipeline, question):    result = qa_pipeline({"query": question})    return result["result"]

使用示例

将以上函数组合使用:

def main():    vector_store = load_faiss_vector_store()    qa_pipeline = setup_rag_pipeline(vector_store)        question = "关于公司法律条款的解释"    answer = query_rag_pipeline(qa_pipeline, question)    print("回答:", answer)if __name__ == "__main__":    main()

总结

通过以上实现,我们成功构建了一个基于 FAISS 和 LangChain 的 RAG 管道。该系统能够通过结合嵌入模型和向量检索,快速找到相关文档,并生成高质量的回答。

转载地址:http://goqfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现natural sort自然排序算法(附完整源码)
查看>>
Objective-C实现nested brackets嵌套括号算法(附完整源码)
查看>>
Objective-C实现nevilles method多项式插值算法(附完整源码)
查看>>
Objective-C实现newtons second law of motion牛顿第二运动定律算法(附完整源码)
查看>>
Objective-C实现newton_raphson牛顿拉夫森算法(附完整源码)
查看>>
Objective-C实现NLP中文分词(附完整源码)
查看>>
Objective-C实现NLP中文分词(附完整源码)
查看>>
Objective-C实现not gate非门算法(附完整源码)
查看>>
Objective-C实现NumberOfIslands岛屿的个数算法(附完整源码)
查看>>
Objective-C实现n皇后问题算法(附完整源码)
查看>>
Objective-C实现OCR文字识别(附完整源码)
查看>>
Objective-C实现odd even sort奇偶排序算法(附完整源码)
查看>>
Objective-C实现page rank算法(附完整源码)
查看>>
Objective-C实现PageRank算法(附完整源码)
查看>>
Objective-C实现pascalTriangle帕斯卡三角形算法(附完整源码)
查看>>
Objective-C实现perfect cube完全立方数算法(附完整源码)
查看>>
Objective-C实现pollard rho大数分解算法(附完整源码)
查看>>
Objective-C实现quick select快速选择算法(附完整源码)
查看>>
Objective-C实现recursive bubble sor递归冒泡排序算法(附完整源码)
查看>>
Objective-C实现recursive insertion sort递归插入排序算法(附完整源码)
查看>>