AI 文摘

LangChain检索链RAG检索增强生成关于LangChain一定要知道的一个知识点





作者: 峰哥Python笔记 来源: 峰哥Python笔记

LangChain家族很庞大,包含LangSmith,LangServe,LangChain-community,LangChain-Core,这是一个开发框架,支持Python和Javascript,我们看到的一些好玩LLM项目都是基于LangChain的,比如,Open WebUI,Lobe Chat,Chat LangChain都是,如果想现成的,LangChain任何内容都可以不看,如果你想自己搞一点开发,那怕是别人已经搞出来,自己动手实操,除了Ollama这一系列,LangChain这一堆也值得了解。今天内容比较随意,没有图片,只有代码,这些代码在我本地环境跑通,欢迎大家测试留言。

首先,我们需要加载要索引的数据。为此,我们将使用 WebBaseLoader 。这需要安装 BeautifulSoup:

%pip install beautifulsoup4  

使用本地的ollama 提供的llama2 模型,确保本地后台正确运行ollama 服务。

from langchain_community.llms import Ollama  
llm = Ollama(model="llama2")  

我们可以导入和使用 WebBaseLoader ,让它读LangChain Smith 文档。

from langchain_community.document_loaders import WebBaseLoader  
loader = WebBaseLoader("https://docs.smith.langchain.com/user_guide")  
  
docs = loader.load()  

下来,我们需要将其索引到向量存储中。这需要一些组件,即嵌入模型和向量存储。对于嵌入模型,我们再次提供了通过 API 或运行本地模型进行访问的示例。

确保本地正确安装了Ollama,创建ollama嵌入模型。

from langchain_community.embeddings import OllamaEmbeddings  
embeddings = OllamaEmbeddings()  

现在,我们可以使用此嵌入模型将文档摄取到矢量存储中。为了简单起见,我们将使用一个简单的本地向量存储 FAISS。首先,我们需要为此安装所需的软件包:

%pip install faiss-cpu  

faiss-cpu 是一个用于在 CPU 上高效执行向量相似性搜索的库。它是 Facebook AI Research 开发的,用于处理大规模向量数据的工具。faiss-cpu 基于近似最近邻(ANN)算法,能够快速地在高维向量空间中搜索最相似的向量。这个库在许多应用中都非常有用,比如聚类、相似性搜索、推荐系统等。通过faiss-cpu,用户可以利用 CPU 资源高效地处理大规模的向量数据集。

然后我们可以建立我们的索引:

from langchain_community.vectorstores import FAISS  
from langchain_text_splitters import RecursiveCharacterTextSplitter  
  
  
text_splitter = RecursiveCharacterTextSplitter()  
documents = text_splitter.split_documents(docs)  
vector = FAISS.from_documents(documents, embeddings)  

对获取的文档进行分割,分割后存入向量库中,这里使用了FAISS向量库,上次使用的是chroma向量库。关于两种数据库:

FAISS是Facebook开发的开源库,需要自己构建和管理索引,支持CPU和GPU计算。它可以处理海量的向量数据,支持多种索引方式,如Flat、IVF、PQ等。它还提供了Python接口,可以与Numpy完美衔接。FAISS的优点是速度快、灵活、可扩展,缺点是安装依赖复杂、使用门槛高、不支持元数据存储。

Chroma是一个用于构建带有嵌入向量的AI应用程序的数据库,内置了入门所需的一切,并提供了简单的API。它目前只支持CPU计算,但可以利用乘积量化的方法,将一个向量的维度切成多段,每段分别进行k-means,从而减少存储空间和提高检索效率。它还可以与LangChain集成,实现基于语言模型的应用。Chroma的优点是易用、轻量、智能,缺点是功能相对简单、不支持GPU加速。

现在,我们已经在向量存储中索引了这些数据,我们将创建一个检索链。该链将接受一个传入的问题,查找相关文档,然后将这些文档与原始问题一起传递到 LLM 中,并要求它回答原始问题。

首先,让我们设置一个链,该链接受一个问题和检索到的文档并生成一个答案。

from langchain.chains.combine_documents import create_stuff_documents_chain  
  
prompt = ChatPromptTemplate.from_template("""Answer the following question based only on the provided context:  
  
<context>  
{context}  
</context>  
  
Question: {input}""")  
  
document_chain = create_stuff_documents_chain(llm, prompt)  

创建一个提示词模板,使用提示词和模型创建一个基于文档的查询链。

像上次一样,我们可以通过直接传入文档来自己运行它:

from langchain_core.documents import Document  
  
document_chain.invoke({  
    "input": "how can langsmith help with testing?",  
    "context": [Document(page_content="langsmith can let you visualize test results")]  
})  

这是直接通过提出问题,让模型来回答,它给返回:

'\nBased on the provided context, langsmith can help with testing by allowing users to visualize their test results. This means that langsmith provides a way for users to view and analyze their test data in a graphical or visual format, which can be useful for understanding and interpreting test results.'  

没有使用我们提供的数据,所以结果不好。

但是,我们希望文档首先来自我们刚刚设置的检索器。这样,对于给定的问题,我们可以使用检索器动态选择最相关的文档并将其传递。

from langchain.chains import create_retrieval_chain  
  
retriever = vector.as_retriever()  
retrieval_chain = create_retrieval_chain(retriever, document_chain)  

我们现在可以调用这条链。这将返回一个字典 - 来自 LLM 的响应在键中answer

response = retrieval_chain.invoke({"input": "how can langsmith help with testing?"})  
print(response["answer"])  

这次是基于我们提供的数据的向量库进行的回答:

Based on the provided context, LangSmith can help with testing in several ways:  
  
1. Debugging: LangSmith allows developers to debug their LLM applications by providing clear visibility and debugging information at each step of an LLM sequence. This helps identify and root-cause issues when things go wrong.  
2. Testing: LangSmith provides a user-friendly comparison view for test runs to track and diagnose regressions in test scores across multiple revisions of an application. It also allows developers to create datasets, which are collections of inputs and reference outputs, and use these to run tests on their LLM applications.  
3. Annotating Traces: LangSmith supports sending runs to annotation queues, where annotators can closely inspect interesting traces and annotate them with respect to different criteria. This helps catch regressions across important evaluation criteria.  
4. Adding Runs to a Dataset: As an application progresses through the beta testing phase, LangSmith enables users to add runs to datasets, expanding test coverage on real-world scenarios.  
5. Monitoring and A/B Testing: LangSmith provides monitoring charts that allow users to track key metrics over time and drill down into specific data points to get a trace table for that time period. It also allows for tag and metadata grouping, which helps mark different versions of an application with different identifiers and view how they are performing side-by-side within each chart. This is helpful for A/B testing changes in prompt, model, or retrieval strategy.  

这是从我们给的文档中找到的答案。训练好的模型原来没有素材,问题,他通过嵌入技术,把素材给大模型,他就能给出一个相对靠谱一点的答案,说了一圈,这就是前几天说的『RAG 』增强检索生成。

这里把整个路子捋了一遍,这个过程可能需要多看几遍能有更好的理解。如果有时间,可以自己把这个过程重新走一遍。这是一个基于网页文档的,同理,可以是pdf,csv,md等的文档认知,回答,聊天等。

学习交流矩阵

组建了两个python学习群,学习生态很好。现在各种大模型层出不穷,chatgpt4 已经很牛了,现在还出了claude3 ,还有ollama 这种开源大模型,民用级机器也可以跑大模型。李老板昨天说『以后没有程序员这个职业了 』,人人都拥有程序员的技能,这几天英伟达的黄老板也说了类似的话,把编程这个活交给AI,你的后台支撑那里来,来学习『大模型 』吧,我想组个『大模型交流群 』。如果对大模型感兴趣,加我微信,组大模型群拉上你。加微信时备注一下。现有已经有60多人入群了。

组建了『PyQt6 学习交流1群 』快有1年了,大家积极交流,现在有 400 多位参与者,群内高手云集,各方面大咖,形成很好的Python PyQt6 的交流生态,让我们借鉴,让我受益良多。群比较松散,开放进入就会比较乱,现在进群只能邀请,现在组建『PyQt6 学习交流2群 』,如果需要进群,关注下面公众号,按提示进群。群内会不定期发放些学习材料、代码、视频等。

另外,如果我的文字对你有帮助,记得点赞、转发,点在看

另外最近也有学习『JavaScript 』 ,想组个群共同学习,感兴趣的可以加入学习讨论。

  1. 2024-03-30日晚

更多AI工具,参考Github-AiBard123国内AiBard123

可关注我们的公众号:每天AI新工具