LangChain结合通义千问的自建知识库_langchain 通义千问(1)

文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


​ 其中`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]( )


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e6fd48014d2349b9b7cf79e49ccf4e65.png)


### 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_size=100, chunk_overlap=0)
split_docs = text_splitter.split_documents(data)

model_name = r"bce-embedding-vase_v1"
model_kwargs = {‘device’: ‘cpu’}
encode_kwargs = {‘normalize_embeddings’: False}
embeddings = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)

#保存向量数据库部分

初始化数据库

db = Chroma.from_documents(split_docs, embeddings,persist_directory=“./chroma/news_test”)

持久化

db.persist()

对数据进行加载

db = Chroma(persist_directory=“./chroma/news_test”, embedding_function=embeddings)


* 初始化数据库


​ 使用`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_function=embeddings)


### 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 Tongyi

model_name = r"bce-embedding-vase_v1"
model_kwargs = {‘device’: ‘cpu’}
encode_kwargs = {‘normalize_embeddings’: False}
embeddings = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)

db = Chroma(persist_directory=“./chroma/news_test”, embedding_function=embeddings)
question = “浩浩的科研笔记的原力等级”

寻找四个相似的样本

similarDocs = db.similarity_search(question,k=4)
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 Tongyi

model_name = r"bce-embedding-vase_v1"
model_kwargs = {‘device’: ‘cpu’}
encode_kwargs = {‘normalize_embeddings’: False}
embeddings = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)

db = Chroma(persist_directory=“./chroma/news_test”, embedding_function=embeddings)

retriever = db.as_retriever()
qa = RetrievalQA.from_chain_type(llm=Tongyi(), retriever=retriever)

query = “浩浩的科研笔记的原力等级是多少?”
print(qa.run(query))


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c361c2a9421a48d49ffc98b1198c5287.png)


* `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 Tongyi

llm = Tongyi(streaming=True, max_tokens=2048)

prompt = ChatPromptTemplate.from_messages(
[(“system”, “你是一个专业的AI助手。”), (“human”, “{query}”)]
)
llm_chain = prompt | llm

ret = llm_chain.stream({“query”: “你是谁?”})
for token in ret:
print(token, end=“”, flush=True)
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 annotations

from typing import Any, Dict

def merge_dicts(left: Dict[str, Any], right: Dict[str, Any]) -> Dict[str, Any]:
“”"Merge two dicts, handling specific scenarios where a key exists in both
dictionaries but has a value of None in ‘left’. In such cases, the method uses the
value from ‘right’ for that key in the merged dictionary.

Example:
If left = {“function_call”: {“arguments”: None}} and
right = {“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] = v
elif merged[k] is None and v:
merged[k] = v
elif v is None:
continue
elif merged[k] == v:
continue
elif type(merged[k]) != type(v):
raise TypeError(
f’additional_kwargs[“{k}”] already exists in this message,’
" but with a different type."
)
elif isinstance(merged[k], str):
merged[k] += v
elif isinstance(merged[k], dict):
merged[k] = merge_dicts(merged[k], v)
elif isinstance(merged[k], list):
merged[k] = merged[k] + v
else:
raise TypeError(
f"Additional kwargs key {k} already exists in left dict and value has "
f"unsupported type {type(merged[k])}."
)

return merged

​ 修改之后的文件如下,由于修改的是库文件中的代码,所以会有确认提示,在修改了之后在运行上流式输出的代码即可,前提是已经申请成果,且配置好了相关的`API-KEY`



from future import annotations

from typing import Any, Dict

def merge_dicts(left: Dict[str, Any], right: Dict[str, Any]) -> Dict[str, Any]:
merged = {‘input_tokens’: 530, ‘output_tokens’: 2, ‘total_tokens’: 532}
return merged


### 7.目前发现的LangChain使用问题总结


1. LangChain对通义千问API的支持较弱,难以使用LangChain实现多轮对话,和流式输出,所有的官网文档例程都是基于OpenAI
2. LangChain在读取文件的时候时候不能保存特殊符号例如`-`在被加载近文本读取器的时候被识别为非法字符转换为`\n`
3. LangChain使用Hungingface查找相同样本的时候,使用的模型似乎需要官方的认可才可以,且并不容易找到对应的支持模型的名单,也就是需要自己尝试
4. LangChain只能读取CSV还有txt,其他的需要先转成这两个格式,无法直接输入World然后读取其内容和图片。








### 一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



![](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)



### 二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。



![](https://img-blog.csdnimg.cn/img_convert/8c4513c1a906b72cbf93031e6781512b.png)



### 三、入门学习视频



我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。



![](https://img-blog.csdnimg.cn/afc935d834c5452090670f48eda180e0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP5aqb56eD56eD,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值