大家好,我是 AI 研习者轻寒。在之前的文章《解密AI客服:LangChain+ChatGPT打造智能客服新时代》中,我依据 LangChain + ChatGPT 完成了简易大众号的 AI 客服,首要是依据文本答复用户提出的问题,但缺点在于无法答复文本之外的内容,且答复较为生硬,一同没有依据用户阻隔会话。本文经过优化,使客服能够在答复事务问题之外,还能与用户闲聊,一同阻隔用户会话的一同保留上下文缓存。

打造 AI 客服

LangChain

LangChain 是一个用于开发由言语模型驱动的使用程序的框架,LangChain 灵敏的抽象和广泛的东西包使开发人员能够运用 LLM 的力量。由于其版别迭代的太快,作者也是在不断的探究。

AI 客服

AI 客服旨在供给有用的辅助和支撑,经过与用户的互动,主动分析用户的输入的问题,并依据用户的需求响应恰当的答复或主张。

AI 客服可认为企业提高高效、降低成本,经过快速响应以提升用户满意度,并削减人工客服的工作负担,如原本可能需求 10 人的客服团队,现在在 AI 的辅助下可能只需求 2 人就能担任工作。

目前 AI 客服还无法彻底自主解决一切问题,但怎么提升 AI 客服解决问题的才能还有许多探究的空间,比方依据 LangChain 完成日常客服(如售前、售后)流程阶段主动化,经过 LangChain 的署理及东西能够和其他事务体系紧密结合,运用 LangChain 的链能够对会话或阶段进行分析和评估等等。

依据文本问答的客服完成

这是之前完成简易 AI 客服,有爱好的能够去看看:《解密AI客服:LangChain+ChatGPT打造智能客服新时代》。

功用优化

本文是依据前文的完成进行了优化。

检索问答优化

优化概述

在之前的完成中运用了 RetrievalQA,RetrievalQA 是 LangChain 中的一个模块,用于构建依据检索的问答体系。

RetrievalQA 的首要思维是先从文档库中检索出与问题相关的文档,依据相关性对候选答案进行排序和筛选,然后将这些文档和原始问题一同供给给言语模型,让言语模型依据这些上下文来生成答案。

本次优化运用 ConversationalRetrievalChain 去完成,ConversationalRetrievalChain 用于构建会话式的检索问答署理。它会考虑会话的上下文信息,依据之前的问题并答复来改进当时问题的检索成果。比较单轮的 RetrievalQA,能够在会话的过程中不断改进检索性能。

ConversationalRetrievalChain 的首要思维是先构建一个检索东西,能够对用户的问题进行检索,获取相关文档。然后构建一个会话式的署理,内部集成了检索东西。当用户提出一个问题时,署理首先用检索东西获取相关文档。然后将问题、相关文档以及之前的对话前史作为 prompt,供给给言语模型生成答复。这样能够运用检索成果增强言语模型的理解才能,生成更好的答复。

ConversationBufferMemory 是 LangChain 中的一个组件,用于在会话问答体系中存储对话前史。它能够跟踪对话的上下文,在生成回复时供给给言语模型运用。

代码完成

优化前
qa = RetrievalQA.from_chain_type(llm=ChatOpenAI(model_name='gpt-3.5-turbo-0613'), chain_type="stuff",
                 retriever=vector_store.as_retriever())
优化后
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True, verbose=True)
qa = ConversationalRetrievalChain.from_llm(llm=ChatOpenAI(model_name='gpt-3.5-turbo-0613'), chain_type="stuff", memory=memory,
                      retriever=vector_store.as_retriever(),
                      condense_question_prompt=common_prompt,
                      verbose=True)

体系prompt预设

优化概述

体系提示预设能够让模型答复的更可控,经过自定义体系模板,能够让 AI 的回复愈加契合交互场景的需求,提高用户体验。它为构建会话式问答体系供给了更多可定制性,比方让体系回复愈加人性化,丰厚体系和用户之间的交互形式,又如控制 AI 哪些能够答复,哪些不能答复。

把 system_prompt.txt 存在在静态文件中,在 docker 布置时,便利快速调试以及优化 prompt。

代码完成

# 构建system_template.txt文件的途径
system_template_path = os.path.join(base_dir, 'static', 'system_template.txt')
​
with open(system_template_path, 'r') as file:
  system_template = file.read()
​
common_prompt = PromptTemplate(
  template=system_template,
  input_variables=[]
)

运用署理完成自定义东西调用

优化概述

OpenAI 有 Function calling 的功用,LangChain 的署理也是类似,这儿咱们运用了 OpenAIFunctionsAgent。

LangChain 的署理能够依据用户的发问,结合东西的描绘(描绘对错常有用的)和自定义参数主动判断是否需求调用东西以及选择什么东西。

依据署理和东西咱们还能够把事务和 GPT 模型才能完美的结合起来。

代码完成

这儿把之前写的实时查询气候的东西集成了进来,便利测验。能够阅读之前的文章《依据LangChain完成ChatGPT实时查询气候》来学习怎么完成自定义东西(东西即是函数或许接口才能)。

qa = ConversationalRetrievalChain.from_llm(llm=llm, chain_type="stuff", memory=memory,
                      retriever=vector_store.as_retriever(),
                      condense_question_prompt=common_prompt,
                      verbose=True)
​
realWeatherTool = RealWeatherTool()
tools = [
  Tool(
    name="xmhc",
    func=qa.run,
    description="当您需求答复小猫惠充客服相关问题时,包括话费充值、充值类型(快充/慢充)、到账时刻、充值须知、充值规矩、充值协议、活动规矩、客服联系方式、联系客服等,"
          "这十分有用。输入应该是一个完好的问题。",
    verbose=True,
   ),
  Tool(
    name="RealWeatherTool",
    func=realWeatherTool.run,
    description=realWeatherTool.description,
    verbose=True,
   )
]
​
chat_prompt = OpenAIFunctionsAgent.create_prompt(
  system_message=SystemMessage(content=system_template)
)
​
agent = OpenAIFunctionsAgent(llm=llm, tools=tools, prompt=chat_prompt, verbose=True)
agent_executor = AgentExecutor(agent=agent, tools=tools, memory=memory, verbose=True)

用户会话阻隔及上下文存储

优化概述

咱们知道微信大众音讯都是依据大众号用户的,所用咱们能够采用 openid 来作用用户仅有标识,以此来用于绘画阻隔。

一同需求记录用户会话的上下文,这儿我采用 redis 来缓存用户会话记录,后续还能够依据会话记录来做一个会话分析功用。

对会话上下文进行限制,以防超出模型最大 token。

代码完成

@app.route("/xmhc/kf", methods=['POST'])
def chat(): # put application's code here
  # 接口恳求参数
  json_data = request.get_json()
  userid = json_data['userid']
  question = json_data['question']
  # 获取当时用户前史会话内容
  history_message = []
  if redis_store.exists(userid):
    history_message_str = redis_store.get(userid)
    history_message = json.loads(history_message_str)
  try:
    answer = agent_executor.run({"input": question, "chat_history": history_message})
    current_message = (question, answer)
    # 缓存当时用户前史对话内容
    history_message.append(current_message)
    if len(history_message) > 10: # 对会话数进行限制
      # 删除最旧的数据
      history_message.pop(0)
    # 将元组列表转换为JSON字符串
    history_message_str = json.dumps(history_message)
    redis_store.set(userid, history_message_str)
    print(answer)
  except InvalidRequestError:
      # 调用模型恳求失败,可能是额度不足或许恳求频繁
    return {
      "err_code": -1,
      "data_list": []
     }
  return {
    "err_code": 0,
    "data_list": [
       {"content": answer}
     ]
   }

成果演示

LangChain与ChatGPT重塑AI客服服务

LangChain与ChatGPT重塑AI客服服务

LangChain与ChatGPT重塑AI客服服务

结束

LangChain 给了我许多的惊喜,它让开发 AI 使用变得简单。但它的生态还在不断扩展,版别不断迭代,所以咱们只能不断的探究。关注大众号【码森林】~

理解新范式,拥抱新时代,把握新时机。