随笔 - 20  文章 - 0  评论 - 0  阅读 - 630

langchain(4):基于文档的问答

给定pdf、网页或公司内部文档库中提取的文本,使用llm回答关于这些文档内容的问题,llm+没被训练的数据

  • 1.导入环境变量和需要用到的库

    # 环境变量
    import os
    
    from dotenv import load_dotenv, find_dotenv
    _ = load_dotenv(find_dotenv()) # read local .env file
    # 对应库
    from langchain.chains import RetrievalQA
    from langchain.chat_models import ChatOpenAI
    from langchain.document_loaders import CSVLoader
    from langchain.vectorstores import DocArrayInMemorySearch
    from IPython.display import display, Markdown
    from langchain.llms import OpenAI
    
  • 2.创建向量存储

    # 导入数据
    file = 'OutdoorClothingCatalog_1000.csv'
    loader = CSVLoader(file_path=file)
    # 创建向量存储
    from langchain.indexes import VectorstoreIndexCreator
    # 指定向量存储类,调用文档加载器loader
    index = VectorstoreIndexCreator(
        vectorstore_cls=DocArrayInMemorySearch
    ).from_loaders([loader])
    
  • 3.提问

    针对大文档进行提问:embedding(内容相似的文本会有相似的向量值,即在数值空间上比较相近)

    向量数据库:将文档拆成块,每一块生成embedding,然后把embedding和原始块一起存储到数据库

    查询内容→生成embedding→数字数组(向量)→同向量数据库中向量比较→最相似的前若干个文本块→文本块和查询内容传递给llm→最终答案

    query ="Please list all your shirts with sun protection \
    in a table in markdown and summarize each one."
    
    1. embedding
    from langchain.embeddings import OpenAIEmbeddings
    embeddings = OpenAIEmbeddings()
    # 单语句
    embed = embeddings.embed_query("Hi my name is Harrison")
    # 多语句或多片段,参数:文档列表、embedding对象;得到一个向量存储器
    db = DocArrayInMemorySearch.from_documents(
        docs, 
        embeddings
    )
    # 进行提问
    query = "Please suggest a shirt with sunblocking"
    docs = db.similarity_search(query)
    
  • 5.利用向量存储器回答自己文档的问题

    # 从向量存储器中创建检索器
    retriever = db.as_retriever()
    # 导入语言模型
    llm = ChatOpenAI(temperature = 0.0, model=llm_model)
    # 将检索出来的文档合并为文本
    qdocs = "".join([docs[i].page_content for i in range(len(docs))])
    # 将变量内容与问题一起传给llm
    response = llm.call_as_llm(f"{qdocs} Question: Please list all your \
    shirts with sun protection in a table in markdown and summarize each one.") 
    
  • 6.封装到langchain链

    # 对查询进行检索,然后在检索到的文档上进行问答
    # 参数:语言模型、链类型、检索器(检索文档的接口)
    qa_stuff = RetrievalQA.from_chain_type(
        llm=llm, 
        chain_type="stuff", 
        retriever=retriever, 
        verbose=True
    )
    
    # 测试
    query =  "Please list all your shirts with sun protection in a table \
    in markdown and summarize each one."
    response = qa_stuff.run(query)
    
  • 以上五 步可汇总为一步完成

    llm_replacement_model = OpenAI(temperature=0, 
                                   model='gpt-3.5-turbo-instruct')
    # 可以使用一行代码完成,又或者拆分为五个详细步骤,查看每一步的结果
    response = index.query(query, 
                           llm = llm_replacement_model)
    
  • 自定义向量存储

    index = VectorstoreIndexCreator(
        vectorstore_cls=DocArrayInMemorySearch,
        embedding=embeddings,
    ).from_loaders([loader])
    

    stuff:最常见,把所有文档合并为一个输出
    map_reduce:处理任意数量的文档,并可以并行处理,最终结果可能不理想

    refine:适合处理时间长度,但是答案会比较长

    map_rerank:大模型进行评分,选取最佳

posted on   CharXL  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示