• LangChain结合LLM做私有化文档搜索


    我们知道LLM(大语言模型)的底模是基于已经过期的公开数据训练出来的,对于新的知识或者私有化的数据LLM一般无法作答,此时LLM会出现“幻觉”。针对“幻觉”问题,一般的解决方案是采用RAG做检索增强。

    但是我们不可能把所有数据都丢给LLM去学习,比如某个公司积累的某个行业的大量内部知识。此时就需要一个私有化的文档搜索工具了。

    本文聊聊如何使用LangChain结合LLM快速做一个私有化的文档搜索工具。之前介绍过,LangChain几乎是LLM应用开发的第一选择,它的野心也比较大,它致力于将自己打造成LLM应用开发的最大社区。自然,它有这方面的成熟解决方案。

    文末,还会向朋友们推荐一款非常好用的AI机器人和LLM API超市,价格实惠又稳定,还可以领一波福利。

    1. RAG检索流程

    使用 LangChain 实现私有化文档搜索的主要流程,如下图所示:

    文档加载 → 文档分割 → 文档嵌入 → 向量化存储 → 文档检索 → 生成回答
    

    2. 代码实践细节

    2.1. 文档加载

    首先,我们需要加载文档数据。文档可以是各种格式,比如文本文件、PDF、Word 等。使用 LangChain,可以轻松地加载这些文档。下面以PDF为例:

    from langchain_community.document_loaders import PyPDFLoader
    
    loader = PyPDFLoader("./GV2.pdf")
    docs = loader.load()
    
    

    2.2. 文档分割

    加载的文档通常会比较大,为了更高效地处理和检索,我们需要将文档分割成更小的段落或句子。LangChain 提供了便捷的文本分割工具,可以按句子、块长度等方式分割文档。

    from langchain.text_splitter import RecursiveCharacterTextSplitter
    
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=50,
        chunk_overlap=20,
        separators=["\n", "。", "!", "?", ",", "、", ""],
        add_start_index=True,
    )
    texts = text_splitter.split_documents(docs)
    
    

    分割后的文档内容可以进一步用于生成向量。

    2.3. 文档嵌入 Embeddings

    文档分割后,我们需要将每一段文本转换成向量,这个过程称为文档嵌入。文档嵌入是将文本转换成高维向量,这是相似性搜索的关键。这里我们选择OpenAI的嵌入模型来生成文档的嵌入向量。

    from langchain_openai import OpenAIEmbeddings
    
    embeddings_model = OpenAIEmbeddings(
        openai_api_key="sk-xxxxxxxxxxx",
        openai_api_base="https://api.302.ai/v1",
    )
    
    txts = [txt.page_content for txt in texts]
    
    embeddings = embeddings_model.embed_documents(txts)
    
    

    2.4. 文档向量化存储

    接下来,我们需要将生成的向量化的文档,存入向量数据库中。向量数据库主要用来做相似性搜索,可以高效地存储和检索高维向量。LangChain 支持与多种向量数据库的集成,比如 Pinecone、FAISS、Chroma 等。

    本文以FAISS为例,首先需要安装FAISS,直接使用pip install faiss-cpu安装。

    from langchain_community.vectorstores import FAISS
    
    db = FAISS.from_documents(texts, embeddings_model)
    FAISS.save_local(db, "faiss_db2")
    
    

    2.5. 文档检索

    当用户提出问题时,我们需要在向量数据库中检索最相关的文档。检索过程是计算用户问题的向量表示,然后在向量数据库中查找与之最相似的文档。最后将找到的文档内容,拼接成一个大的上下文。

    向量数据库的检索支持多种模式,本文先用最简单的,后续再出文章继续介绍别的模式。

    from langchain.retrievers.multi_query import MultiQueryRetriever
    
    retriever = db.as_retriever()
    # retriever = db.as_retriever(search_type="similarity_score_threshold",search_kwargs={"score_threshold":.1,"k":5})
    # retriever = db.as_retriever(search_type="mmr")
    # retriever = MultiQueryRetriever.from_llm(
    #             retriever = db.as_retriever(),
    #             llm = model,
    #         )
    
    context = retriever.get_relevant_documents(query="张学立是谁?")
    
    _content = ""
    for i in context:
        _content += i.page_content
    
    

    2.6. 将检索内容丢给LLM作答

    最后,我们需要将检索到的文档内容丢入到 prompt 中,让LLM生成回答。LangChain 可以PromptTemplate模板的方式,将检索到的上下文动态嵌入到 prompt 中,然后丢给LLM,这样可以生成准确的回答。

    from langchain.prompts import ChatPromptTemplate
    from langchain_core.output_parsers import StrOutputParser
    
    question = "张学立是谁?"
    template = [
        (
            "system",
            "你是一个处理文档的助手,你会根据下面提供标签里的上下文内容来继续回答问题.\n 上下文内容\n \n{context} \n\n",
        ),
        ("human", "你好!"),
        ("ai", "你好"),
        ("human", "{question}"),
    ]
    prompt = ChatPromptTemplate.from_messages(template)
    
    messages = prompt.format_messages(context=_content, question=question)
    response = model.invoke(messages)
    
    output_parser = StrOutputParser()
    output_parser.invoke(response)
    

    2.7. 完整代码

    最后,将以上所有代码串起来,整合到一起,如下:

    from langchain_openai import ChatOpenAI
    from langchain_community.document_loaders import PyPDFLoader
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    from langchain_openai import OpenAIEmbeddings
    from langchain_community.vectorstores import FAISS
    from langchain.retrievers.multi_query import MultiQueryRetriever
    from langchain.prompts import ChatPromptTemplate
    from langchain_core.output_parsers import StrOutputParser
    
    model = ChatOpenAI(
        model_name="gpt-3.5-turbo",
        openai_api_key="sk-xxxxxxx",
        openai_api_base="https://api.302.ai/v1",
    )
    
    loader = PyPDFLoader("./GV2.pdf")
    docs = loader.load()
    
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=50,
        chunk_overlap=20,
        separators=["\n", "。", "!", "?", ",", "、", ""],
        add_start_index=True,
    )
    texts = text_splitter.split_documents(docs)
    
    embeddings_model = OpenAIEmbeddings(
        openai_api_key="sk-xxxxxxx",
        openai_api_base="https://api.302.ai/v1",
    )
    txts = [txt.page_content for txt in texts]
    embeddings = embeddings_model.embed_documents(txts)
    
    db = FAISS.from_documents(texts, embeddings_model)
    FAISS.save_local(db, "faiss_db2")
    
    
    retriever = db.as_retriever()
    
    template = [
        (
            "system",
            "你是一个处理文档的助手,你会根据下面提供标签里的上下文内容来继续回答问题.\n 上下文内容\n \n{context} \n\n",
        ),
        ("human", "你好!"),
        ("ai", "你好"),
        ("human", "{question}"),
    ]
    prompt = ChatPromptTemplate.from_messages(template)
    
    
    question = "张学立是谁?"
    context = retriever.get_relevant_documents(query=question)
    _content = ""
    for i in context:
        _content += i.page_content
    
    messages = prompt.format_messages(context=_content, question=question)
    response = model.invoke(messages)
    
    output_parser = StrOutputParser()
    output_parser.invoke(response)
    
    

    2.8. 总结、推荐

    通过 LangChain可以轻松实现私有化文档搜索,充分利用LLM的能力来处理和检索文档信息。按照文中的步骤,你也可以轻松实现。

    好的问答系统离不开优秀的LLM,根据我的个人经验,OpenAI的大模型能力排名是Top1的。但是使用OpenAI不方便,不但需要梯子而且还不稳定。

    一款好的LLM摆在面前,却用不了,着实头疼。有没有方便稳定的方式呢?当然有啦,下面我来推荐一款AI自助平台,不但有问答机器人、文生图机器人、文生视频机器人,还有常见的LLM API,稳定又还便宜。

    3. 推荐一款好用的AI平台 - 302.AI

    3.1. 什么是302.AI

    302.AI是一个汇集全球顶级AI的自助平台,汇集全球各类顶尖AI大模型,提供多种AI机器人,各种AI工具的使用和AI API接入。

    这个平台太适合开发者了,一站式配齐了 支持各种模型的工具AI API,再也不用这个网站用一下,那个网站用一下了。

    自由配置机器人、自由配置各种模型,每一款都很能打。

    3.2. 302.AI的优势

    我为什么愿意使用302.AI呢?主要还是优点比较多:

    • 功能全面:平台提供了各种机器人,其中包括不限于文字处理,图片处理,声音处理。 这一点就可以轻松应付我们平时的工作了,无需到处找AI工具网站。总之,平台提供的机器人,工具和API多种使用方法,可以满足从小白到开发者多种角色的需求。
    • 精选优质大模型:平台帮用户测试市面上众多的AI模型,挑出最好用的模型接入到平台,简化用户的挑选成本。而且再大模型的API调用处,还很贴心的集成了Apifox,在线调试,自动生成多种语言的代码。
    • 价格透明价格便宜:价格透明,token计算清晰,我对比过多个代理的价格,302.AI绝对是最便宜的,没有之一。
    • 按需付费,零门槛:302.AI另外一个特点是,不像大部分的AI工具网站按月收费或者按年收费,302.AI是按需付费,用多少付多少,价格便宜又透明,计费清晰,更无须担心跑路。这两年我见过的倒闭的AI工具站太多了。
    • 管理者和使用者分离:使用者无需关心复杂的AI设置,让懂AI的管理者来配置,配置完毕后分享给使用者,简化使用流程。小白也可简易使用。更无需使用梯子,方便又稳定。
    • 稳定性好:从我最近的使用感受来看,整体还是比较稳定的。不像有些API,时不时的给我冒一个配额不足的情况。

    下面上几个截图,功能较多,我就不一一解说了,欢迎朋友们自行尝试。

    总之,302.AI是一个可以满足从工具到API的聚合AI网站,也是一个可以满足从小白到开发者的需求的AI网站,同时,又兼顾了稳定性和性价比。更多功能,欢迎朋友们自行尝试解锁。

    3.3. 粉丝福利

    我这边创建了AI全能工具箱分享给大家体验,每天都会有 5美元额度,先到先用。

    AI全能工具箱链接:https://aitoolbox1-all.tools302.com?pwd=0658 分享码0658,注册完填写个问卷会得到1美元的试用额度。

    对于开发者朋友,可以私信我获取免费token,薅一波羊毛。

    =====>>>>>> 关于我 <<<<<<=====

    本篇完结!欢迎点赞 关注 收藏!!!

    原文链接:https://mp.weixin.qq.com/s/idLmCB8OXwtJIqAqfgBxuQ

  • 相关阅读:
    基于51单片机简易电子琴设计
    PADS(二)更多使用和实战总结
    安防监控视频AI智能分析网关:人流量统计算法的应用场景汇总
    本科毕业六年,疫情期间备战一个月,四面阿里巴巴定级P7
    HTML+CSS详细知识点复习(上)
    Spring Cloud Consul
    某计费管理系统任意文件读取漏洞
    C#设置数据库索引
    浅谈IDEA的优化和使用
    再探Handler(下)(Handler核心原理最全解析)
  • 原文地址:https://www.cnblogs.com/mangod/p/18253618