LangChain学习第二节 | 豆包MarsCode AI刷题

168 阅读4分钟

我们跟随黄佳老师,一起学LangChain实战课!

我们要从头完成一个很实用、很有意义的实战项目。目的是直观感受一下LangChain作为一个基于大语言模型的应用开发框架,功能到底有多么强大。好的,现在就开始!

项目及实现框架

项目名称:“易速鲜花”内部员工知识库问答系统。

项目介绍:“易速鲜花”作为一个大型在线鲜花销售平台,有自己的业务流程和规范,也拥有针对员工的SOP手册。新员工入职培训时,会分享相关的信息。但是,这些信息分散于内部网和HR部门目录各处,有时不便查询;有时因为文档过于冗长,员工无法第一时间找到想要的内容;有时公司政策已更新,但是员工手头的文档还是旧版内容。

基于上述需求,我们将开发一套基于各种内部知识手册的 “Doc-QA” 系统。这个系统将充分利用LangChain框架,处理从员工手册中产生的各种问题。这个问答系统能够理解员工的问题,并基于最新的员工手册,给出精准的答案。

用 LangChain 框架实现一个知识库文档系统需要几个关键组件,包括数据源、索引器、检索器和模型。下面是一个整体框架的示例,展示如何使用 LangChain 来实现这样的系统。

1. 安装依赖

首先,确保你安装了 LangChain 和相关依赖。可以通过以下命令安装:

Copypip install langchain
pip install openai  # 如果使用 OpenAI 模型
pip install faiss-cpu  # 如果使用 FAISS 进行检索

2. 导入库

Copyfrom langchain import OpenAI, Vectorstore
from langchain.chains import RetrievalQA
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import TextLoader
from langchain.vectorstores import FAISS

3. 数据加载

你需要一个文档数据源。可以是文本文件、PDF 文件或其他格式。以下是一个从文本文件加载文档的示例:

Copydef load_documents(file_path):
    loader = TextLoader(file_path)
    documents = loader.load()
    return documents

4. 创建索引

使用向量存储(如 FAISS)来索引文档并进行检索:

Copydef create_vectorstore(documents):
    embeddings = OpenAIEmbeddings()  # 使用 OpenAI 的嵌入模型
    vectorstore = FAISS.from_documents(documents, embeddings)
    return vectorstore

5. 创建检索链

使用 LangChain 的 RetrievalQA 来创建问答链:

Copydef create_qa_chain(vectorstore):
    llm = OpenAI()  # 使用 OpenAI API 作为语言模型
    qa_chain = RetrievalQA.from_chain_type(
        llm=llm,
        chain_type="stuff",
        retriever=vectorstore.as_retriever()
    )
    return qa_chain

6. 主程序

整合上述组件,创建一个完整的知识库文档系统:

Copydef main(file_path):
    # 加载文档
    documents = load_documents(file_path)
    
    # 创建向量存储
    vectorstore = create_vectorstore(documents)
    
    # 创建问答链
    qa_chain = create_qa_chain(vectorstore)

    # 示例:进行查询
    query = "你的查询内容是什么?"
    response = qa_chain.run(query)
    
    print("回答:", response)

if __name__ == "__main__":
    file_path = "path/to/your/documents.txt"  # 替换为你的文档路径
    main(file_path)

7. 扩展功能

  • 多种数据源支持:可以扩展数据加载部分,支持 PDF、Word 文档等格式。
  • 用户界面:可以使用 Flask 或 Django 创建一个 Web 界面,供用户输入查询。
  • 更多功能:可以添加权限管理、用户历史记录、知识库更新等功能。

最后

回答课程中的思考题。

一. 请你用自己的话简述一下这个基于文档的QA(问答)系统的实现流程?

  1. 数据加载从各种数据源(如文本文件、PDF或其他文档格式)中加载文档。
  2. 文档处理对加载的文档进行清洗、分段或格式化,以便于后续步骤进行嵌入和索引。
  3. 向量化,使用预训练的嵌入模型(如OpenAI的嵌入模型)将处理后的文档转化为向量表示。
  4. 创建索引,将生成的文档向量存储到向量数据库中(如FAISS),以便快速检索相关文档。
  5. 问答链,使用问答模型(如OpenAI的语言模型)和创建的向量检索器构建问答链。
  6. 交互与响应,用户输入查询后,系统检索相关文档并生成答案,最后返回给用户。
  7. 扩展与优化,根据需求进一步扩展功能,例如增加用户界面、支持多种数据源等。

二. LangChain支持很多种向量数据库,你能否用另一种常用的向量数据库Chroma来实现这个任务?

mport os
from langchain import OpenAI
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# 加载文档
def load_documents(file_path):
    """加载指定路径的文本文件并返回文档列表。"""
    loader = TextLoader(file_path)
    documents = loader.load()
    return documents

# 创建向量存储
def create_vectorstore(documents):
    """将文档转换为向量并存储在Chroma数据库中。"""
    embeddings = OpenAIEmbeddings()
    vectorstore = Chroma.from_documents(documents, embeddings)
    return vectorstore

# 创建问答链
def create_qa_chain(vectorstore):
    """创建问答链以处理用户查询。"""
    llm = OpenAI()
    qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever())
    return qa_chain

# 主程序入口
def main(file_path):
    """整合所有组件以实现文档问答功能。"""
    documents = load_documents(file_path)
    vectorstore = create_vectorstore(documents)
    qa_chain = create_qa_chain(vectorstore)

    # 示例查询
    query = "你的查询内容是什么?"
    response = qa_chain.run(query)
    print("回答:", response)

if __name__ == "__main__":
    file_path = "path/to/your/documents.txt"  # 替换为你的文档路径
    main(file_path)

今天的学习结束了。