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."
-
- 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:大模型进行评分,选取最佳
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!