LangChain 模型调用及文档Q&A | 豆包MarsCode AI刷题

195 阅读3分钟

通过 LangChain 调用 Text 和 Chat 模型

在安装LangChain 后,使用LangChain来调用OpenAI的Text和Chat模型

import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
from langchain.llms import OpenAI
llm = OpenAI(  
    model="gpt-3.5-turbo-instruct",
    temperature=0.8,
    max_tokens=60,)
response = llm.predict("请给我的花店起个名")
print(response)

结果输出 : 花之缘、芳华花店、花语心意、花风旖旎、芳草世界、芳色年华

原理:导入LangChain的OpenAI类,创建一个LLM对象。使用创建的LLM对象和消息列表调用OpenAI类的__call__方法,进行文本生成。

image.png

调用Chat模型进行文本的输出方法与Text相同,都是使用创建的chat对象和消息列表调用ChatOpenAI类的__call__方法,进行文本生成。将生成的结果存储在response变量中。

主要区别是Chat模型会从从LangChain的schema模块中导入LangChain的SystemMessage和HumanMessage类,创建一个消息列表。

import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(model="gpt-4",
                    temperature=0.8,
                    max_tokens=60)
from langchain.schema import (
    HumanMessage,
    SystemMessage
)
messages = [
    SystemMessage(content="你是一个很棒的智能助手"),
    HumanMessage(content="请给我的花店起个名")
]
response = chat(messages)
print(response)

得到答案

image.png

但我不是很理解为什么是源代码格式的输出

因为LangChain已经对大语言模型的output进行了解析,只保留了响应中最重要的文字部分,所以其返回的结果都比直接调用OpenAI API来得简单一些。

文档QA系统

image.png

整个框架分三个部分。

  • 数据源:数据可以有很多种,包括PDF在内的非结构化的数据、SQL在内的结构化的数据,以及Python、Java之类的代码。
  • 大模型应用:以大模型为逻辑引擎,生成我们所需要的回答。
  • 用例:大模型生成的回答可以构建出QA/聊天机器人等系统。

这个项目的核心实现机制是下图所示的数据处理管道

image.png

文档回答功能具体流程分为下面5步。

  1. Loading:文档加载器把Documents 加载为以LangChain能够读取的形式。
  2. Splitting:文本分割器把Documents 切分为指定大小的分割,我把它们称为“文档块”或者“文档片”。
  3. Storage:将上一步中分割好的“文档块”以“嵌入”(Embedding)的形式存储到向量数据库(Vector DB)中,形成一个个的“嵌入片”。
  4. Retrieval:应用程序从存储中检索分割后的文档(例如通过比较余弦相似度,找到与输入问题类似的嵌入片)。
  5. Output:把问题和相似的嵌入片传递给语言模型(LLM),使用包含问题和检索到的分割的提示生成答案

用LangChain中的document_loaders来加载各种格式的文本文件

代码导入了OpenAI的API Key。用Open AI的两种模型做以下两件事:

  • 用OpenAI的Embedding模型为文档做嵌入。
  • 调用OpenAI的GPT模型来生成问答系统中的回答。

下载安装PyPDF、Docx2txt等库后,使用 LangChain中的RecursiveCharacterTextSplitter来将加载的文本分割成更小的块

接着,我们将这些分割后的文本转换成嵌入的形式,并将其存储在一个向量数据库中。

当内部文档存储到向量数据库之后,我们需要根据问题和任务来提取最相关的信息。

生成回答并展示,这一步是问答系统应用的主要UI交互部分,这里会创建一个 Flask 应用(需要安装Flask包)来接收用户的问题,并生成相应的答案,最后通过 index.html 对答案进行渲染和呈现。

项目使用之前创建的 RetrievalQA 链来获取相关的文档和生成答案。然后显示在网页上。

image.png

image.png

总结

我们先把本地知识切片后存储到向量数据库中,然后把用户的输入通过欧氏距离和余弦相似度判断相关性,从向量数据库中检索到的本地知识传递给大模型,最终生成所想要的回答。