一、基础知识
在深入学习 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-4或text-davinci-003。 - temperature:控制生成文本的随机性,数值范围为
0.0(确定性更强)到1.0(更具创造性)。 - max_tokens:生成文本的最大长度。
- messages(仅限 Chat 模型):列表形式输入对话历史,角色包括
system、user和assistant。
四、搭建本地知识库问答系统
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. 嵌入并存储到向量数据库
接下来,将分割后的文本转化为嵌入向量,并存储在向量数据库中。在这里,使用 OpenAIEmbeddings 和 Qdrant 数据库来实现。
嵌入与向量数据库的概念
- 词嵌入(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 的知识库问答系统。整个项目流程如下:
- 数据加载:从 PDF、Word、txt 等文件中提取内容。
- 文本分割:将长文本切分为更小的块,便于嵌入和存储。
- 嵌入存储:将文本块转换为向量,并存储在 Qdrant 数据库中。
- 语义检索:基于用户输入的问题,检索相关的文档块。
- 生成答案:利用 GPT 模型结合检索到的文档块生成精准回答。
五、项目总结
通过以上学习,我了解了大语言模型的基本原理、LangChain 的安装及其优势,以及如何调用 OpenAI 的 API。也是基于 LangChain 搭建了知识库问答系统