UI前端
为了搭建起聊天界面,又不得不拾起N多年没碰的前端了。如图展示为前端聊天界面 ![前端聊天界面](https://picx.zhimg.com/80/v2-16a0b5b3bd0da18ffd307612463e6917_1440w.png)。该前端采用的是[vue-bot-ui](https://github.com/juzser/vue-bot-ui)这个项目。样式基本上没怎么修改,只是修改了`message.js`获取对话消息的相关代码。
message.js
相关代码如下:
import axios from 'axios'
export const messageService = {
createMessage
}
function createMessage (question) {
return new Promise((resolve, reject) => {
let data = {
'text': question
}
axios
.post('http://127.0.0.1:9000/chat', data, {
headers: {
'Content-Type': 'application/json'
}
})
.then(response => {
let transformedData = {
type: 'text',
text: response.data.result,
disableInput: false
}
resolve(transformedData)
})
.catch(error => {
reject(error)
})
})
}
具体的我也不做过多的解释,简单的接口调用。
实现”AI占卜”聊天服务
书归正题,毕竟这个系列是langchain过河系列。为了实现【AI占卜】这个垂直领域的产品,首先需要考虑的是如何获取占卜相关的知识,因为LLM不一定会。
但是,我试了问了下gpt4,获得这样一个答案![周易gpt4](https://pic1.zhimg.com/80/v2-a4e4e6288238137762efe1c8a50a66bf_1440w.png),啪啪打脸。那既然LLM学过《周易》那我岂不是可以直接占卜了,还用得着这么费劲巴拉的实现。我又去问了gpt4,得到的结果是![test](https://pica.zhimg.com/80/v2-de46bed239608ec5022c13a56ad94baa_1440w.png),看来还是得开发。
所以要获得相关的占卜知识,就需要去下载相关的书籍文章,然后通过langchain的VectorStore进行矢量存储,这里我采用的是faiss直接存储到本地。
而后通过`RetrievalQA`进行检索问答,并将`RetrievalQA`设计成一个Tool,以供agent调用。而作为Tool,最重要的就是*description*描述,因为description描述会被langchain集成进prompt中。
一开始description我设计的是”这是一个专门用于回答占卜相关问题的工具。”,但是会遇到一个问题是问占卜相关的问题是回答了,但是后续的问题如果和占卜无关的话就不会回答。所以后面我又加上了”无论是初次的占卜询问,还是后续的深入探讨,这个工具都可以提供协助。”
最终的description如下:
“`
description=”””这是一个专门用于回答占卜相关问题的工具。无论你是想要解读塔罗牌,理解梦境,还是分析星座图,这个工具都可以提供专业的AI占卜服务来帮助你。只要你提出与占卜相关的问题,或者明确说出”占卜”,这个工具就会被启动来寻找最合适的答案。无论是初次的占卜询问,还是后续的深入探讨,这个工具都可以提供协助。”””
“`
如果仅仅是走到这一步的话还是会存在问题。当你调用的时候就会遇到,有时候问题agent会给你回复英文,这个就很恶心人了。我一开始试着在description中加上”当你使用该工具回答任何问题,一定要用中文回答”,但并没有避免这个问题。
然后我尝试去修改sys_msg,langchain自定义的系统prompt。一开始我仅仅是在原始的sys_msg最后加上”Most importantly, when agent answer should use chinese.”但后面觉得不稳妥,干脆将sys_msg全都转述成中文,以及和AI占卜相关的话术。
后续又遇到一个问题,开始简单的sys_msg并不能让agent很好的回答用户的占卜问题。然后我试着问了gpt4如何进行周易占卜,gpt4给了我这样的一个回答,有了这样的步骤之后,我就继续修改sys_msg,如下:
sys_msg = """
AI占卜助手是一个大型的语言模型,由OpenAI进行训练。它被设计成能够帮助进行周易占卜,并根据占卜的结果提供解释。
AI占卜助手已经学习了周易占卜的知识,可以帮助用户进行占卜。它可以指导用户如何提出问题,如何进行占卜,以及如何解读占卜的结果。
AI占卜助手的占卜步骤如下:
1. 提问:首先,AI占卜助手会引导用户提出一个特定的问题,这个问题应该是开放性的,不能简单地用"是"或"否"来回答。
2. 产生爻:然后,AI占卜助手会通过某种方式产生六个爻以形成卦象。这个过程可以是随机的,也可以是通过某种算法实现的。
3. 解读卦象:得到卦象后,AI占卜助手会解释这个卦象的含义。这个解释是基于周易的知识,也会考虑到用户的问题和情况。
4. 理解动爻:如果在产生爻的过程中有动爻(即6或9),AI占卜助手会解释这个动爻如何改变了卦象,以及这个改变如何影响到解答。
5. 反思与解答:最后,AI占卜助手会帮助用户理解卦象和动爻的含义,应用到他们的问题上,给出一个反思和解答。
请注意,尽管AI占卜助手具有进行周易占卜和解释结果的能力,但是它仍然只是一个AI模型,它的解答并不能预知未来,也不能替代专业的咨询或建议。请用户在理解和使用AI占卜助手的解答时,持有理性和批判性的态度。
当回答问题时,AI占卜助手必须使用以下语言:中文。
"""
结束语
这篇文章主要阐述了我在实现【AI占卜】过程中遇到的问题,以及如何逐步进行修改的过程。关于langchain的一些使用方法,已有很多文章或官方文档提供了说明,我这里就不再一一解释。我认为重要的是对prompt的修改思路,因为langchain最终会调用LLM,传给LLM的都是prompt,无论是sys_msg还是human_msg,最终都只是合并在一起,以便让LLM能够清晰地理解任务。