1. 引言:AI的革命与应用
- ChatGPT与GPT-4: 代表大语言模型(LLM)的突破,推动了人工智能应用的全面普及。
- 企业服务: ChatGPT和类似大模型的应用,可以优化客户服务、提升市场营销、改进产品设计等。
- LangChain的出现: 作为开发基于大模型的应用框架,LangChain为程序员提供了强大的工具来实现这些目标。
2. LangChain概述
-
定义: LangChain是一个开发基于语言模型的应用的框架,支持集成多种大语言模型(如GPT-4、Llama 2等)并能够扩展到更复杂的任务,如文本生成、文档问答等。
-
核心特性:
- 数据感知: 将语言模型与数据源连接,处理更多样化数据。
- 代理性: 让语言模型与环境交互,实现智能化响应。
3. LangChain的组件
- 模型(Models) : 调用和解析不同语言模型的接口。
- 提示模板(Prompts) : 优化模型输入,提升模型性能。
- 数据检索(Indexes) : 构建和查询本地知识库。
- 记忆(Memory) : 存储对话历史,帮助模型记住上下文信息。
- 链(Chains) : 将多个功能组合成复杂任务流程。
- 代理(Agents) : 使用外部工具和内部系统,使模型能够自主执行任务。
4. LangChain应用实例
-
情人节玫瑰宣传语生成
-
步骤:
- 安装LangChain和OpenAI相关库。
- 使用LangChain API调用GPT-3.5生成宣传语。
-
代码:
import os os.environ["OPENAI_API_KEY"] = 'your_api_key' from langchain_openai import OpenAI llm = OpenAI(model_name="gpt-3.5-turbo-instruct", max_tokens=200) text = llm.invoke("请给我写一句情人节红玫瑰的中文宣传语") print(text)
-
-
海报文案生成器
-
应用场景: 自动为社交媒体海报生成文案。
-
工具: 使用LangChain中的代理机制调用图像字幕生成工具。
-
代码:
import os import requests from PIL import Image from transformers import BlipProcessor, BlipForConditionalGeneration from langchain.tools import BaseTool from langchain import OpenAI from langchain.agents import initialize_agent, AgentType # 初始化图像字幕生成模型 hf_model = "Salesforce/blip-image-captioning-large" processor = BlipProcessor.from_pretrained(hf_model) model = BlipForConditionalGeneration.from_pretrained(hf_model) # 定义图像字幕生成工具类 class ImageCapTool(BaseTool): name = "Image captioner" description = "为图片创作说明文案." def _run(self, url: str): image = Image.open(requests.get(url, stream=True).raw).convert('RGB') inputs = processor(image, return_tensors="pt") out = model.generate(**inputs, max_new_tokens=20) caption = processor.decode(out[0], skip_special_tokens=True) return caption # 初始化并运行LangChain智能代理 os.environ["OPENAI_API_KEY"] = 'your_api_key' llm = OpenAI(temperature=0.2) tools = [ImageCapTool()] agent = initialize_agent(agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, tools=tools, llm=llm, verbose=True) img_url = 'https://example.com/flower_image.jpg' agent.invoke(input=f"{img_url}\n请创作合适的中文推广文案")
-
5. LangChain的实际应用场景
- 嵌入式存储与数据库连接: 学习如何在实际应用中使用LangChain连接数据库并进行数据存储。
- 异步通信与智能代理: 通过LangChain智能代理处理多任务,并在任务间进行智能决策。
6. 课程总结与展望
- LangChain的潜力: 作为一个强大的开发框架,LangChain可以帮助开发者构建复杂的智能应用,提供强大的大模型支持和灵活的功能模块。
- 未来前景: LangChain不仅能帮助企业提升服务质量,还能推动整个行业在智能化应用上的突破,开启更广泛的AI应用开发新时代。
7. 项目背景及目标
背景: “易速鲜花”是一个在线鲜花销售平台,具有大量内部文档和员工手册。这些文档包括SOP(标准操作程序)手册,HR管理文件等。新员工在入职时往往需要学习这些内容,但由于信息分散且内容繁杂,导致查询时不便,特别是当公司政策更新而员工手册未及时更新时,可能会给员工带来困扰。
目标: 开发一个基于LangChain的内部知识库问答系统,让员工能够快速、准确地从最新的文档中获取所需的信息。这一系统能够处理各种类型的文件(如PDF、Word、TXT),并将它们转换为可用于问答的“嵌入”形式。
LangChain框架的整体结构
-
数据源(Data Sources):
- 需要处理各种格式的文档(PDF、Word、TXT),这些数据属于非结构化数据。
- 这些文件中包含公司内部的各种信息,包括操作规范、员工手册等,目标是从中提取信息,转换成机器可以理解的形式。
-
大模型应用(LLM Application):
- 使用大语言模型(如OpenAI的GPT系列)来生成问答系统的答案。
- 大模型不仅能够理解用户的问题,还能结合相关的文档内容生成准确的回答。
-
用例(Use-Cases):
- 在这个系统中,最终目标是构建一个基于文档的问答系统。用户提问后,系统能够从存储的文档中检索相关内容并生成答案。
-
核心实现机制:
- 整个实现过程可以分为五个步骤:加载文档、文本分割、嵌入存储、检索和生成答案。
关键步骤和实现
1. 文档加载(Loading)
- 首先需要加载不同格式的文件。LangChain提供了针对PDF、Word、TXT格式的加载器(Document Loaders),分别为
PyPDFLoader、Docx2txtLoader和TextLoader,能够将文件内容读取并以特定格式存储。 - 通过遍历文件夹中的文档,我们加载所有文件,并将其保存在一个列表中,便于后续处理。
代码示例:
python
复制代码
import os
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader, TextLoader
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. 文本分割(Splitting)
- 由于文档内容可能过长,我们需要将其分割为较小的片段(文档块)。这一步使用了
RecursiveCharacterTextSplitter来按字符数分割文本,以保证每个片段的大小适合后续处理。
代码示例:
python
复制代码
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10)
chunked_documents = text_splitter.split_documents(documents)
思考:
- 文本的切分是至关重要的,它能影响到后续嵌入的效果。如果文档切分过小,可能会导致信息丢失;如果切分过大,可能会导致无法高效地存储和检索信息。
3. 向量数据库存储(Storage)
- 将文本转换为“嵌入”并存储在向量数据库中。嵌入是通过向量化技术将文本转化为高维数字空间中的向量,使得文本之间的语义关系能够被捕捉。
- 使用
OpenAIEmbeddings生成嵌入,Qdrant向量数据库来存储嵌入。这种存储方式大大提高了查询效率,因为查询时可以通过计算向量之间的相似度来找到最相关的文档。
代码示例:
python
复制代码
from langchain.vectorstores import Qdrant
from langchain.embeddings import OpenAIEmbeddings
vectorstore = Qdrant.from_documents(
documents=chunked_documents,
embedding=OpenAIEmbeddings(),
location=":memory:",
collection_name="my_documents"
)
思考:
- 向量存储的优点在于能够快速检索相似的文档片段。不同的向量数据库可能有不同的查询速度和存储效率,选择合适的数据库很重要。
4. 检索(Retrieval)
- 使用嵌入查询数据库,找到与用户问题最相关的文档块。这个过程是基于余弦相似度计算的,目的是找出最接近用户问题语义的文本片段。
代码示例:
python
复制代码
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=llm)
qa_chain = RetrievalQA.from_chain_type(llm, retriever=retriever_from_llm)
思考:
MultiQueryRetriever允许我们通过多个查询获取更为精准的结果。这对于处理多样化的用户问题非常有帮助。
5. 生成回答(Output)
- 用户通过Web界面提出问题,系统使用LangChain中的问答链(RetrievalQA链)生成答案,并返回给用户。
代码示例:
python
复制代码
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
if request.method == 'POST':
question = request.form.get('question')
result = qa_chain({"query": question})
return render_template('index.html', result=result)
return render_template('index.html')
- 在实际部署时,通过Web接口让员工能够快速提交问题,并得到准确的答案,提高了工作效率。
总结
LangChain框架结合大语言模型和向量数据库的强大功能,使得实现一个文档知识库问答系统变得既简洁又高效。从文档的加载、分割到嵌入存储,再到检索和生成答案,整个流程都能通过LangChain提供的工具包轻松实现。这个项目不仅展示了LangChain框架在实际应用中的潜力,也为我们提供了一个实现类似系统的详细示例。
在学习这个项目时,我深刻体会到LangChain如何将复杂的流程简化,并大大提高了处理非结构化数据的能力。通过这种框架,可以轻松地将大语言模型与具体的业务需求结合,开发出实际有用的应用。