青训营X豆包MarsCode 技术训练营 LangChain实战课

62 阅读3分钟

1. LangChain实战课

本节课内容:开发一套基于员工内部知识手册的 “Doc-QA” 系统,这个问答系统能够理解员工的问题,并基于最新的员工手册,给出精准的答案。

1.1 理论部分

整体框架:大模型(LLM)通过处理数据源(主要是PDF等非结构化数据),构建问答系统。 大致流程:

文档加载器把文档加载为LangChain可读取的形式
文本分割器把文档切割为文档块。
把文档块“嵌入”(为每个词分配数字列表)存储到向量数据库中,形成嵌入片。
在存储中检索文档块,找答案。
把合适的嵌入片传递给语言模型(LLM),生成回答。

1.2 代码实现

  • step1:用LangChain的document_loaders加载文档
  • step2:用LangChain的RecursiveCharacterTextSplitter分割文档
  • step3:通过 pip install qdrant-client安装 Qdrant 向量数据库,来存储嵌入
  • step4:把问题转换为向量,然后和向量数据库中的各个向量进行比较,提取最接近的信息。大小差异用欧式,语义差异用余弦。
  • step5:安装Flask包,创建Flask应用,用于与用户交互。

2. LangChain模型

模型的使用:

  • 输入提示
  • 调用模型
  • 输出解析

2.1 提示模板

提示模板存在的意义就是使模型更明确要完成的任务。提示模板可以把输入的内容结构化,这样就可以处理不同数据,比如:请生成一段描述{topic}的文本,要求生动且有趣; 创建并初始化提示模板时,需要通过from langchain.prompts import PromptTemplate来导入提示模板类。然后创建一个原始模板,原始模板里面如果有占位符,就可以动态的填充内容。然后通过上面导入的PromptTemplate类创建提示模板,例如你上面创建的原始模板叫template,那么你把原始模板转换成提示模板的语法就是prompt = PromptTemplate.from_template(template) 如果打印这个提示模板,打印结果一般会显示模板的内容和解析出的输入变量。输出有可能会如下: PromptTemplate(input_variables=['price', 'flower_name'], template='您是一位专业的鲜花店文案撰写员。\n\n对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?', template_format='f-string', validate_template=True)

其中,input_variables: 列出模板中使用的占位符,即 ['price', 'flower_name'],表示需要传入 priceflower_name 两个变量。

template: 显示原始模板的内容,包括换行和占位符 {price}{flower_name}

template_format: 指示模板的格式类型,这里是 f-string,一种格式化字符串的格式,可以让你在字符串中直接嵌入变量或表达式。

validate_template: 表示是否启用了模板的验证功能,True 表示启用了验证以确保模板格式有效。

当然,不同编辑环境输出内容可能会有所不同。

2.2 语言模型

  • 大语言模型(LLM):就是textmodel
  • 聊天模型chat model:ChatGPT这种
  • 文本嵌入模型:把文档块存入向量数据库

2.3 输出解析

生成结构化数据,这个过程包括定义输出结构,然后通过StructuredOutputParser.from_response_schemas方法根据这个模板创建输出解析器,通过输出解析器获取输出格式说明,再把之前的提示模板和解析器说明整合成一个新的提示模板。此时输出的内容就会尽可能符合要求。

总结

通过langchain实战课和langchain模型的学习,我认识到了langchain框架在我们使用大模型时带来的便利。langchain不仅精简了构建问答系统的过程,使代码简洁,而且实现了模板管理,使得动态输入成为可能,也使得输出内容尽可能符合我们要求。