ChatGPT大模型极简应用开辟-CH5-使用 LangChain 框架和插件增强 LLM 的功能 ...

金歌  论坛元老 | 2025-1-25 15:26:35 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1057|帖子 1057|积分 3171

5.1 LangChain 框架

LangChain 是专用于开辟 LLM 驱动型应用程序的框架。该框架还提供了很多额外的功能。
使用以下命令可以快速、简便地安装 LangChain
  1. pip install langchain
复制代码

这些关键模块的作用如下:


  • Models(模型):该模块是由 LangChain 提供的尺度接口,可以通过它与各种 LLM举行交互。LangChain 支持集成 OpenAI、Hugging Face、Cohere、GPT4All 等提供商提供的不同类型的模型;
  • Prompts(提示词):该模块包含很多用于管理提示词的工具;
  • Indexes(索引): Retrieval 模块,能够将 LLM 与你的数据联合使用 ;
  • Chains(链):可以使用该接口创建一个调用序列,将多个模型或提示词组合在一起;
  • Agents(智能体):该模块引入了 Agent 接口。可以处理用户输入、做出决策并选择得当工具来完成使命的组件。它以迭代方式工作,采取一系列举措,直到解决问题;
  • Memory(记忆):该模块让你能够在链调用或智能体调用之间维持状态。默认环境下,链和智能体是无状态的。这意味着它们独立地处理每个传入的请求,就像LLM 一样。
5.1.1 动态提示词

用 OpenAI 模型和 LangChain 来完成一个简单的文本补全使命:
  1. from langchain.chat_models import ChatOpenAI
  2. from langchain import PromptTemplate, LLMChain
  3. template = """
  4.         Question: {question}
  5.         Let's think step by step.
  6.         Answer:
  7.         """
  8. prompt = PromptTemplate(template=template, input_variables=["question"])
  9. llm = ChatOpenAI(model_name="gpt-4")
  10. llm_chain = LLMChain(prompt=prompt, llm=llm)
  11. question = """ What is the population of the capital of the country where the Olympic Games were held in 2016? """
  12. llm_chain.run(question)
复制代码
输出如下:
  1. Step 1: Identify the country where the Olympic Games were held in 2016.
  2. Answer: The 2016 Olympic Games were held in Brazil.
  3. Step 2: Identify the capital of Brazil.
  4. Answer: The capital of Brazil is Brasília.
  5. Step 3: Find the population of Brasília.
  6. Answer: As of 2021, the estimated population of Brasília is around 3.1 million. So, the population of the capital of the country where the Olympic Games were held in 2016 is around 3.1 million. Note that this is an estimate and may vary slightly.'
复制代码
PromptTemplate 负责构建模型的输入,能以可复制的方式天生提示词。它包含一个名为 template 的输入文本字符串,其中的值可以通过 input_variables 举行指定。
提示词和模型由 LLMChain 函数组合在一起,形成包含这两个元素的一条链。末了需要调用 run 函数来请求补全输入问题。当运行 run 函数时,LLMChain 使用提供的输入键值格式化提示词模板,随后将颠末格式化的字符串传递给 LLM,并返回 LLM 输出。模型运用“逐步思考”的技巧自动答复问题,对于复杂的应用程序来说,动态提示词是简单而又颇具代价的功能。
5.1.2 智能体及工具

智能体及工具是 LangChain 框架提供的关键功能:它们可以使应用程序变得非常强盛,让 LLM 能够实行各种操作并与各种功能集成,从而解决复杂的问题。这里所指的“工具”是围绕函数的特定抽象,使语言模型更容易与之交互
工具的接口有一个文本输入和一个文本输出。LangChain 中有很多预界说的工具,包括谷歌搜索、维基百科搜索、Python REPL、计算器、天下天气预报 API 等。除了使用预界说的工具,你还可以构建自界说工具并将其加载到智能体中,这使得智能体非常灵活和强盛。
智能体安排的步调如下所述。

  • 智能体收到来自用户的输入。
  • 智能体决定要使用的工具(如果有的话)和要输入的文本。
  • 使用该输入文本调用相应的工具,并从工具中接收输出文本。
  • 将输出文本输入到智能体的上下文中。
  • 重复实行步调 2 ~步调 4,直到智能体决定不再需要使用工具。此时,它将直接回应用户。

假如问以下问题:2016 年奥运会举办国首都的生齿的平方根是多少?这个问题并没有特殊的含义,但它很好地展示了LangChain 智能体及工具如何进步 LLM 的推理本领。如果将问题原封不动地抛给 GPT-3.5 Turbo,得到以下答复
  1. The capital of the country where the Olympic Games were held in 2016 is Rio de Janeiro, Brazil. The population of Rio de Janeiro is approximately 6.32 million people as of 2021. Taking the square root of this population, we get approximately 2,513.29. Therefore, the square root of the population of the capital of the country where the Olympic Games were held in 2016 is approximately 2,513.29.
复制代码
上述答复至少有两处错误:


  • 巴西的首都是巴西利亚,而不是里约热内卢;


    • 6 320 000 的平方根约等于 2513.96,而不是 2513.29。

可以通过运用“逐步思考”或其他提示工程技巧来获得更好的结果,但由于模型在推理和数学运算方面存在困难,因此很难相信结果是准确的。使用LangChain 可以给我们更好的准确性包管。
LangChain 智能体可以使用两个工具:维基百科搜索和计算器。
在通过 load_tools 函数创建工具之后,使用initialize_agent 函数创建智能体。智能体的推理功能需要用到一个LLM,本例使用的是 gpt-3.5-turbo。参数ZERO_SHOT_REACT_DESCRIPTION 界说了智能体如何在每一步中选择工具。通过将 verbose 的值设置为 True,可以查看智能体的推理过程,并明确它是如何做出终极决策的。
  1. from langchain.agents import load_tools, initialize_agent, AgentType
  2. llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
  3. tools = load_tools(["wikipedia", "llm-math"], llm=llm)
  4. agent = initialize_agent(
  5.     tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
  6.     verbose=True
  7. )
  8. question = """
  9.         What is the square root of the population of the capital
  10.         of the Country where the Olympic Games were held in 2016?"""
  11. agent.run(question)
复制代码
在使用维基百科搜索工具之前,可以使用 pip install wikipedia 来安装这个包。
  1. > Entering new chain...
  2. I need to find the country where the Olympic Games were held in 2016
  3. and then find the population of its capital city. Then I can take the
  4. square root of that population.
  5. Action: Wikipedia
  6. Action Input: "2016 Summer Olympics"
  7. Observation: Page: 2016 Summer Olympics
  8. [...]
复制代码
输出的下一行包含维基百科关于奥运会的摘录。智能体使用维基百科搜索工具又举行了两次额外的操作
  1. Thought:I need to search for the capital city of Brazil.
  2. Action: Wikipedia
  3. Action Input: "Capital of Brazil"
  4. Observation: Page: Capitals of Brazil
  5. Summary: The current capital of Brazil, since its construction in
  6. 1960, is Brasilia. [...]
  7. Thought: I have found the capital city of Brazil, which is Brasilia. Now I need to find the population of Brasilia.
  8. Action: Wikipedia
  9. Action Input: "Population of Brasilia"
  10. Observation: Page: Brasilia
  11. [...]
复制代码
下一步,智能体使用计算器工具:
  1. Thought: I have found the population of Brasilia, but I need to
  2. calculate the square root of that population.
  3. Action: Calculator
  4. Action Input: Square root of the population of Brasilia (population: found in previous observation)
  5. Observation: Answer: 1587.051038876822
复制代码
得出终极答案:
  1. Thought: I now know the final answer
  2. Final Answer: The square root of the population of the capital of the country where the Olympic Games were held in 2016 is approximately 1587.
  3. > Finished chain.
复制代码
正如你所见,该智能体展示了较强的推理本领:在得出终极答案之前,它完成了 4 个步调。LangChain 框架使开辟人员能够仅用几行代码就实现这种推理本领。
5.1.3 记忆

在某些应用程序中,记住之前的交互是至关重要的,无论是短期记忆照旧长期记忆。使用 LangChain,可以轻松地为链和智能体添加状态以管理记忆。构建聊天机器人是这种本领最常见的用例。在 LangChain 中,可以使用 ConversationChain 很快地完成这个过程,只需几行代码即可将语言模型转换为聊天工具。
以下代码使用 text-ada-001 模型创建一个聊天机器人。这是一个只能实行根本使命的小模型。只需几行LangChain 代码,即可使用这个简单的文本补全模型开始聊天:
  1. from langchain import OpenAI, ConversationChain
  2. chatbot_llm = OpenAI(model_name='text-ada-001')
  3. chatbot = ConversationChain(llm=chatbot_llm , verbose=True)
  4. chatbot.predict(input='Hello')
复制代码
末了一行实行了 predict(input='Hello')。这要求聊天机器人回复我们的 ‘Hello’ 消息。模型的答复如下所示:
  1. > Entering new ConversationChain chain...
  2. Prompt after formatting:
  3. The following is a friendly conversation between a human and an
  4. AI. The AI is talkative and provides lots of specific details from
  5. its context. If the AI does not know the answer to a question, it
  6. truthfully says it does not know.
  7. Current conversation:
  8. Human: Hello
  9. AI:
  10. > Finished chain.
  11. ' Hello! How can I help you?'
复制代码
由于将 ConversationChain 中的 verbose 设置为 True,因此可以查看 LangChain 使用的完备提示词。当实行predict(input='Hello') 时,text-ada-001 模型收到的不仅仅是’Hello’ 消息,而是完备的提示词。该提示词位于标签> Entering new ConversationChain chain...和> Finished chain之间。
如果继承对话,会发现该函数在提示词中生存了对话的历史记录。如果接着问模型是不是 AI,那么这个问题也将被包含在提示词中:
  1. > Entering new ConversationChain chain...
  2. Prompt after formatting:
  3. The following [...] does not know.
  4. Current conversation:
  5. Human: Hello
  6. AI: Hello! How can I help you?
  7. Human: Can I ask you a question? Are you an AI?
  8. AI:
  9. > Finished chain.
  10. '\n\nYes, I am an AI.'
复制代码
ConversationChain 对象使用提示工程技巧和记忆技巧,将举行文本补全的 LLM 转换为聊天工具。
5.1.4 嵌入

将语言模型与你本身的文本数据相联合,这样做有助于将应用程序所用的模型知识个性化。首先检索信息,即获取用户的查询并返回最干系的文档;然后将这些文档发送到模型的输入上下文中,以便它相应查询。
document_loaders 是 LangChain 中的一个重要模块。通过这个模块可以快速地将文本数据从不同的来源加载到应用程序中。比如,应用程序可以加载 CSV 文件、电子邮件、PowerPoint 文档、Evernote 笔记、Facebook 聊天记录、HTML 页面、PDF 文件和很多其他格式
  1. from langchain.document_loaders import PyPDFLoader
  2. loader = PyPDFLoader("ExplorersGuide.pdf")
  3. pages = loader.load_and_split()
复制代码
在使用 PDF 加载器之前,需要安装 pypdf 包。这可以通过 pip install pypdf 来完成。
举行信息检索时,需要嵌入每个加载的页面。在信息检索中,嵌入是用于将非数值概念(如单词、标记和句子)转换为数值向量的一种技术。这些嵌入使得模型能够高效地处理这些概念之间的关系。借助 OpenAI 的嵌入端点,开辟人员可以获取输入文本的数值向量表示。此外,LangChain 提供了一个包装器来调用这些嵌入,如下所示。
  1. from langchain.embeddings import OpenAIEmbeddings
  2. embeddings = OpenAIEmbeddings()
复制代码
要使用 OpenAIEmbeddings,先使用 pip install tiktoken 安装 tiktoken 包
LangChain 以向量数据库为中央。有很多向量数据库可供选择,详见 LangChain 文档。以下代码片段使用Faiss 向量数据库,这是一个重要由 Facebook AI 团队开辟的相似性搜索库:
  1. from langchain.vectorstores import FAISS
  2. db = FAISS.from_documents(pages, embeddings)
复制代码
使用 Faiss 向量数据库之前,需要使用 pip install faiss-cpu 命令安装 faiss-cpu 包。

搜索相似内容:
  1. q = "What is Link's traditional outfit color?"
  2. db.similarity_search(q)[0]
复制代码
得到以下内容:
  1. Document(
  2.     page_content='While Link’s traditional green tunic is certainly an iconic look, his wardrobe has expanded [...] Dress for Success',
  3.     metadata={'source': 'ExplorersGuide.pdf', 'page': 35})
复制代码
这个问题的答案是Link 的服装颜色是绿色。可以看到,答案就在选定的内容中。输出显示,答案在 ExplorersGuide.pdf 的第 35 页。Python 从 0 开始计数。因此,如果查看原始 PDF 文件,会发现答案在第 36 页,而非第 35 页。

使用 RetrievalQA,它接受 LLM 和向量数据库作为输入。然后,像往常一样向所获得的对象提问
  1. from langchain.chains import RetrievalQA
  2. from langchain import OpenAI
  3. llm = OpenAI()
  4. chain = RetrievalQA.from_llm(llm=llm, retriever=db.as_retriever())
  5. q = "What is Link's traditional outfit color?"
  6. chain(q, return_only_outputs=True)
复制代码
得到以下答案:
  1. {'result': " Link's traditional outfit color is green."}
复制代码
“提供上下文”将信息检索系统找到的页面和用户最初的查询举行分组。然后,上下文被发送给 LLM。LLM 可以使用上下文中的附加信息正确答复用户的问题

5.2 GPT-4 插件

在 AI 的发展过程中,插件已经成为一种新型的革命性工具,它重新界说了我们与 LLM 的互动方式。插件的目标是为 LLM 提供更广泛的功能,使 LLM 能够访问实时信息,举行复杂的数学运算,并使用第三方服务。
比如当需要举行计算时,模型会自动调用计算器,从而得到正确的结果。

通过迭代部署方法,OpenAI 逐步向 GPT-4 添加插件,这使得 OpenAI 能够考虑插件的现实用途及可能引入的安全问题和定制化挑战。OpenAI 的目标是创建一个生态系统,插件可以帮助塑造 AI 与人类互动的将来。每家企业都需要有本身的插件。事实上,Expedia、FiscalNote、Instacart、KAYAK、Klarna、Milo、OpenTable、Shopify 和 Zapier 等公司已经率先推出了几款插件。
比如,插件可以使 LLM 检索体育比分和股票价格等实时信息,从企业文档等知识库中提取数据,并根据用户的需求实行使命,如预订航班或订餐。两者都旨在帮助AI 获取最新信息并举行计算。然而,GPT-4 中的插件更专注于第三方服务,而不是 LangChain 工具。
5.2.1 概述

当你开始与 GPT-4 举行交互时,OpenAI 会向 GPT-4 发送一条隐藏消息,以检查你的插件是否已安装。这条消息会扼要先容你的插件,包括其形貌信息、端点和示例。
模型就成了智能的 API 调用者。当用户询问关于插件的问题时,模型可以调用你的插件 API。是否调用插件是基于 OpenAPI 规范和关于应该使用 API 的环境的天然语言形貌所做出的决策。一旦模型决定调用你的插件,它就会将 API 的结果归并到上下文中,以向用户提供相应。因此,插件的 API 相应必须返回原始数据而不是天然语言相应。这使得GPT-4 可以根据返回的数据天生本身的天然语言相应。
如果用户问模型“我在北京可以住那里”,那么模型可以使用酒店预订插件,然后将插件的 API 相应与其文本天生本领联合起来,提供既含有丰富信息又对用户友爱的答复。
5.2.2 API

OpenAI 在 GitHub 上提供的待办事项列表界说插件的简化版本:
  1. import quart
  2. import quart_cors
  3. from quart import request
  4. app = quart_cors.cors(
  5.     quart.Quart(__name__), allow_origin="https://chat.openai.com"
  6. )
  7. # 跟踪待办事项
  8. _TODOS = {}
  9. @app.post("/todos/<string:username>")
  10. async def add_todo(username):
  11.     request = await quart.request.get_json(force=True)
  12.     if username not in _TODOS:
  13.         _TODOS[username] = []
  14.         _TODOS[username].append(request["todo"])
  15.     return quart.Response(response="OK", status=200)
  16. @app.get("/todos/<string:username>")
  17. async def get_todos(username):
  18.     return quart.Response(
  19.         response=json.dumps(_TODOS.get(username, [])), status=200
  20.     )
  21. @app.get("/.well-known/ai-plugin.json")
  22. async def plugin_manifest():
  23.     host = request.headers["Host"]
  24.     with open("./.well-known/ai-plugin.json") as f:
  25.         text = f.read()
  26.         return quart.Response(text, mimetype="text/json")
  27. @app.get("/openapi.yaml")
  28. async def openapi_spec():
  29.     host = request.headers["Host"]
  30.     with open("openapi.yaml") as f:
  31.         text = f.read()
  32.         return quart.Response(text, mimetype="text/yaml")
  33. def main():
  34.     app.run(debug=True, host="0.0.0.0", port=5003)
  35. if __name__ == "__main__":
  36.     main()
复制代码
这段 Python 代码是一个简单的插件示例,用于管理待办事项列表。首先,变量 app 被初始化为 quart_cors.cors()。这行代码创建了一个新的 Quart 应用程序,并设置它允许来自 https://chat.openai.com 的跨源资源共享(cross-origin resource sharing,CORS)。Quart 是一个Python Web 微框架,Quart-CORS 则是一个扩展,可以控制 CORS。这个设置允许插件与指定 URL 上托管的 ChatGPT 应用程序举行交互。然后,代码界说了几个 HTTP 路由,分别对应待办事项列表界说插件的不同功能:


  • add_todo 函数与 POST 请求干系联
  • get_todos 函数与 GET请求干系联
接着,代码界说了两个额外的端点:plugin_manifest 和openapi_spec。这两个端点分别用于提供插件清单文件和 OpenAPI 规范,这对于 GPT-4 和插件之间的交互至关重要。这些文件包含有关插件及其 API 的详细信息,GPT-4 使用这些信息来了解何时及如何使用插件。
5.2.3 插件清单

每个插件都需要在 API 域上有一个 ai-plugin.json 文件。举例来说,如果你的公司在 iTuring.cn 上提供服务,那么必须将此文件放在iTuring.cn/.well-known/ 下。在安装插件时,OpenAI 将按照路径/.well-known/ai-plugin.json 查找此文件。如果没有该文件,则无法安装插件。
以下是 ai-plugin.json 文件的极简界说:
  1. {
  2.      "schema_version": "v1",
  3.      "name_for_human": "TODO Plugin",
  4.      "name_for_model": "todo",
  5.      "description_for_human": "Plugin for managing a TODO list. You can add, remove and view your TODOs.",
  6.      "description_for_model": "Plugin for managing a TODO list. You can add, remove and view your TODOs.",
  7.      "auth": {
  8.          "type": "none"
  9.      },
  10.      "api": {
  11.          "type": "openapi",
  12.          "url": "http://localhost:3333/openapi.yaml",
  13.          "is_user_authenticated": false
  14.      },
  15.      "logo_url": "http://localhost:3333/logo.png",
  16.      "contact_email": "support@thecompany.com",
  17.      "legal_info_url": "http://thecompany-url/legal"
  18. }
复制代码


5.2.4 OpenAPI 规范

创建插件的下一步是创建 openapi.yaml 文件。该文件必须遵循 OpenAPI尺度。GPT 模型只通过此文件和插件清单文件中的详细信息来了解你的 API。
以下是一个示例,包含待办事项列表界说插件的 openapi.yaml 文件的第一行
  1. openapi: 3.0.1
  2. info:
  3.         title: TODO Plugin
  4.         description: A plugin that allows the user to create and manage a TODO list using ChatGPT. If you do not know the user s username, ask them first before making queries to the plugin. Otherwise, use the username "global".
  5.         version: 'v1'
  6. servers:
  7.          - url: http://localhost:5003
  8. paths:
  9.         /todos/{username}:
  10.                 get:
  11.                         operationId: getTodos
  12.                         summary: Get the list of todos
  13.                         parameters:
  14.                         - in: path
  15.                                 name: username
  16.                                 schema:
  17.                                         type: string
  18.                                 required: true
  19.                                 description: The name of the user.
  20.                         responses:
  21.                                 "200":
  22.                                 description: OK
  23.                                 content:
  24.                         application/json:
  25.                                 schema:
  26.                                         $ref: '#/components/schemas/getTodosResponse'
  27. [...]
复制代码
可以将 OpenAPI 规范视为形貌性文档,它足以明确和使用 API。在 GPT-4中举行搜索时,使用 info 部分中的形貌来确定插件与搜索内容的干系性。OpenAPI 规范的其余内容遵循尺度的 OpenAPI 格式。很多工具可以根据现有的 API 代码自动天生 OpenAPI 规范。
5.2.5 形貌

当插件有助于相应用户请求时,模型会扫描 OpenAPI 规范中的端点形貌及插件清单文件中的description_for_model 字段。目标是创建最符合的相应,这通常涉及测试不同的请求和形貌。OpenAPI 文档应该提供关于 API 的各种细节,比如可用的函数及其参数。它还应包含特定于属性的形貌字段,提供有代价的表明,说明每个函数的作用及查询字段期望的信息类型。**关键要素是 description_for_model 字段,强烈建议为该字段创建简明、清晰和形貌性强的说明。**在撰写形貌时,必须遵循以下最佳实践:


  • 不要试图影响 GPT 的“感情”、个性或确切回应
  • 制止指示 GPT 使用特定的插件,除非用户明确要求使用该类别的服务
  • 不要为 GPT 指定特定的触发器来使用插件,因为它旨在自主确定何时使用插件
5.3 小结

LangChain 框架和 GPT-4 插件有助于大幅提升 LLM 的潜力。凭借其强盛的工具和模块套件,LangChain 已成为 LLM 领域的核心框架。它在集成不同模型、管理提示词、组合数据、为链排序、处理智能体和管理记忆等方面的多功能性为开辟人员和 AI 爱好者开辟了新的门路。使用 GPT-4 和 ChatGPT 从头开始编写复杂指令存在局限性。**LangChain 的真正潜力在于创造性地使用各种功能来解决复杂问题,并将通用语言模型转化为功能强盛且具体的应用程序。**GPT-4 插件是语言模型和实时可用的上下文信息之间的桥梁。
5.4 总结

可以在 AI 领域中进一步开拓,开辟使用这些先辈语言模型的应用程序。但请记住,AI 领域的发展是动态的,要时刻关注希望并相应地举行调解。进入 LLM 天下只是开始,探索不应止步于此。鼓励使用新知识探索 AI 技术的将来。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表