AI-青训营 X 豆包MarsCode 技术训练营 实战课1-3|豆包MarsCode AI刷题

116 阅读8分钟

1. 引言:AI的革命与应用

  • ChatGPT与GPT-4: 代表大语言模型(LLM)的突破,推动了人工智能应用的全面普及。
  • 企业服务: ChatGPT和类似大模型的应用,可以优化客户服务、提升市场营销、改进产品设计等。
  • LangChain的出现: 作为开发基于大模型的应用框架,LangChain为程序员提供了强大的工具来实现这些目标。

2. LangChain概述

  • 定义: LangChain是一个开发基于语言模型的应用的框架,支持集成多种大语言模型(如GPT-4、Llama 2等)并能够扩展到更复杂的任务,如文本生成、文档问答等。

  • 核心特性:

    • 数据感知: 将语言模型与数据源连接,处理更多样化数据。
    • 代理性: 让语言模型与环境交互,实现智能化响应。

3. LangChain的组件

  1. 模型(Models) : 调用和解析不同语言模型的接口。
  2. 提示模板(Prompts) : 优化模型输入,提升模型性能。
  3. 数据检索(Indexes) : 构建和查询本地知识库。
  4. 记忆(Memory) : 存储对话历史,帮助模型记住上下文信息。
  5. 链(Chains) : 将多个功能组合成复杂任务流程。
  6. 代理(Agents) : 使用外部工具和内部系统,使模型能够自主执行任务。

4. LangChain应用实例

  1. 情人节玫瑰宣传语生成

    • 步骤:

      1. 安装LangChain和OpenAI相关库。
      2. 使用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)
      
  2. 海报文案生成器

    • 应用场景: 自动为社交媒体海报生成文案。

    • 工具: 使用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框架的整体结构

  1. 数据源(Data Sources):

    • 需要处理各种格式的文档(PDF、Word、TXT),这些数据属于非结构化数据。
    • 这些文件中包含公司内部的各种信息,包括操作规范、员工手册等,目标是从中提取信息,转换成机器可以理解的形式。
  2. 大模型应用(LLM Application):

    • 使用大语言模型(如OpenAI的GPT系列)来生成问答系统的答案。
    • 大模型不仅能够理解用户的问题,还能结合相关的文档内容生成准确的回答。
  3. 用例(Use-Cases):

    • 在这个系统中,最终目标是构建一个基于文档的问答系统。用户提问后,系统能够从存储的文档中检索相关内容并生成答案。
  4. 核心实现机制:

    • 整个实现过程可以分为五个步骤:加载文档、文本分割、嵌入存储、检索和生成答案。

关键步骤和实现

1. 文档加载(Loading)

  • 首先需要加载不同格式的文件。LangChain提供了针对PDF、Word、TXT格式的加载器(Document Loaders),分别为PyPDFLoaderDocx2txtLoaderTextLoader,能够将文件内容读取并以特定格式存储。
  • 通过遍历文件夹中的文档,我们加载所有文件,并将其保存在一个列表中,便于后续处理。

代码示例:

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如何将复杂的流程简化,并大大提高了处理非结构化数据的能力。通过这种框架,可以轻松地将大语言模型与具体的业务需求结合,开发出实际有用的应用。