使用Llama索引和语言模型API构建具有情境学习功能的客户服务聊天机器人

2023年10月30日 由 alex 发表 475 0

介绍


客户服务对于任何品牌来说都是必不可少的,但提供全天候的人工支持可能成本高且耗时。这就是聊天机器人的用武之地——它们能够为客户提供即时且自动化的帮助,同时也能释放人工客服代理人处理更复杂的问题。


在本文中,我将介绍如何构建一个基于真实的 Twitter 品牌客户互动的客户服务聊天机器人。创建一个有效的聊天机器人的关键是具有相关的训练数据。因此,我将使用一个 Kaggle 数据集,其中包含了涉及苹果、Verizon、Airbnb、Uber、Spotify等热门品牌的 Twitter 客户支持对话记录。


2


方法


为了解决Large language models (LLM)如ChatGPT的局限性,我将使用Llama Index。这使得我可以对所有的训练数据进行索引,并将其分成适合令牌限制的小段。Llama Index还可以实现上下文学习,即聊天机器人可以参考索引数据,这些数据与用户的问题最相关,以提供更准确的回答。


然后,我将使用像ChatGPT或Hugging Face这样的语言模型API,对我的Twitter对话数据集进行微调。通过Llama Index提供的上下文学习功能,聊天机器人可以为用户的查询提供定制的、品牌特定的回答。


为了使聊天机器人易于访问,我将使用Gradio构建一个用户界面。这将使任何人都能轻松与机器人聊天以获取客户支持。


到最后,我们将拥有一个在真实品牌-客户互动中训练的智能、对话式的客户服务聊天机器人。使用Llama Index和领域特定数据的微调,它能够像人工客服一样提供相关、自然的回答。


为什么选择LLama Index?


1. 使用LLM而不使用LLama Index的缺点:

上下文学习是指使用像ChatGPT这样的LLM来回答客户问题,基于我们提供的数据库的内容,而不是依赖LLM的先前知识。我们只使用LLM来理解自然语言(如我们的数据库或提示)。因此,提示将如下所示:

上下文:

“我们用来训练模型的数据库:
退货政策:你可以在购买后的30天内退换无线设备和配件。无线设备的退换货需缴纳50美元的返库存费用(夏威夷除外)。如果你从非威瑞森所有的零售位置(授权零售商)购买设备,你应该查阅该位置的退货政策,了解他们是否接受设备退货……。”

给定上述上下文,而不是你的先前知识,请帮我回答:“客户的问题。”


但是如果:


(1)上下文很大,因此令牌数量超过了模型的限制。
(2)我们数据库中的上下文大多与答案无关,只有一小部分是需要准确返回答案的。


在这种情况下,我们需要另一种方法。这正是LLama Index派上用场的地方。


2. LLama Index的好处:

Llama Index提供以下工具:数据连接器、数据索引、引擎、代理、应用集成等等。但在我们的项目中,我只想提到数据索引。


简单来说,LLama会分析你的所有文本数据,并将其分割成小的段落或片段,每个片段都在令牌限制内。


例如,如果你有一个包含5万字的客户服务对话记录,LLama Index将将其分割成不超过4000个词的片段。


每个这些小片段都被索引 - 这意味着它们被标记和存储以供轻松检索。索引就像一个图书馆卡片目录一样,允许你顺利地找到并引用以后的任何文本片段。


因此,当你查询聊天机器人时,它可以使用Llama Index从你的训练数据中找到最相关的片段(通过对每个文本块进行排名),并在构建回答时参考它们。这使得聊天机器人能够根据索引的训练数据提供定制、准确的回答。


3

4


正如你所看到的,Llama将数据分成小块,嵌入并存储在知识库中。因此,每当用户提出请求时,LLM只与一小段相关文本一起工作,并在短时间内提供准确的回答。


使用LLM API构建上下文学习聊天机器人


步骤


在本部分中,为了创建一个上下文学习聊天机器人,我们将按照以下关键步骤进行操作:


1. 数据收集:我们将使用Kaggle上一个名为"Customer Support on Twitter"的公开可用数据集。该数据集包含客户在Twitter上与各个品牌的互动,为我们提供了丰富的客户服务对话的信息源。


2. 数据准备:构建聊天机器人的第一步是从Twitter数据集中提取与特定品牌或感兴趣的主题相关的对话。这将是我们聊天机器人知识的基础。


3. Llama索引集成:我们将使用Llama Index来高效地索引和组织对话数据。这对于管理令牌限制和实现上下文学习至关重要。


4. 语言模型API:我们将利用ChatGPT或Hugging Face等语言模型来训练我们的聊天机器人,使用索引化的数据。这些模型能够理解和生成类似人类的文本,使其非常适用于对话式人工智能应用。


5. Gradio用户界面:为了使我们的聊天机器人用户友好,我们将把它与Gradio集成,这是一个用于创建自定义用户界面的库。Gradio将使我们能够通过一个视觉吸引力和直观的界面与我们的聊天机器人进行交互。


让我们开始编码


加载数据


# Load data
df_raw = pd.read_csv('./data/twcs.csv')
df_raw


5


从数据中提取品牌


# Extract "brand" from text 
df_raw['brand'] = df_raw['text'].str.extract(r'@(\w+) ')
# Display data
df_raw.head()


6


最后一列已经有品牌ID


检查每个品牌的数据


# Count brand
df_raw['brand'].value_counts().head(20)['brand'].value_counts().head(20)


7


将推特收集到相应的对话中


# Group tweet into conversation
df = df_filtered.groupby('response_tweet_id')['text'].agg(lambda x: ' '.join(x)).reset_index()
df.head()


8


最后,我将所有来自 Verizon 团队的客户支持文本合并到一个文本文件中,并进行下一步操作。


构建聊天机器人


第一步:将数据索引为块以便进行简单回调


# Set your API from ChatGPT account
openai.api_key = 'Enter_Your_Key'


请记住,你所有的文档文件都在同一个文件夹下,这样我们就可以加载所有数据,而不论其类型(doc、pdf、txt等)。


# Define the directory path for your data
directory_path = "./textdata"


读取数据


# Read all data within the folder
documents = SimpleDirectoryReader(directory_path).load_data()


定义LLM


# Define LLM, in this case we use ChatGPT API
llm = OpenAI(openai_api_key=openai.api_key,
             temperature=0, 
             model="gpt-3.5-turbo",
             max_tokens = 256)


配置服务上下文,并根据你的情况更改参数


# Configure service context
service_context = ServiceContext.from_defaults(
    llm=llm, 
    chunk_size=800, 
    chunk_overlap=20, 
    context_window = 4096, 
    num_output = 256)


索引文本数据。在这一步中,我们使用LLM的服务,所以需要花费一些钱。但我们只需执行一次,以得到模型的知识库。


# Construct the index to vectorize all the text into a chunk index
# IMPORTANT NOTE: ONLY LOAD ONCE, THIS COSTS MONEY
index = VectorStoreIndex.from_documents(documents, 
                                        service_context=service_context)


将索引数据保存到磁盘


# Load index result from memory to disk
 index.storage_context.persist()


示例数据如下,以json格式呈现。


9


创建一个聊天机器人


def chatbot(input_text):
    # Load index from disk
    storage_context = StorageContext.from_defaults(persist_dir="./storage")
    index = load_index_from_storage(storage_context=storage_context)
    # Create a response from input text
    query_engine = index.as_query_engine()
    response = query_engine.query(input_text)
    # Return response
    return response


使用Gradio创建Chatbot用户界面


iface = gr.Interface(fn=chatbot,
                     inputs=gr.components.Textbox(lines=7, label="Enter your text:"),
                     outputs=gr.components.Textbox(lines=7, label="Answer:"),
                     title=" Your Verizon Support Chatbot")


最后,通过应用程序启动聊天机器人。


iface.launch(share=True)(share=True)


10

现在就可以使用该机器人了。


文章来源:https://medium.com/@kirudang/building-a-customer-service-chatbot-with-in-context-learning-using-llama-index-and-language-model-61423b25d858
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消