0%

基于Langchain使用闭源大模型结合本地知识库实现问答

本项目使用是langchain LLM框架和文心大模型4.0 API,结合现有知识库开发一个聊天机器人,该机器人不仅有大模型的基础知识,并且还可以根据提供的知识库文档进行问答。

1
from langchain_community.chat_models import ErnieBotChat

初体验

导入密钥

提前在网址https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application
中创建好应用,并充值ERNIE-Bot-4 tokens

1
2
3
4
5
import json
with open(r'C:\Users\ming\ErnieBotChat.json') as f:
ernie_key = json.load(f)
ernie_client_id=ernie_key['ernie_client_id']
ernie_client_secret=ernie_key['ernie_client_secret']

定义模型

1
2
3
4
5
chat_model = ErnieBotChat(
model_name='ERNIE-Bot-4', # 调用文心大模型4.0
ernie_client_id=ernie_client_id,
ernie_client_secret=ernie_client_secret
)

使用模型

1
chat_model.invoke('你是谁?')
AIMessage(content='我是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。如果您有任何问题,请随时告诉我。')

创建一个基础链

创建提示词模板

1
from langchain_core.prompts import ChatPromptTemplate
1
prompt = ChatPromptTemplate.from_template('给我将一个关于{topic}的笑话')
1
2
# 查看提示词的赋值,这一步可省略,后面组装成链后可直接传入
prompt.invoke({'topic': '小羊'})
ChatPromptValue(messages=[HumanMessage(content='给我将一个关于小羊的笑话')])

定义输出解析器

1
from langchain_core.output_parsers import StrOutputParser
1
output_parser = StrOutputParser()

创建链

1
chain = prompt | chat_model | output_parser
1
output = chain.invoke({'topic': '小羊'})
1
print(output)
当然可以,这是一个关于小羊的笑话:

有一天,一只小羊羔对一只大灰狼说:“狼大叔,你能告诉我怎么样才能像你一样威猛吗?”

大灰狼笑了笑,回答道:“很简单,只要你每天都像我一样吃草,你就能变得像我一样强壮了。”

小羊羔听了很高兴,于是它每天都努力地吃草。过了一段时间,它发现自己并没有变得更强壮,反而越来越胖了。

后来,小羊羔遇到了一只老羊。老羊告诉它:“孩子,狼是食肉动物,它们吃草只是为了掩人耳目。你如果想要变得强壮,应该像我们羊一样,吃草的同时也要锻炼身体。”

小羊羔这才恍然大悟,原来自己被大灰狼给耍了。从那以后,它每天都坚持锻炼身体,终于变成了一只健康又强壮的小羊。

笑点解释:这个笑话的幽默之处在于小羊羔的天真和大灰狼的狡猾。小羊羔误以为吃草就能变得像狼一样强壮,结果却越来越胖。而大灰狼则利用小羊羔的无知,开了一个玩笑。最后,小羊羔在老羊的指点下,找到了正确的道路,这也给人留下了深刻的教训。

不过,请注意,这个笑话是虚构的,狼和羊在自然界中的生活习性和食物链位置是固定的,狼是食肉动物,而羊是食草动物。这个笑话只是为了娱乐和教育目的而编写的。

创建提示词的其他方法

方法一

1
from langchain_core.prompts import PromptTemplate
1
prompt = PromptTemplate.from_template('tell me a {topic} joke about {content}')
1
prompt.invoke({'topic': 'funny', 'content': 'chickens'})
StringPromptValue(text='tell me a funny joke about chickens')

方法二

1
prompt.format(topic='funny', content='chickens')
'tell me a funny joke about chickens'

方法三

1
2
3
4
5
6
7
8
chat_template = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful AI bot. Your name is {name}."),
("human", "Hello, how are you doing?"),
("ai", "I'm doing well, thanks!"),
("human", "{user_input}"),
]
)
1
2
# 组装提示词
chat_template.format_messages(name='Bob', user_input='What is your name?')
[SystemMessage(content='You are a helpful AI bot. Your name is Bob.'),
 HumanMessage(content='Hello, how are you doing?'),
 AIMessage(content="I'm doing well, thanks!"),
 HumanMessage(content='What is your name?')]

RAG实战:利用现有知识库开发一个聊天机器人

下载三个库:

  • pip install pypdf
  • pip install qdrant-client
  • pip install rapidocr-onnxruntime
1
2
3
4
5
6
7
8
from langchain_community.vectorstores import Qdrant  # 向量数据库
from langchain_core.output_parsers import StrOutputParser # 输出解析器
from langchain_core.prompts import ChatPromptTemplate # 提示词管理模板
from langchain_core.runnables import RunnableParallel, RunnablePassthrough # 计算问题与文档切片的相似度
from langchain_community.chat_models import ErnieBotChat # 文心大模型
from langchain_community.embeddings import ErnieEmbeddings # 文心大模型的词嵌入工具(tokens)
from langchain.text_splitter import RecursiveCharacterTextSplitter # 文档切分工具
from langchain_community.document_loaders import TextLoader, PyPDFLoader # 文件读取器

读取数据

1
2
loader = PyPDFLoader('PyTorch深度学习基础.pdf')  # 本地知识库
documents = loader.load()

文本切分

1
2
3
# 实例化一个文本切分器
# chunk_size切分后每个文档的tokens数,设置大后效果会更好,不能超过1000
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=10)
1
2
# 执行文本切分
chunk_documents = text_splitter.split_documents(documents)

文本向量化

1
2
3
4
5
6
7
# 将切分后的文本转化为一个个向量,并存储到向量数据库中
vectorstore = Qdrant.from_documents(
documents=chunk_documents, # 指定向量化的文档
embedding=ErnieEmbeddings(ernie_client_id=ernie_client_id, ernie_client_secret=ernie_client_secret), # 使用的embedding,设置为文心一言的embedding
location=':memory:', # 数据存储的位置,存储在内存中
collection_name='my_documents'
)
1
retriever = vectorstore.as_retriever()

构建提示词模板

1
2
3
4
5
template = """Answer the question based only on the following context:
{context}

Question: {question}
"""
1
prompt = ChatPromptTemplate.from_template(template)

定义大模型

1
2
3
4
5
model = ErnieBotChat(
model_name='ERNIE-Bot-4', # 调用文心大模型4.0
ernie_client_id=ernie_client_id,
ernie_client_secret=ernie_client_secret
)

定义输出解析器

1
output_parser = StrOutputParser()

计算相似度

1
2
3
setup_and_retrieval = RunnableParallel(
{"context": retriever, "question": RunnablePassthrough()}
)

组装链

1
chain = setup_and_retrieval | prompt | model | output_parser

测试效果

1
output = chain.invoke('如何去安装PyTorch?')
1
print(output)
根据提供的文档内容,安装PyTorch的步骤如下:

1. 进入PyTorch官网:https://pytorch.org/。
2. 在官网中,根据电脑的硬件状况和操作系统版本,选择适合的PyTorch版本。特别注意CUDA版本,如果电脑的CUDA版本过低,可以选择升级CUDA驱动,或者点击官网提供的链接下载低版本的PyTorch。
3. 官网会根据选择生成对应的PyTorch下载命令。将生成的命令复制到虚拟环境终端中执行,开始下载PyTorch。
4. 等待下载完成。当终端中生成了相应的内容时,表示下载已经完成。

需要注意的是,由于我并没有提供具体的硬件和操作系统信息,因此生成的下载命令可能并不适用于所有情况。在实际操作中,请根据自己的情况在PyTorch官网选择适合的版本,并生成相应的下载命令。

另外,如果遇到问题,可以参考PyTorch官方文档(https://pytorch.org/docs/stable/index.html#)或PyTorch中文文档(https://pytorch.apachecn.org/)寻求帮助。
-------------本文结束感谢您的阅读-------------