本电子书开源，欢迎 star 🌟，关注《LLM 应用开发实践笔记》

我的新书《LangChain编程从入门到实践》 已经开售！推荐正在学习AI应用开发的朋友购买阅读！

## 实现一个文档问答机器人

当前自有数据接入大模型有两种方式：微调模型和在 Prompt 上下文中带入知识

- prompt 上下文中带入知识，例如AI法律助手
  - 缺点：效果较差，难以在要求比较高的垂直场景使用
  - 优点：即开即用，应用落地速度非常快
- 微调（Fine-tuning）注入专业领域知识，例如中文法律通用模型由ChatGLM-6B LoRA 16-bit指令微调得到
  - 缺点：减少了LLM编排的逻辑，直接调用即可
  - 优点：成本和时间花费都比较高，而且需要定期进行调整以保持更新（法律文本还好一些）

下面是一个文档问答机器人（Prompt 上下文中带入知识）的实现通用流程图

### 保险合同解读机器人

在人身保险产品信息库 查询已备案的保险合同原件，为PDF格式

#### 合同文档分割

最简单的方案自然是，把保险条款按页码一页一页分块，如果一页内容也超了，那我们就半页半页分块。

### 最终实现

    from langchain.chains import RetrievalQA
    from langchain.llms import OpenAI
    from langchain.document_loaders import PyPDFLoader,PDFMinerLoader,PDFPlumberLoader,PyMuPDFLoader
    from langchain.text_splitter import CharacterTextSplitter
    from langchain.embeddings import OpenAIEmbeddings
    from langchain.vectorstores import Chroma

    def qa(file, query, chain_type, k):
        # load document
        loader = PyMuPDFLoader(file)
        documents = loader.load()
        # split the documents into chunks
        text_splitter = CharacterTextSplitter(chunk_size=2000, chunk_overlap=0)
        texts = text_splitter.split_documents(documents)
        # select which embeddings we want to use
        embeddings = OpenAIEmbeddings()
        # create the vectorestore to use as the index
        db = Chroma.from_documents(texts, embeddings)
        # expose this index in a retriever interface
        retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": k})
        # create a chain to answer questions
        qa = RetrievalQA.from_chain_type(
            llm=OpenAI(), chain_type=chain_type, retriever=retriever, return_source_documents=True)
        result = qa({"query": query})
        print(result['result'])
        return result

    def qa_result(prompt_text, select_chain_type, select_k):
        result = qa(file="./test.pdf", query=prompt_text, chain_type=select_chain_type, k=select_k)
        print(result)

    if __name__ == "__main__":
        import langchain
        langchain.debug = True
        qa_result("可以仔细讲讲免赔额吗", "map_reduce", 3)

### 参考链接

1. 构建基于大型语言模型的 AI 应用
2. Pinecone AI 手册

# results matching ""

# No results matching ""