当前位置:   article > 正文

【吴恩达deeplearning.ai】基于LangChain开发大语言应用模型(下)_vectorstoreindexcreator import

vectorstoreindexcreator import

以下内容均整理来自deeplearning.ai的同名课程

Location 课程访问地址

DLAI - Learning Platform Beta (deeplearning.ai)

 LangChain for LLM Application Development 基于LangChain开发大语言应用模型(上)

一、LangChain: Q&A over Documents基于文档的检索问答

langchain具有检索能力,可以通过检索用户提供的文档内容,进行相应的回答。以下具体讲解实现逻辑

技术原理

1、【准备阶段】将文档内容(如列表)拆分成多个分片

2、【准备阶段】将分片通过embed技术转换为空间向量数组

3、【提问阶段】用户提问时,程序自动将提问内容embed为空间向量

4、【提问阶段】将提问的空间向量和文档生成的空间向量数组比较,找到最相似的几个

5、 【回答阶段】根据对应相关的文档切片,通过大预言模型,得到最终结果

实现方式1(检索csv进行回答)

  1. from langchain.chains import RetrievalQA
  2. from langchain.chat_models import ChatOpenAI
  3. from langchain.document_loaders import CSVLoader
  4. from langchain.vectorstores import DocArrayInMemorySearch
  5. from IPython.display import display, Markdown
  6. # 安装包
  7. file = 'OutdoorClothingCatalog_1000.csv'
  8. loader = CSVLoader(file_path=file)
  9. # 加载文件
  10. from langchain.indexes import VectorstoreIndexCreator
  11. index = VectorstoreIndexCreator(
  12. vectorstore_cls=DocArrayInMemorySearch
  13. ).from_loaders([loader])
  14. # 将文件内容,转换成空间向量组
  15. query ="Please list all your shirts with sun protection \
  16. in a table in markdown and summarize each one."
  17. response = index.query(query)
  18. display(Markdown(response))
  19. # 基于问题和空间向量的相似度,找到对应相关的内容进行回答。(通过markdown转换文本到表格)

实现方式2(检索docs进行回答)

  1. # -------------------- 单个内容转换空间向量 --------------------
  2. from langchain.embeddings import OpenAIEmbeddings
  3. embeddings = OpenAIEmbeddings()
  4. # 加载包
  5. embed = embeddings.embed_query("Hi my name is Harrison")
  6. print(len(embed))
  7. print(embed[:5])
  8. # 将提问内容,转换为空间向量
  9. # [-0.021913960576057434, 0.006774206645786762, -0.018190348520874977, -0.039148248732089996, -0.014089343138039112]
  10. # ---------------- 在文档中检索相关内容进行解答 -----------------
  11. db = DocArrayInMemorySearch.from_documents(
  12. docs,
  13. embeddings)
  14. # 基于需要检索的文档,分片转换为空间向量组
  15. query = "Please suggest a shirt with sunblocking"
  16. docs = db.similarity_search(query)
  17. len(docs)
  18. docs[0]
  19. # 在文档生成的空间向量组中检索和提问相关的内容
  20. llm = ChatOpenAI(temperature = 0.0)
  21. # 创建一个大语言进程
  22. qdocs = "".join([docs[i].page_content for i in range(len(docs))])
  23. response = llm.call_as_llm(f"{qdocs} Question: Please list all your \
  24. shirts with sun protection in a table in markdown and summarize each one.")
  25. display(Markdown(response))
  26. # 将文档中相关的内容+提问内容,通过llm进程获取解答

检索器

langchain支持直接通过标准检索器模板,进行内容检索。以下是一些检索器介绍。

 1、stuff检索器直接将全文内容压缩,并通过语言模型进行回答。压缩过程中,可能导致信息缺失。

2、其他检索器:就不一一介绍了,看图理解

3、stuff检索器代码实现

  1. from langchain.chains import RetrievalQA
  2. from langchain.chat_models import ChatOpenAI
  3. from langchain.document_loaders import CSVLoader
  4. from langchain.vectorstores import DocArrayInMemorySearch
  5. from IPython.display import display, Markdown
  6. # 加载包
  7. file = 'OutdoorClothingCatalog_1000.csv'
  8. loader = CSVLoader(file_path=file)
  9. docs = loader.load()
  10. # 加载docs
  11. from langchain.embeddings import OpenAIEmbeddings
  12. embeddings = OpenAIEmbeddings()
  13. db = DocArrayInMemorySearch.from_documents(
  14. docs,
  15. embeddings
  16. )
  17. # 转换空间向量组
  18. retriever = db.as_retriever()
  19. # 基于空间向量组,创建检索器
  20. qa_stuff = RetrievalQA.from_chain_type(
  21. llm=llm,
  22. chain_type="stuff",
  23. retriever=retriever,
  24. verbose=True
  25. )
  26. # 创建会话
  27. query = "Please list all your shirts with sun protection in a table \
  28. in markdown and summarize each one."
  29. response = qa_stuff.run(query)
  30. # 生成回答

 二、Evaluation评估

langchain支持基于内容生成QA问答对,也支持评估已有的QA问答对,相对于实际内容的准确程度。

Outline:概要内容

  • Example generation 示例生成
  • Manual evaluation (and debuging) 人工评估
  • LLM-assisted evaluation 大语言模型辅助评估

Create our QandA application 创建一个基于stuff检索的会话

  1. from langchain.chains import RetrievalQA
  2. from langchain.chat_models import ChatOpenAI
  3. from langchain.document_loaders import CSVLoader
  4. from langchain.indexes import VectorstoreIndexCreator
  5. from langchain.vectorstores import DocArrayInMemorySearch
  6. # 加载包
  7. file = 'OutdoorClothingCatalog_1000.csv'
  8. loader = CSVLoader(file_path=file)
  9. data = loader.load()
  10. # 加载数据
  11. index = VectorstoreIndexCreator(
  12. vectorstore_cls=DocArrayInMemorySearch
  13. ).from_loaders([loader])
  14. # 基于数据创建向量空间组
  15. llm = ChatOpenAI(temperature = 0.0)
  16. qa = RetrievalQA.from_chain_type(
  17. llm=llm,
  18. chain_type="stuff",
  19. retriever=index.vectorstore.as_retriever(),
  20. verbose=True,
  21. chain_type_kwargs = {
  22. "document_separator": "<<<<>>>>>"
  23. }
  24. )
  25. # 创建一个基于stuff检索的会话

Hard-coded examples手工编写QA示例

  1. examples = [
  2. {
  3. "query": "Do the Cozy Comfort Pullover Set\
  4. have side pockets?",
  5. "answer": "Yes"
  6. },
  7. {
  8. "query": "What collection is the Ultra-Lofty \
  9. 850 Stretch Down Hooded Jacket from?",
  10. "answer": "The DownTek collection"
  11. }
  12. ]

LLM-Generated examples通过大语言模型生成QA示例

  1. from langchain.evaluation.qa import QAGenerateChain
  2. # 加载包
  3. example_gen_chain = QAGenerateChain.from_llm(ChatOpenAI())
  4. # 创建QA生成链
  5. new_examples = example_gen_chain.apply_and_parse(
  6. [{"doc": t} for t in data[:5]]
  7. )
  8. # 基于数据内容生成QA示例

Combine examples合并人工示例和大语言模型生成的示例

  1. examples += new_examples
  2. # 合并

Manual Evaluation人工评估

  1. import langchain
  2. langchain.debug = True
  3. # 加载包
  4. qa.run(examples[0]["query"])
  5. # 生成示例提问的AI答案(用于印证)
  6. langchain.debug = False

LLM assisted evaluation大语言模型辅助评估

  1. predictions = qa.apply(examples)
  2. # 对所有的示例基于大语言模型,生成回答
  3. from langchain.evaluation.qa import QAEvalChain
  4. llm = ChatOpenAI(temperature=0)
  5. eval_chain = QAEvalChain.from_llm(llm)
  6. # 创建评估链
  7. graded_outputs = eval_chain.evaluate(examples, predictions)
  8. # 对示例问题和回答进行评估
  9. for i, eg in enumerate(examples):
  10. print(f"Example {i}:")
  11. print("Question: " + predictions[i]['query'])
  12. print("Real Answer: " + predictions[i]['answer'])
  13. print("Predicted Answer: " + predictions[i]['result'])
  14. print("Predicted Grade: " + graded_outputs[i]['text'])
  15. print()
  16. # 显示评估结果

三、 Agents代理

大语言模型一般来说并不能完成用于知识的问答(因为其知识是被压缩的,不完整),而更适合作为一个可以链接和调用工具的真人。

我们只要提供给大语言模型一些工具和信息,他就能更好的帮助我们处理特定问题

Outline:概要

  • Using built in LangChain tools: DuckDuckGo search and Wikipedia使用langchain提供的工具
  • Defining your own tools自定义工具

Built-in LangChain tools使用自带工具

  1. from langchain.agents.agent_toolkits import create_python_agent
  2. from langchain.agents import load_tools, initialize_agent
  3. from langchain.agents import AgentType
  4. from langchain.tools.python.tool import PythonREPLTool
  5. from langchain.python import PythonREPL
  6. from langchain.chat_models import ChatOpenAI
  7. # 加载包
  8. llm = ChatOpenAI(temperature=0)
  9. tools = load_tools(["llm-math","wikipedia"], llm=llm)
  10. # 创建一个工具箱
  11. agent= initialize_agent(
  12. tools,
  13. llm,
  14. agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
  15. handle_parsing_errors=True,
  16. verbose = True)
  17. # 创建一个代理,加载工具箱。
  18. agent("What is the 25% of 300?")
  19. # 调用代理回答问题,代理会自动识别此问题需要调用math数学计算,并调用计算函数获得结果
  20. question = "Tom M. Mitchell is an American computer scientist \
  21. and the Founders University Professor at Carnegie Mellon University (CMU)\
  22. what book did he write?"
  23. result = agent(question)
  24. # 调用代理回答问题,代理会自动判断此问题需要调用wiki百科页面,获取相关百科的词条信息,并基于词条信息,生成最终的答案

Python Agent使用python代理工具

  1. agent = create_python_agent(
  2. llm,
  3. tool=PythonREPLTool(),
  4. verbose=True
  5. )
  6. # 创建一个python代理
  7. customer_list = [["Harrison", "Chase"],
  8. ["Lang", "Chain"],
  9. ["Dolly", "Too"],
  10. ["Elle", "Elem"],
  11. ["Geoff","Fusion"],
  12. ["Trance","Former"],
  13. ["Jen","Ayai"]
  14. ]
  15. agent.run(f"""Sort these customers by \
  16. last name and then first name \
  17. and print the output: {customer_list}""")
  18. # 运行代理,代理会自动判断完成词任务需要用到sorted()方法,进行如下计算sorted_customers = sorted(customers, key=lambda x: (x[1], x[0])),并最终获得结果。
  19. langchain.debug=True
  20. agent.run(f"""Sort these customers by \
  21. last name and then first name \
  22. and print the output: {customer_list}""")
  23. langchain.debug=False
  24. # 可以通过debug查看具体的运行细节

Define your own tool自定义工具

  1. from langchain.agents import tool
  2. from datetime import date
  3. # 加载包
  4. @tool
  5. def time(text: str) -> str:
  6. """Returns todays date, use this for any \
  7. questions related to knowing todays date. \
  8. The input should always be an empty string, \
  9. and this function will always return todays \
  10. date - any date mathmatics should occur \
  11. outside this function."""
  12. return str(date.today())
  13. # 自定义函数工具
  14. agent= initialize_agent(
  15. tools + [time],
  16. llm,
  17. agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
  18. handle_parsing_errors=True,
  19. verbose = True)
  20. # 创建代理,调用自定义函数工具
  21. try:
  22. result = agent("whats the date today?")
  23. except:
  24. print("exception on external access")

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/643551
推荐阅读
相关标签
  

闽ICP备14008679号