![](http://8itq.pc282828.com/storage/20966/Onepoint-Hands-on-Langchain.png)
在这个故事中,我们将看到如何使用 LangChain 和 Chainlit. 这个聊天机器人回答有关员工相关政策的问题,比如e.g. 产假、危险报告或培训政策、行为准则等等.
因为这个项目是作为POC创建的, 我们决定通过劫持这个工具中使用的提示符来尝试一下, 这样聊天机器人就会在回答问题的同时偶尔讲一些笑话. 所以这个聊天机器人应该有幽默感和某种“个性”。.
十大网博靠谱平台Chainlit
Chainlit 是一个开源的Python / Typescript库,允许开发人员快速创建类似chatgpt的用户界面. 它允许你创建一个想法链,然后添加一个预先构建的, 可配置聊天用户界面. 它非常适合基于网络的聊天机器人.
Chainlit 更适合这个任务,而不是 Streamlit 这需要更多的工作来配置UI组件.
Chainlit库的代码可以在这里找到:
Chainlit -构建Python LLM应用程序在几分钟⚡️
Chainlit 有两个主要组成部分:
快速浏览我们的人力资源聊天机器人
我们的聊天机器人有一个UI,最初看起来像这样的光模式:
初始聊天机器人界面
然后你可以输入你的问题,结果如下所示(使用暗模式):
有关正常工作时间的问题
UI不仅显示问题和答案,还显示源文件. 如果找到了文本,pdf文件也可以点击,您可以查看其内容.
如果你展开LangChain链的步骤,你会看到:
思维链表示
用户界面(UI)也有一个可搜索的历史:
搜索历史
你也可以很容易地在明暗模式之间切换:
打开设置
暗模式开关
会讲笑话的人力资源聊天机器人
我们操纵聊天机器人讲笑话, 特别是当他无法根据现有的知识库回答问题时. 所以你可能会看到这样的回应:
笑话找不到出处
链工作流
在这个应用程序中有两个工作流:
- setup workflow—用于设置表示文本文档集合的矢量数据库(在本例中为做)
- 用户界面工作流——思想链交互
设置工作流程
你可以使用下面的BPMN图来可视化设置:
设置工作流程
以下是设置工作流程的步骤:
- 该代码首先列出一个文件夹中的所有PDF文档.
- 提取文件每页的文本.
- 文本发送到 开放AI嵌入API.
- 检索嵌入的集合.
- 结果累积在内存中.
- 累积嵌入的集合被持久化到磁盘.
用户界面工作流
这是用户界面工作流:
用户界面工作流
以下是用户工作流步骤:
- 用户问一个问题
- 对向量数据库执行相似度搜索查询(在我们的示例中) 做 ——Facebook人工智能相似度搜索)
- 向量数据库通常最多返回4个文档.
- 返回的文档作为上下文发送到ChatGPT (model: gpt-3).5涡轮-16k)和问题一起.
- ChatGPT返回答案
- 答案将显示在UI上.
聊天机器人代码安装和演练
整个聊天机器人代码可以在这个Github存储库中找到:
http://github.com/onepointconsulting/hr-chatbot
聊天机器人代码演练
的 配置 应用程序的大多数参数都在文件中:
http://github.com/onepointconsulting/hr-chatbot/blob/main/config.py
在这个文件中,我们设置了做持久性目录, 嵌入的类型(" text- embeddings -ada-002 "), 默认选项)和模型(“gpt-3”).5-turbo-16k”)
的 提取文本并对嵌入进行处理 在这个文件中:
http://github.com/onepointconsulting/hr-chatbot/blob/main/generate_embeddings.py
每页提取PDF文本的函数(load_pdfs),可以通过此链接找到源文件和页面元数据:
http://github.com/onepointconsulting/hr-chatbot/blob/main/generate_embeddings.py#L22
生成嵌入的函数(generate_embeddings)可以在第57行找到:
http://github.com/onepointconsulting/hr-chatbot/blob/main/generate_embeddings.py#L57
这个文件 初始化vector存储库 并创建了一个LangChain问答链:
http://github.com/onepointconsulting/hr-chatbot/blob/main/chain_factory.py
这个函数 load_embeddings 最重要的功能之一是 chain_factory.py.
此函数加载PDF文档以支持Chainlit UI中的文本提取. 如果没有持久的嵌入,则生成嵌入. 如果嵌入是持久化的,那么它们将从文件系统加载.
这种策略避免了过于频繁地调用嵌入API,从而节省了资金.
另一个重要的函数是 chain_factory.py 是 函数create_retrieval_chain 加载QA链(问答链)的函数:
这个函数创建带有内存的QA链. 如果幽默参数为真, 然后使用一个被操纵的提示——在某些场合往往会制造笑话.
我们必须继承 ConversationSummaryBufferMemory 内存类,使内存不会抛出与未找到键相关的错误.
以下是我们在QA链中使用的提示文本摘录:
给定下列一份长文件的摘录部分和一个问题, 用参考(“来源”)创建最终答案. 如果你知道一个十大网博靠谱平台这个话题的笑话,一定要把它写进回复里.
如果你不知道答案,就说你不知道,然后编一些十大网博靠谱平台这个话题的笑话. 不要试图编造答案.
总是在你的答案中返回“来源”部分.
实际的部分 与ChainLit相关的代码 在这个文件中:
http://github.com/onepointconsulting/hr-chatbot/blob/main/hr_chatbot_chainlit.py
Chainlit图书馆与 Python修饰符. LangChain QA链的初始化是在一个修饰函数中完成的,你可以在这里找到:
http://github.com/onepointconsulting/hr-chatbot/blob/main/hr_chatbot_chainlit.py#L56
这个函数使用 load_embeddinges (). 然后由函数初始化QA链 create_retrieval_chain 并返回.
最后一个函数 process_response 将LangChain结果字典转换为Chainlit 消息 object. 此方法中的大多数代码都试图提取文本中有时以意外格式出现的源. 代码如下:
http://github.com/onepointconsulting/hr-chatbot/blob/main/hr_chatbot_chainlit.py#L127
关键的外卖
Chainlit 是不断增长的LangChain生态系统的一部分,它可以让你快速地开发出漂亮的基于web的聊天应用程序. 它有一些自定义选项,比如e.g. 允许快速集成 身份验证平台 或 保存数据.
然而,我们发现要去掉这个有点困难。”用Chainlit建造的脚注,并以一种相当“hacky”的方式结束,这可能不是很干净. 目前还不清楚如何在不创建分支或使用肮脏hack的情况下完成深度UI定制.
我们面临的另一个问题是 如何可靠地解释LLM输出 -特别是如何从回复中提取来源. 尽管提示告诉LLM:
用参考(“来源”)创建最终答案
它并不是一直都这样. 这会导致一些不可靠的资源提取. 然而,这个问题可以通过 OpenAI的函数调用功能 使用它可以指定输出格式,但在编写代码时还不可用.
往好的方面想, LLM允许你创建一个有味道的聊天机器人,如果你愿意以创造性的方式改变提示. 人力资源助理讲的笑话不太好, 然而,它们证明了你可以创造“有味道的”人工智能助手, 这最终会更吸引终端用户,也更有趣.