做网站广告的点,网页设计制作网站模板,建设银行网站修改,水资源监控能力建设 网站LangChain结合通义千问的自建知识库
在使用了通义千问API了之后#xff0c;下一步就是构建知识库文档#xff0c;使用了比较有名的LangChian#xff0c;最后成果将自己的txt生成了知识向量库#xff0c;最后我还把自己的论文生成了一个知识向量库#xff0c;然后问他我的…LangChain结合通义千问的自建知识库
在使用了通义千问API了之后下一步就是构建知识库文档使用了比较有名的LangChian最后成果将自己的txt生成了知识向量库最后我还把自己的论文生成了一个知识向量库然后问他我的创新点是啥实话实说比我总结的好我想这下回老师要是看不懂我论文的时候能不能直接嗯对吧反正也是工作中用到还挺有意思的能分享的部分我都分享出来了然后这个是接着这个专栏的第一篇的延申文档。 文章目录 LangChain结合通义千问的自建知识库1.文本切片2.读取本地Embedding模型3. 保存向量数据库4.检索数据库中的相似样本5.使用通义千问总结归纳6.额外补充 LangChain 使用通义模型进行流式输出7.目前发现的LangChain使用问题总结 调用阿里通义千问大语言模型API-小白新手教程-python 1.文本切片 在构建知识库的过程中文本切片是一项关键步骤其目的在于将大型文档分解成更小、更易于管理的单元、提升检索效率 使用LangChian库进行文本切分实现代码如下之后对关键代码进行详细介和API函数的参数介绍。
from langchain_community.document_loaders import UnstructuredFileLoader
# 旧版用法
# from langchain.document_loaders import UnstructuredFileLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitter# 导入文本
loader UnstructuredFileLoader(test.txt)
# 将文本转成 Document 对象
data loader.load()
print(fdocuments:{len(data)})# 初始化加载器
text_splitter RecursiveCharacterTextSplitter(chunk_size100, chunk_overlap0)
# 切割加载的 document
split_docs text_splitter.split_documents(data)
print(split_docs size:,len(split_docs))
print(split_docs)langchain_community.document_loaders 官网文档地址https://python.langchain.com/docs/modules/data_connection/document_loaders
UnstructuredFileLoader主要用于加载文件中未结构化的文本用于对未处理的文件进行一些预处理编码识别格式规范化等确保文本数据识别接下来的预处理该函数可以用于读取txt文件不能处理csv格式文件 csv格式文件请使用langchain_community.document_loaders.csv_loader加载
# 加载文档做处理文档的准备工作
loader UnstructuredFileLoader(test.txt)
# 调用load发开始进行预处理的过程
data loader.load()langchain.text_splitter.RecursiveCharacterTextSplitter
RecursiveCharacterTextSplitter将使用UnstructuredFileLoader加载之后的样本进行切分利于对长文本的精细化处理。
其中的两个主要参数chunk_size和chunk_overlap的作用如下
chunk_size切割的最长长度该长度的单位是字符不是token长度 chunk_overlap切割的重叠长度
以上两个参数均没有默认值需要手动设置
# 初始化加载器
text_splitter RecursiveCharacterTextSplitter(chunk_size100, chunk_overlap0)
# 切割加载的 document
split_docs text_splitter.split_documents(data)2.读取本地Embedding模型
考虑到使用在线OpenAI 的Embedding模型消耗的Token过高决定使用HuggingFaceEmbeddings加载离线的Embedding模型代码如下。
from langchain_community.embeddings import HuggingFaceEmbeddingsmodel_name rbce-embedding-vase_v1
model_kwargs {device: cpu}
encode_kwargs {normalize_embeddings: False}
hf HuggingFaceEmbeddings(model_namemodel_name,model_kwargsmodel_kwargs,encode_kwargsencode_kwargs
) 其中model_name指代的不是模型名称是包含训练好的模型在内的配置文件夹名称在配置文件夹下面包含各类配置文件且目前需要使用官方支持的模型如果官方的不支持该模型虽然在指定路径下存在着模型文件pytorch_model.bin,会出现以下警告信息虽然程序没有报错但是其没有成功加载模型会提示找不到模型文件然后用平均策略创造了一个新的模型。还有可能出现找不到配置文件等错误后续评估不同Embedding模型的效果。
No sentence-transformers model found with name ernie-3.0-xbase-zh. Creating a new one with MEAN pooling. 在可用其中使用最多的是bce-embedding-vase_v1模型其是有道公司发布的一个embedding模型基于pytorch框架编写支持对中文和英文生成嵌入向量链接网址如下下载文件内容需要注册HuggingFace账号。
网址https://huggingface.co/maidalun1020 3. 保存向量数据库
使用langchain_community.vectorstores.Chroma保存知识向量库其保存的完整代码如下关键行解释在后。
官方文档地址https://api.python.langchain.com/en/latest/vectorstores/langchain_community.vectorstores.chroma.Chroma.html#
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
import sentence_transformers
from langchain_community.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter# 导入文本
loader UnstructuredFileLoader(test.txt)
data loader.load()# 文本切分
text_splitter RecursiveCharacterTextSplitter(chunk_size100, chunk_overlap0)
split_docs text_splitter.split_documents(data)model_name rbce-embedding-vase_v1
model_kwargs {device: cpu}
encode_kwargs {normalize_embeddings: False}
embeddings HuggingFaceEmbeddings(model_namemodel_name,model_kwargsmodel_kwargs,encode_kwargsencode_kwargs
)#保存向量数据库部分# 初始化数据库
db Chroma.from_documents(split_docs, embeddings,persist_directory./chroma/news_test)
# 持久化
db.persist()
# 对数据进行加载
db Chroma(persist_directory./chroma/news_test, embedding_functionembeddings)
初始化数据库
使用Chroma.from_documents来初始化也就生成一个词向量数据库他对原始文档中的数据进行处理并通过模型映射成向量 ,其中split_docs为切分之后的文本embeddings为初始化之后的模型
db Chroma.from_documents(split_docs, embeddings,persist_directory./chroma/news_test)持久化
在实例化了一个用于初始化向量数据库的类之后需要调用persist函数对其进行保存之后再使用的时候加载之前初始化得到的向量数据库即可不需要重新初始化也就是通过模型生成向量数据库。
db.persist()对数据进行加载
persist_directory该变量为初始化数据库中指定的路径embedding_function表示使用的embedding模型如果不对已经生成的向量数据库添加新的文档则不需要指定。
db Chroma(persist_directory./chroma/news_test, embedding_functionembeddings)4.检索数据库中的相似样本
在使用大语言模型对数据库中的内容进行总结归纳之前需要去搜被切分的文本中哪些文本于问题相似然后将搜索到的相似的样本和问题发给大模型大模型在根据相似样本和问题得到总结。在代码中使用到的是similarity_search其作用是需要对搜索到的相似文本进行输出的时候采用。
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
import IPython
import sentence_transformers
from langchain_community.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain_community.llms import Tongyimodel_name rbce-embedding-vase_v1
model_kwargs {device: cpu}
encode_kwargs {normalize_embeddings: False}
embeddings HuggingFaceEmbeddings(model_namemodel_name,model_kwargsmodel_kwargs,encode_kwargsencode_kwargs
)db Chroma(persist_directory./chroma/news_test, embedding_functionembeddings)
question 浩浩的科研笔记的原力等级
# 寻找四个相似的样本
similarDocs db.similarity_search(question,k4)
print(similarDocs)5.使用通义千问总结归纳
在使用LangChain的过程中使用langchain.chains.RetrievalQA对从向量数据库中检索出来的类似样本进行总结归纳。自建的知识库文本如下
CSDN中浩浩的科研笔记博客的作者是陈浩博客的地址为 www.chen-hao.blog.csdn.net。
其原力等级为5级在其学习评价中其技术能力超过了99.6%的同码龄作者且超过了97.9%的研究生用户。
该博客中包含了单片机深度学习数学建模优化方法等相关的博客信息其中访问量最多的博客是《Arduino 让小车走实现的秘密 增量式PID 直流减速编码电机》。
其个人能力主要分布在Python和Pytorch方面其中python相对最为擅长希望可以早日成为博客专家。 提问问题
浩浩的科研笔记的原力等级是多少 代码实现
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain_community.llms import Tongyimodel_name rbce-embedding-vase_v1
model_kwargs {device: cpu}
encode_kwargs {normalize_embeddings: False}
embeddings HuggingFaceEmbeddings(model_namemodel_name,model_kwargsmodel_kwargs,encode_kwargsencode_kwargs
)db Chroma(persist_directory./chroma/news_test, embedding_functionembeddings)retriever db.as_retriever()
qa RetrievalQA.from_chain_type(llmTongyi(), retrieverretriever)query 浩浩的科研笔记的原力等级是多少
print(qa.run(query))retriever db.as_retriever()创建一个检索器其作用是在数据库中于问题相似的样本片段默认搜索的样本为4其和配置详细参数参考官方文档.
文档地址为 https://api.python.langchain.com/en/latest/vectorstores/langchain_community.vectorstores.chroma.Chroma.html#langchain_community.vectorstores.chroma.Chroma.as_retriever
6.额外补充 LangChain 使用通义模型进行流式输出
当前阶段使用LangChain对通义千问的支持性仍然不高官方文档的所有例程都是OpenAI模型所以想使用同义前文API进行多轮对话或者流式输出等都有各种各样的BUG其中我找到了使用流式输出的解决办法但是依旧需要对按照好的库文件进行更改。
这里是将官方的流式输出代码换成Tongyi模型官方代码里使用的模型是OpenAI,
from langchain.prompts import ChatPromptTemplate
from langchain_community.llms import Tongyillm Tongyi(streamingTrue, max_tokens2048)prompt ChatPromptTemplate.from_messages([(system, 你是一个专业的AI助手。), (human, {query})]
)
llm_chain prompt | llmret llm_chain.stream({query: 你是谁})
for token in ret:print(token, end, flushTrue)
print() 在使用LangChain中的Tongyi模型进行流式输出时按照官方的代码直接运行会报一个类型错误
TypeError: Additional kwargs key output_tokens already exists in left dict and value has unsupported type class int. 其指向的错误文件路径如下
C:\Users\Chenhao\AppData\Local\Programs\Python\Python39\lib\site-packages\langchain_core\utils\_merge.py 点开文件里面内容如下,其主要作用合并两个字典然后处理字典中键值冲突的问题之后将该BUG在stakflow上提问得到了回复根据测试直接让merge_dicts返回该字典即{input_tokens: 530, output_tokens: 2, total_tokens: 532}该BUG目前还没有修复。
from __future__ import annotationsfrom typing import Any, Dictdef merge_dicts(left: Dict[str, Any], right: Dict[str, Any]) - Dict[str, Any]:Merge two dicts, handling specific scenarios where a key exists in bothdictionaries but has a value of None in left. In such cases, the method uses thevalue from right for that key in the merged dictionary.Example:If left {function_call: {arguments: None}} andright {function_call: {arguments: {\n}}then, after merging, for the key function_call,the value from right is used,resulting in merged {function_call: {arguments: {\n}}.merged left.copy()for k, v in right.items():if k not in merged:merged[k] velif merged[k] is None and v:merged[k] velif v is None:continueelif merged[k] v:continueelif type(merged[k]) ! type(v):raise TypeError(fadditional_kwargs[{k}] already exists in this message, but with a different type.)elif isinstance(merged[k], str):merged[k] velif isinstance(merged[k], dict):merged[k] merge_dicts(merged[k], v)elif isinstance(merged[k], list):merged[k] merged[k] velse:raise TypeError(fAdditional kwargs key {k} already exists in left dict and value has funsupported type {type(merged[k])}.)return merged
修改之后的文件如下,由于修改的是库文件中的代码所以会有确认提示在修改了之后在运行上流式输出的代码即可前提是已经申请成果且配置好了相关的API-KEY
from __future__ import annotationsfrom typing import Any, Dictdef merge_dicts(left: Dict[str, Any], right: Dict[str, Any]) - Dict[str, Any]:merged {input_tokens: 530, output_tokens: 2, total_tokens: 532}return merged7.目前发现的LangChain使用问题总结 LangChain对通义千问API的支持较弱难以使用LangChain实现多轮对话和流式输出所有的官网文档例程都是基于OpenAI LangChain在读取文件的时候时候不能保存特殊符号例如-在被加载近文本读取器的时候被识别为非法字符转换为\n LangChain使用Hungingface查找相同样本的时候使用的模型似乎需要官方的认可才可以且并不容易找到对应的支持模型的名单也就是需要自己尝试 LangChain只能读取CSV还有txt其他的需要先转成这两个格式无法直接输入World然后读取其内容和图片。