龙空技术网

【17】利用LangChain让AI做决策

ChatGPT扫地僧 585

前言:

而今大家对“用户订单号”都比较关切,咱们都想要学习一些“用户订单号”的相关知识。那么小编也在网上网罗了一些对于“用户订单号””的相关文章,希望小伙伴们能喜欢,咱们一起来学习一下吧!

Hi,大家好。

在第 11 讲中,我向您介绍了如何将各种资料内容向量化,借助Llama-index建立索引,对我们自己的文本资料进行问答。在过去的3讲中,我们深入了解了如何使用Langchain。该工具可帮助我们整合AI对语言的理解和组织能力、外部各种资料或者SaaS的API,以及您自己编写的代码。通过整合这些功能,我们可以使用自然语言完成更复杂的任务,而不仅仅是闲聊。我们深入了解了如何使用Langchain。该工具可帮助我们整合AI对语言的理解和组织能力、外部各种资料或者SaaS的API,以及您自己编写的代码。通过整合这些功能,我们可以使用自然语言完成更复杂的任务,而不仅仅是闲聊。

<!-- more -->

但到目前为止,我们所有基于ChatGPT的应用基本上都是“单项技能”,例如前面关于“藤野先生”的问题或上一讲中查询最新天气或通过Python进行算术运算。这本质上是限制AI只针对我们预先索引或实时搜索的数据进行回答。

给AI加上多项选择能力

要做一个能跑在生产环境上的 AI 聊天机器人,需要的不止一个技能。在电商领域,最起码需要以下三个技能:

“导购咨询”:查询商品信息为用户做导购和推荐。“售中咨询”:查询订单的物流轨迹,对买了东西还没有收到货的用户给出安抚和回复。“FAQ”:索引电商网站的 FAQ,回复用户有关退货政策、运费、支付方式等问题的答案。

AI 需要自己判断什么时候该用什么样的技能,而不是需要人工介入或写一堆 if…else 的代码。

采用 “分而治之” 的思路,对于每一个单项技能,可以把它们变成一个 LLMChain。对于用户问的问题,可以让 AI 选择使用哪一个 LLMChain 来回答问题。

下面是一段代码,通过提示语让 AI 做一个选择题。

  import openai, os  openai.api_key = os.environ.get("OPENAI_API_KEY")  from langchain.prompts import PromptTemplate from langchain.llms import OpenAIChat from langchain.chains import LLMChain  llm = OpenAIChat(max_tokens=2048, temperature=0.5) multiple_choice = """ 请针对 >>> 和 <<< 中间的用户问题,选择一个合适的工具去回答她的问题。只要用A、B、C的选项字母告诉我答案。 如果你觉得都不合适,就选D。  >>>{question}<<<  我们有的工具包括: A. 一个能够查询商品信息,为用户进行商品导购的工具 B. 一个能够查询订单信息,获得最新的订单情况的工具 C. 一个能够搜索商家的退换货政策、运费、物流时长、支付渠道、覆盖国家的工具 D. 都不合适 """ multiple_choice_prompt = PromptTemplate(template=multiple_choice, input_variables=["question"]) choice_chain = LLMChain(llm=llm, prompt=multiple_choice_prompt, output_key="answer") 

对应的,我们可以试试问不同的问题,看看它能不能选择一个正确的工具。

问题 1:

 question = "我想买一个iPhone,但是不知道哪个款式好,你能帮我推荐一下吗?" print(choice_chain(question))

输出结果:

 {'question': '我想买一个iPhone,但是不知道哪个款式好,你能帮我推荐一下吗?', 'answer': 'A. 一个能够查询商品信息,为用户进行商品导购的工具'} 

问题 2:

 question = "我有一张订单,订单号是 2023Y06M11D,一直没有收到,能麻烦帮我查一下吗?" print(choice_chain(question))

输出结果:

 {'question': '我有一张订单,订单号是 2023Y06M11D,一直没有收到,能麻烦帮我查一下吗?', 'answer': 'B. 一个能够查询订单信息,获得最新的订单情况的工具'}

问题 3:

 question = "请问你们的货,能送到格尔木吗?大概需要几天?" print(choice_chain(question)) 

输出结果:

 {'question': '请问你们的货,能送到格尔木吗?大概需要几天?', 'answer': 'C. 一个能够搜索商家的退换货政策、运费、物流时长、支付渠道、覆盖国家的工具。'} 

问题 4:

 question = "今天会不会下雨啊?" print(choice_chain(question))

输出结果:

 {'question': '今天会不会下雨啊?', 'answer': 'D. 都不合适。这个问题需要使用天气预报工具来回答。'}

我们试验了四个问题,ChatGPT都给出了准确答案。得到答案后,您可以使用TransformChain直接匹配返回结果的前缀,以确定后续调用哪个LLMChain。

Langchain中 的Agent

在真实的业务场景中,你一定会遇到“分治法”的思路。无论是哪行哪业的客服聊天机器人,都会有能够直接通过资料库回答的用户问题,也会有和用户自己或公司产品相关的信息,需要通过检索的方式提供。因此,Langchain将这种“先做一个选择题”的思路推广,并建立了Agent这个抽象概念。

Agent有两个中文翻译,一个是代理人,比如在美国买房或租房,都要通过“房产代理”,也就是Real Estate Agent。另一个意思是“特工”,指的是Agent具有自主行动能力,能够直接使用提供的工具采取行动。它不仅仅是做完选择题就完事了,而是直接拿起选中的工具并进行下一步的行动。Langchain的Agent实际上包含这两个意思,可以说名字取得非常得当。

接下来我们看看如何通过Langchain提供的Agent直接采取行动来解决上面的例子。

 from langchain.agents import initialize_agent, Tool from langchain.llms import OpenAI  llm = OpenAI(temperature=0)  def search_order(input: str) -> str:     return "订单状态:已发货;发货日期:2023-01-01;预计送达时间:2023-01-10"  def recommend_product(input: str) -> str:     return "iPhone 15 Pro"  def faq(intput: str) -> str:     return "7天无理由退货"  tools = [     Tool(         name = "Search Order",func=search_order,          description="useful for when you need to answer questions about customers orders"    ),     Tool(name="Recommend Product", func=recommend_product,           description="useful for when you need to answer questions about product recommendations"    ),     Tool(name="FAQ", func=faq,          description="useful for when you need to answer questions about shopping policies, like return policy, shipping policy, etc."    ) ]  agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)

这段代码分为三个部分:

定义三个函数: search_orderrecommend_productfaq,它们的输入都是字符串,输出是我们编写的回答。创建Tool对象数组,它包含三个Tool对象,每个Tool对象都封装了一个函数,并定义了一个名称和描述。这个描述告诉AI这个Tool的作用,AI会根据问题和描述来选择Tool创建一个agent对象,指定使用哪些Tool、LLM对象和agent类型。在这里,我们选择了 zero-shot-react-description类型,这意味着AI将根据自己的推理能力进行决策,并采取行动。React是指根据Tool的描述进行推理和行动。

React并不是来自Facebook的前端框架的名字,而是来自一篇Google Brain的论文。有兴趣的话,可以去阅读一下,了解具体的原理和思路。

有了这个agent之后,我们可以尝试重新问一遍之前的三个问题。

问题 1:

 question = "我想买一个iPhone,但是不知道哪个款式好,你能帮我推荐一下吗?" result = agent.run(question) print(result)

输出结果:

 > Entering new AgentExecutor chain...  I need to recommend a product. Action: Recommend Product Action Input: iPhone Observation: iPhone 15 Pro Thought: I now know the final answer. Final Answer: 我推荐iPhone 15 Pro。  > Finished chain. 我推荐iPhone 15 Pro。

问题 2:

 question = "我有一张订单,订单号是 2023Y06M11D,一直没有收到,能麻烦帮我查一下吗?" result = agent.run(question) print(result)

输出结果:

 > Entering new AgentExecutor chain...  I need to find out the status of this order. Action: Search Order Action Input: 2023Y06M11D Observation: 订单状态:已发货;发货日期:2023-01-01;预计送达时间:2023-01-10 Thought: I now know the status of the order. Final Answer: 您的订单号为2023Y06M11D,已于2023-01-01发货,预计于2023-01-10送达。  > Finished chain. 您的订单号为2023Y06M11D,已于2023-01-01发货,预计于2023-01-10送达。

问题 3:

 question = "请问你们的货,能送到格尔木吗?大概需要几天?" result = agent.run(question) print(result)

输出结果:

 > Entering new AgentExecutor chain...  I need to know the shipping policy Action: FAQ Action Input: Shipping policy Observation: 7天无理由退货 Thought: I need to know the shipping time Action: FAQ Action Input: Shipping time Observation: 7天无理由退货 Thought: I now know the final answer Final Answer: 我们的货物可以送到格尔木,大概需要7天。  > Finished chain. 我们的货物可以送到格尔木,大概需要7天。

因为在代码里,我们开启了 Agent 的 Verbose 模式,所以在输出结果中,你可以看到 Agent 思考的整个日志。你会发现一些有意思的现象。

首先,Agent 的每一步操作都可以分为 5 个步骤:ActionAction InputObservationThoughtFinal Answer

Action 指根据用户的输入选择应该采取哪一个 Tool 并执行相应的操作。Action Input是指从用户的输入中提取相关内容,以便输入到 Tool 中。Observation 是指观察使用 Tool 后得到的输出结果。Thought 是指再次查看用户的输入,以判断下一步应该采取什么操作。Final Answer 是指在观察 Observation 后,根据 Thought 得出的最终输出。

其次,对于“货需要几天送到格尔木”的问题,我们没有按照上述 5 个步骤回答,而是在 Thought 步骤之后重新回到了 Action 步骤。经过三次类似的操作后,我们不得不强行回答该问题。但是,我们的回答并不一定准确,因为我们没有解释是否能将货物送到格尔木。

这整个过程是通过一段 Prompt 实现的,你可以在 Langchain 源码中寻找 mrkl 对应的 Prompt 源代码。

 # flake8: noqa PREFIX = """Answer the following questions as best you can. You have access to the following tools:""" FORMAT_INSTRUCTIONS = """Use the following format:    Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [{tool_names}] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question""" SUFFIX = """ Begin!   Question: {input} Thought:{agent_scratchpad} """

该工具将一系列工具名称和描述交给OpenAI,根据用户的需求选择相应的工具,并提取与用户相关的信息。本质上,这只是我们让AI做选择题的一种扩展。

限制重试次数

Agent 可以通过反复思考来提高准确性,但有时 AI 处理可能不准确 (大语言模型运行是黑盒)。为了避免不断重试或强行回答,可以在创建 Agent 时设置max_iterations参数来限制尝试次数(比如 2 次)。

 agent = initialize_agent(tools, llm, agent="zero-shot-react-description", max_iterations = 2, verbose=True) question = "请问你们的货,能送到格尔木吗?大概需要几天?" result = agent.run(question) print("===") print(result) print("===")

输出结果:

 > Entering new AgentExecutor chain...  I need to find out the shipping policy and delivery time Action: FAQ Action Input: Shipping policy and delivery time Observation: 7天无理由退货 Thought: I need to find out the delivery time Action: FAQ Action Input: Delivery time Observation: 7天无理由退货 Thought:  > Finished chain. === Agent stopped due to iteration limit or time limit. ===

可以看到,这个时候,AI 重试了两次就不再重试。并且,也没有强行给出一个回答,而是告诉你,Agent 因为 max iterations的设置而中止了。这样,你可以把 AI 回答不上来的问题,切换给人工客服回答。

让 Tool 支持问答

这个问题很简单,可以用 AI 回答。目前无法回答的原因是 FQA 工具回答任何问题都是“7 天无理由退货”。正确的方法是使用第 15 讲中介绍的 VectorDBQA 工具,将其封装成一个工具即可。首先,将第 15 讲的代码搬运过来。

 from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import FAISS from langchain.text_splitter import SpacyTextSplitter from langchain import OpenAI, VectorDBQA from langchain.document_loaders import TextLoader  llm = OpenAI(temperature=0) loader = TextLoader('./data/ecommerce_faq.txt') documents = loader.load() text_splitter = SpacyTextSplitter(chunk_size=256, pipeline="zh_core_web_sm") texts = text_splitter.split_documents(documents)  embeddings = OpenAIEmbeddings() docsearch = FAISS.from_documents(texts, embeddings)  faq_chain = VectorDBQA.from_chain_type(llm=llm, vectorstore=docsearch, verbose=True)

然后,把这 LLMChain 的 run 方法包装到一个 Tool 里面。

 from langchain.agents import tool  @tool("FAQ") def faq(intput: str) -> str:     """"useful for when you need to answer questions about shopping policies, like return policy, shipping policy, etc."""     return faq_chain.run(intput)  tools = [     Tool(         name = "Search Order",func=search_order,          description="useful for when you need to answer questions about customers orders"    ),     Tool(name="Recommend Product", func=recommend_product,           description="useful for when you need to answer questions about product recommendations"    ),     faq ]  agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)

我们对 Tool 写法进行了改进,使得代码更易于维护。通过 Python 的 @tool 装饰器功能,我们将 FAQ 函数直接变成 Tool 对象,从而无需每次创建 Tools 时都指定名称和描述。

然后,我们可以通过 Agent 运行刚才的问题,同样可以得到正确的答案。

 question = "请问你们的货,能送到格尔木吗?大概需要几天?" result = agent.run(question) print(result)

输出结果:

 > Entering new AgentExecutor chain...  I need to know the shipping policy Action: FAQ Action Input: Shipping policy  > Entering new VectorDBQA chain...  > Finished chain.  Observation:  我们支持全国大部分省份的配送,包括北京、上海、天津、重庆、河北、山西、辽宁、吉林、黑龙江、江苏、浙江、安徽、福建、江西、山东、河南、湖北、湖南、广东、海南、四川、贵州、云南、陕西、甘肃、青海、台湾、内蒙古、广西、西藏、宁夏和新疆。一般情况下,大部分城市的订单会在2-3个工作日内送达,而偏远地区的订单可能需要5-7个工作日。 Thought: I need to know the estimated delivery time Action: FAQ Action Input: Estimated delivery time  > Entering new VectorDBQA chain...  > Finished chain.  Observation:  The estimated delivery time may vary depending on the order items, delivery address, andlogistics company. Generally, orders in most cities will be delivered within 2-3 working days, while orders inremote areas may take 5-7 working days. Thought: I now know the final answer Final Answer: 我们支持全国大部分省份的配送,包括格尔木,一般情况下,大部分城市的订单会在2-3个工作日内送达,而偏远地区的订单可能需要5-7个工作日。  > Finished chain. 我们支持全国大部分省份的配送,包括格尔木,一般情况下,大部分城市的订单会在2-3个工作日内送达,而偏远地区的订单可能需要5-7个工作日。

为了推荐商品,我们可以存储商品信息到VectorStore中,通过先搜索后问答的方式解决。数据由ChatGPT提供,代码与FAQ类似。

重新构建 Agent:

 from langchain.text_splitter import CharacterTextSplitter from langchain.document_loaders import CSVLoader  product_loader = CSVLoader('./data/ecommerce_products.csv') product_documents = product_loader.load() product_text_splitter = CharacterTextSplitter(chunk_size=1024, separator="\n") product_texts = product_text_splitter.split_documents(product_documents) product_search = FAISS.from_documents(product_texts, OpenAIEmbeddings()) product_chain = VectorDBQA.from_chain_type(llm=llm, vectorstore=product_search, verbose=True)  @tool("FAQ") def faq(intput: str) -> str:     """"useful for when you need to answer questions about shopping policies, like return policy, shipping policy, etc."""     return faq_chain.run(intput)  @tool("Recommend Product") def recommend_product(input: str) -> str:     """"useful for when you need to search and recommend products and recommend it to the user"""     return product_chain.run(input)  tools = [     Tool(         name = "Search Order",func=search_order,          description="useful for when you need to answer questions about customers orders"    ),     recommend_product, faq]  agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)

询问Agent问题:

 question = "我想买一件衣服,想要在春天去公园穿,但是不知道哪个款式好看,你能帮我推荐一下吗?" answer = agent.run(question) print(answer)

输出结果:

 > Entering new AgentExecutor chain...  I need to recommend a product to the user. Action: Recommend Product Action Input: Clothing for park in spring  > Entering new VectorDBQA chain...  > Finished chain.  Observation:  长款风衣、卫衣连衣裙、长款卫衣,搭配一双白色球鞋、黑色长靴、白色运动鞋和小包包。 Thought: I now know the final answer. Final Answer: 我建议你可以选择长款风衣、卫衣连衣裙、长款卫衣,搭配一双白色球鞋、黑色长靴、白色运动鞋和小包包,这样的搭配在春天去公园穿会很漂亮。  > Finished chain. 我建议你可以选择长款风衣、卫衣连衣裙、长款卫衣,搭配一双白色球鞋、黑色长靴、白色运动鞋和小包包,这样的搭配在春天去公园穿会很漂亮。
优化 Prompt, 避免AI胡乱回答

对于订单查询,使用向量检索就不太合适了。我们可以直接拿订单号去数据库里查找。这不是一个 Python 编程课,不会在这里演示如何使用 Python 编写 SQL。我们可以在对应的函数里造几条数据,根据用户输入的订单号返回不同的订单状态。如果找不到订单,就告诉用户订单不存在。

 import json  ORDER_1 = "20230611ABC" ORDER_2 = "20230611EFG"  ORDER_1_DETAIL = {     "order_number": ORDER_1,     "status": "已发货",     "shipping_date" : "2023-01-03",     "estimated_delivered_date": "2023-01-05", }   ORDER_2_DETAIL = {     "order_number": ORDER_2,     "status": "未发货",     "shipping_date" : None,     "estimated_delivered_date": None, }  import re  @tool("Search Order") def search_order(input:str)->str:     """useful for when you need to answer questions about customers orders"""     if input.strip() == ORDER_1:         return json.dumps(ORDER_1_DETAIL)     elif input.strip() == ORDER_2:         return json.dumps(ORDER_2_DETAIL)     else:         return f"对不起,根据{input}没有找到您的订单"  tools = [search_order,recommend_product, faq] agent = initialize_agent(tools, llm=OpenAI(temperature=0), agent="zero-shot-react-description", verbose=True)

然后,我们可以让 Agent 帮我们查询订单号。

 question = "我有一张订单,订单号是 2023Y06M11D,一直没有收到,能麻烦帮我查一下吗?" answer = agent.run(question) print(answer)

输出结果:

 > Entering new AgentExecutor chain...  I need to find out the status of the order Action: Search Order Action Input: 2023Y06M11D Observation: 对不起,根据2023Y06M11D没有找到您的订单 Thought: I need to find out more information about the order Action: Search Order Action Input: 2023Y06M11D Observation: 对不起,根据2023Y06M11D没有找到您的订单 Thought: I need to contact customer service for more information Action: FAQ Action Input: 订单查询  > Entering new VectorDBQA chain...  > Finished chain.  Observation:  登录您的帐户,点击“我的订单”,在此页面上,您可以查看所有订单及其当前状态。 Thought: I now know the final answer Final Answer: 请登录您的帐户,点击“我的订单”,在此页面上,您可以查看所有订单及其当前状态。  > Finished chain. 请登录您的帐户,点击“我的订单”,在此页面上,您可以查看所有订单及其当前状态。

我们输入了一个不存在的订单号,结果出乎意料。我们本来期望 AI 能够告诉我们订单号找不到,但实际上它重复调用了 OpenAI 的思考策略,并从 FAQ 中拿了一个查询订单的问题来敷衍用户。这并不是我们想要的,也是以前很多“人工智zhang”类型的智能客服常常会遇到的问题。因此,我们需要解决这个问题。

解决方法很简单,只需要调整 search_order 这个工具的提示语。通过这个提示语,Agent 就会知道,在找不到订单时应该告诉用户找不到订单或请用户再次确认。这样,它就会根据这个答案回复用户。下面是修改运行后的结果。

 import re  @tool("Search Order") def search_order(input:str)->str:     """一个帮助用户查询最新订单状态的工具,并且能处理以下情况:    1. 在用户没有输入订单号的时候,会询问用户订单号    2. 在用户输入的订单号查询不到的时候,会让用户二次确认订单号是否正确    """     pattern = r"\d+[A-Z]+"     match = re.search(pattern, input)      order_number = input     if match:         order_number = match.group(0)     else:         return "请问您的订单号是多少?"     if order_number == ORDER_1:         return json.dumps(ORDER_1_DETAIL)     elif order_number == ORDER_2:         return json.dumps(ORDER_2_DETAIL)     else:         return f"对不起,根据{input}没有找到您的订单"  tools = [search_order,recommend_product, faq] agent = initialize_agent(tools, llm=OpenAI(temperature=0), agent="zero-shot-react-description", verbose=True)  question = "我有一张订单,订单号是 2023Y06M11D,一直没有收到,能麻烦帮我查一下吗?" answer = agent.run(question) print(answer)

输出结果:

 > Entering new AgentExecutor chain...  我需要查询订单状态 Action: Search Order Action Input: 2023Y06M11D Observation: 对不起,根据2023Y06M11D没有找到您的订单 Thought: 我需要再次确认订单号是否正确 Action: Search Order Action Input: 2023Y06M11D Observation: 对不起,根据2023Y06M11D没有找到您的订单 Thought: 我现在知道最终答案 Final Answer: 对不起,根据您提供的订单号2023Y06M11D没有找到您的订单,请您再次确认订单号是否正确。  > Finished chain. 对不起,根据您提供的订单号2023Y06M11D没有找到您的订单,请您再次确认订单号是否正确。
多轮对话查询订单

优化客服聊天机器人的几个方法:

支持多轮聊天,因为用户可能不会在第一轮提供订单号。直接使用订单查询工具回答用户问题,无需让客服再次思考。

改进代码即可。

 import re from langchain.memory import ConversationBufferMemory from langchain.chat_models import ChatOpenAI  answer_order_info = PromptTemplate(     template="请把下面的订单信息回复给用户: \n\n {order}?", input_variables=["order"] ) answer_order_llm = LLMChain(llm = ChatOpenAI(temperature=0),  prompt=answer_order_info)  @tool("Search Order", return_direct=True) def search_order(input:str)->str:     """    useful for when you need to answer questions about customers orders    """          pattern = r"\d+[A-Z]+"     match = re.search(pattern, input)      order_number = input     if match:         order_number = match.group(0)     else:         return "请问您的订单号是多少?"     if order_number == ORDER_1:                 return answer_order_llm.run(json.dumps(ORDER_1_DETAIL))     elif order_number == ORDER_2:         return answer_order_llm.run(json.dumps(ORDER_2_DETAIL))     else:         return f"对不起,根据{input}没有找到您的订单"  tools = [search_order,recommend_product, faq] chatllm=ChatOpenAI(temperature=0) memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) conversation_agent = initialize_agent(tools, chatllm,                                        agent="conversational-react-description",                                        memory=memory, verbose=True) 

我们对 Search Order 工具进行了改进。我们设置了一个名为 return_direct=True 的参数,告诉 AI 在获取回复后不要再思考,直接向用户返回答案。这样,当 AI 无法获得订单号时,它不会反复尝试使用 Search Order 工具,而是直接向用户询问订单号。

为了实现这个改进,我们还需要使用 answer_order_llm工具来组织语言文字,而不是直接返回 JSON 字符串。

第二个改进是我们使用的 Agent,我们将其更换为 conversational-react-description,这样我们就支持多轮对话了,并且我们还将对应的 LLM 更改为 ChatOpenAI,这样成本更低。此外,我们还为这个 Agent 设置了记忆。

经过这些改进后,我们发现 AI 现在变得更加智能了。

问题 1:

 question1 = "我有一张订单,一直没有收到,能麻烦帮我查一下吗?" answer1 = conversation_agent.run(question1) print(answer1)

回答:

 > Entering new AgentExecutor chain... Thought: Do I need to use a tool? Yes Action: Search Order Action Input: 我有一张订单,一直没有收到,能麻烦帮我查一下吗? Observation: 请问您的订单号是多少?  > Finished chain. 请问您的订单号是多少?

问题2:

 question2 = "我的订单号是2023Y06M11D" answer2 = conversation_agent.run(question2) print(answer2)

回答2:

 > Entering new AgentExecutor chain... Thought: Do I need to use a tool? Yes Action: Search Order Action Input: 2023Y06M11D Observation: 对不起,根据2023Y06M11D没有找到您的订单  > Finished chain. 对不起,根据2023Y06M11D没有找到您的订单

问题3:

 question2 = "我还有一个订单号是20230611ABC" answer2 = conversation_agent.run(question2) print(answer2)

回答3:

 > Entering new AgentExecutor chain... Retrying langchain.chat_models.openai.ChatOpenAI.completion_with_retry.<locals>._completion_with_retry in 1.0 seconds as it raised RateLimitError: That model is currentlyoverloaded with other requests. You can retry your request, or contact us through our help center athelp.openai.com if the error persists. (Please include the request ID7ea75372be3b894ead8b8af989c471ca in your message.). Thought: Do I need to use a tool? Yes Action: Search Order Action Input: 20230611ABC Observation: 尊敬的用户,您的订单信息如下:  订单号:20230611ABC 订单状态:已发货 发货日期:2023年1月3日 预计送达日期:2023年1月5日  如有任何问题,请随时联系我们。感谢您的购买!  > Finished chain. 尊敬的用户,您的订单信息如下:  订单号:20230611ABC 订单状态:已发货 发货日期:2023年1月3日 预计送达日期:2023年1月5日  如有任何问题,请随时联系我们。感谢您的购买!

问题4:

 question3 = "你们的退货政策是怎么样的?" answer3 = conversation_agent.run(question3) print(answer3)

回答4:

 > Entering new AgentExecutor chain... Thought: Do I need to use a tool? Yes Action: FAQ Action Input: 退货政策  > Entering new VectorDBQA chain...  > Finished chain.  Observation:  自收到商品之日起7天内,如产品未使用、包装完好,您可以申请退货。某些特殊商品可能不支持退货,请在购买前查看商品详情页面的退货政策。 Thought:Do I need to use a tool? No AI: Our return policy allows for returns within 7 days of receiving the product, as long as the product isunused and in its original packaging. Some special products may not be eligible for returns, so pleasecheck the product details page before purchasing.  > Finished chain. Our return policy allows for returns within 7 days of receiving the product, as long as the product isunused and in its original packaging. Some special products may not be eligible for returns, so pleasecheck the product details page before purchasing.

AI 在多轮对话中理解用户意图并提供合适答案,但最后一个问题以英文回答。如何让其用中文回答?这是本课程的思考题。

现在你已拥有基本功能的电商客服聊天机器人,只需在原代码上做些改动并导入自己的数据源,便可用真实用户问题进行测试。

小结

今天我向你介绍了 Langchain 的 Agent 的基本功能。通过“先让 AI 做个选择题”的方式,AI 自动为我们选择合适的工具进行调用。我们可以将不同类型问题的 LLMChain 封装成不同的工具,也可以直接让工具调用内部查询订单状态的功能。我还为你演示了如何将 Agent、Memory、VectorStore 和 LLMChain 组合在一起,创建一个完整的电商聊天机器人。

Langchain 是目前大语言模型领域中最热门的开源项目之一,具有丰富的功能。我介绍的是核心功能,还有其他丰富的工具、不同类型的 VectorStore 和内置的其他 LLMChain,都可以在文档中找到。

思考题

在本讲末尾,我们的示例中,AI 用英语回答了中文 FAQ。请尝试修改现有代码,使 AI 使用中文回答。

上一讲介绍了 EntityMemory,但本讲中未使用它获取和查询订单信息。请查阅 Langchain 文档,思考如何使用 EntityMemory。

标签: #用户订单号