青训营X豆包MarsCode 技术训练营第二课-快速入门&搭建本地知识库问答系统 | 豆包MarsCode AI 刷题

334 阅读6分钟

一、基础知识

在深入学习 LangChain 和 OpenAI API 之前,我们需要先了解一些基本知识。虽然使用大语言模型(LLM)进行开发看似简单,但要通过 API 构建应用程序,仍需掌握以下内容:

1. 什么是大语言模型(LLM)?

大语言模型是一种基于深度学习技术(例如神经网络)来理解和生成自然语言的人工智能模型。其“大”主要体现在参数数量的庞大,通常达到数十亿甚至数千亿级别。这使得模型可以识别并生成复杂的语言模式。

工作原理

  • 大语言模型可以通过大量的训练数据(例如文本)来学习语言模式。在预测下一个词时,模型不仅依赖词语的统计关系,还能理解上下文,甚至在某些场景中反映出一定的常识。例如,给定句子开头“今天的天气真”,模型可能会预测出“好”,因为“今天的天气真好”是常见的表达。

  • 但是这些模型并不具备真正的人类理解力或情感。它们只是基于数学函数和概率进行预测。因此,生成的内容有时可能会偏离主题或出现错误。

二、LangChain 概述

LangChain 是一个用于大语言模型应用开发的强大工具。它提供了一系列模块化功能,使得开发者可以轻松调用 LLM 的预测能力,并基于此构建应用程序。LangChain 支持 Python 和 JavaScript 两种版本,但我们将以 Python 为主进行学习和练习。 LangChain 的特点如下:

  • 预构建链(Chains) :像积木一样,开发者可以快速拼接各种功能模块,适合不同水平的用户。
  • 模块化组件:允许开发者根据需求自定义功能链条。

安装 LangChain

pip install langchain

安装常用 LLM 依赖

pip install langchain[llms]

升级到最新版本

pip install --upgrade langchain

从源代码安装(推荐用于开发环境)

git clone https://github.com/hwchase17/langchain.git
cd langchain
pip install -e .

三、OpenAI API 详解

要深入使用 LangChain,我们需要对 OpenAI 的 API 有更深入的了解。OpenAI 目前提供的最强大和最完备的 LLM 就是 GPT 家族了。

1. openAI API 注册与使用

  • 注册 API Key:访问 OpenAI 官网 注册账号并获取 API Key,本次课程的学习中,我们依照readme文档,访问火山方舟官网完成账号注册和服务授权,创建使用了豆包的api,进行实验。

  • 设置环境变量(推荐方法):

    export OPENAI_API_KEY='你的OpenAPI Key'
    export OPENAI_BASE_URL='xxxxx'
    export LLM_MODELEND='xxxxx'
    export EMBEDDING_MODELEND='xxxxx
    

2. 类型及调用方式

OpenAI 提供了两类主要模型:

  • Chat Models(对话模型):如 gpt-3.5-turbo
  • Text Models(文本模型):如 text-davinci-003,适合文本生成任务。

Chat Models 调用示例

import openai

# 设置 API Key
openai.api_key = '你的OpenAPI Key'

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "请给我的花店起个名字"}
    ],
    temperature=0.7,
    max_tokens=60
)

# 输出结果
print(response.choices[0].message['content'])

Text Models 调用示例

response = openai.Completion.create(
    model="text-davinci-003",
    prompt="请给我的花店起个名字",
    temperature=0.5,
    max_tokens=50
)

print(response.choices[0].text.strip())

3. 参数说明

  • model:指定模型版本,如 gpt-4text-davinci-003
  • temperature:控制生成文本的随机性,数值范围为 0.0(确定性更强)到 1.0(更具创造性)。
  • max_tokens:生成文本的最大长度。
  • messages(仅限 Chat 模型):列表形式输入对话历史,角色包括 systemuserassistant

四、搭建本地知识库问答系统

1. 数据的准备和载入

数据格式:“易速鲜花”的内部资料包括 PDF、Word 和 txt 格式的文件。会使用 LangChain 的 document_loaders 模块加载这些文本数据。

代码示例:

import os
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader, TextLoader

# 设置 OpenAI API Key
os.environ["OPENAI_API_KEY"] = '你的Open AI API Key'

# 加载 Documents
base_dir = './OneFlower'  # 文档存放目录
documents = []

for file in os.listdir(base_dir):
    file_path = os.path.join(base_dir, file)
    if file.endswith('.pdf'):
        loader = PyPDFLoader(file_path)
        documents.extend(loader.load())
    elif file.endswith('.docx'):
        loader = Docx2txtLoader(file_path)
        documents.extend(loader.load())
    elif file.endswith('.txt'):
        loader = TextLoader(file_path)
        documents.extend(loader.load())

2. 文本分割

加载完成后,需要将文档切分成更小的文本块,以便后续的嵌入处理。这一步使用 RecursiveCharacterTextSplitter 来实现。

代码示例:

from langchain.text_splitter import RecursiveCharacterTextSplitter

# 使用文本分割器将文档切分为块
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10)
chunked_documents = text_splitter.split_documents(documents)

3. 嵌入并存储到向量数据库

接下来,将分割后的文本转化为嵌入向量,并存储在向量数据库中。在这里,使用 OpenAIEmbeddingsQdrant 数据库来实现。

嵌入与向量数据库的概念
  • 词嵌入(Word Embedding) :将文字或词语转换为向量,保留其语义信息。
  • 向量数据库:专门用于存储和搜索向量数据的数据库,支持高效的相似度检索。我们使用 Qdrant 作为向量存储解决方案。

代码示例:

from langchain.vectorstores import Qdrant
from langchain.embeddings import OpenAIEmbeddings

# 创建 Qdrant 向量数据库
vectorstore = Qdrant.from_documents(
    documents=chunked_documents,
    embedding=OpenAIEmbeddings(),
    location=":memory:",  # 使用内存存储
    collection_name="my_documents"
)

4. 检索相关信息

当员工提出问题时,我们需要从向量数据库中提取相关信息。此时,将问题转换为向量,并与数据库中的向量进行比较。最常用的相似度度量方法包括欧氏距离和余弦相似度。

  • 欧氏距离:适用于需要关心绝对值差异的场景。
  • 余弦相似度:适用于文本数据的语义匹配,更关注向量的方向而非长度。

代码示例:

from langchain.chains import RetrievalQA

# 创建 RetrievalQA 模型
retriever = vectorstore.as_retriever()
qa_chain = RetrievalQA.from_chain_type(llm="gpt-3.5-turbo", retriever=retriever)

# 进行问答
query = "请问易速鲜花的退货政策是什么?"
answer = qa_chain.run(query)
print(f"问题: {query}\n回答: {answer}")

通过以上步骤,成功搭建了一个基于 LangChain 的知识库问答系统。整个项目流程如下:

  1. 数据加载:从 PDF、Word、txt 等文件中提取内容。
  2. 文本分割:将长文本切分为更小的块,便于嵌入和存储。
  3. 嵌入存储:将文本块转换为向量,并存储在 Qdrant 数据库中。
  4. 语义检索:基于用户输入的问题,检索相关的文档块。
  5. 生成答案:利用 GPT 模型结合检索到的文档块生成精准回答。

image.png


image.png

五、项目总结

通过以上学习,我了解了大语言模型的基本原理、LangChain 的安装及其优势,以及如何调用 OpenAI 的 API。也是基于 LangChain 搭建了知识库问答系统