当前位置: 首页 > news >正文

Data Whale

构建RAG应用

将LLM接入Langchain

LangChain为基于LLM开发的自定义应用提供了高效的开发框架,内置多种大模型的接口

基于Langchain调用

LCEL (LangChain Expression Language)是一种新的语法

  • 提供异步的批处理的流处理的支持,使得代码快速的移植
  • 拥有后备措施,解决LLM格式输出问题
  • 增加了LLm并行,提高了效率
  • 内置了日志记录,使得代码变得复杂,有利于理解复杂的链条和代理的运行情况

构建检索问答链

将召回结构和query结合起来构建prompt,输入到大模型中进行问答

创建检索链

LCEL支持异步,流式,批处理等方式运行,使用LangSmith进行无缝跟踪

from langchain_core.runnables import RunnableLambda
def combine_docs(docs):return "\n\n".join(doc.page_content for doc in docs)combiner = RunnableLambda(combine_docs)
retrieval_chain = retriever | combinerretrieval_chain.invoke("南瓜书是什么?")

创建LLM

构建检索问答链

from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough, RunnableParallel
from langchain_core.output_parsers import StrOutputParsertemplate = """使用以下上下文来回答最后的问题。如果你不知道答案,就说你不知道,不要试图编造答
案。最多使用三句话。尽量使答案简明扼要。请你在回答的最后说“谢谢你的提问!”。
{context}
问题: {input}
"""
# 将template通过 PromptTemplate 转为可以在LCEL中使用的类型
prompt = PromptTemplate(template=template)qa_chain = (RunnableParallel({"context": retrieval_chain, "input": RunnablePassthrough()})| prompt| llm| StrOutputParser()
)

向检索链中添加聊天记录

问题:在构建应用程序的时候出现智能体不记得之前的交流的内容,解决方法,传递聊天记录

传递聊天记录:

将先前的对话嵌入到语言模型中,使其具有连续对话的能力。

from langchain_core.prompts import ChatPromptTemplate# 问答链的系统prompt
system_prompt = ("你是一个问答任务的助手。 ""请使用检索到的上下文片段回答这个问题。 ""如果你不知道答案就说不知道。 ""请使用简洁的话语回答用户。""\n\n""{context}"
)
# 制定prompt template
qa_prompt = ChatPromptTemplate([("system", system_prompt),("placeholder", "{chat_history}"),("human", "{input}"),]
)# 无历史记录
messages = qa_prompt.invoke({"input": "南瓜书是什么?","chat_history": [],"context": ""}
)
for message in messages.messages:print(message.content)
# 有历史记录
messages = qa_prompt.invoke({"input": "你可以介绍一下他吗?","chat_history": [("human", "西瓜书是什么?"),("ai", "西瓜书是指周志华老师的《机器学习》一书,是机器学习领域的经典入门教材之一。"),],"context": ""}
)
for message in messages.messages:print(message.content)

带有信息压缩的检索链

from langchain_core.runnables import RunnableBranch# 压缩问题的系统 prompt
condense_question_system_template = ("请根据聊天记录完善用户最新的问题,""如果用户最新的问题不需要完善则返回用户的问题。")
# 构造 压缩问题的 prompt template
condense_question_prompt = ChatPromptTemplate([("system", condense_question_system_template),("placeholder", "{chat_history}"),("human", "{input}"),])
# 构造检索文档的链
# RunnableBranch 会根据条件选择要运行的分支
retrieve_docs = RunnableBranch(# 分支 1: 若聊天记录中没有 chat_history 则直接使用用户问题查询向量数据库(lambda x: not x.get("chat_history", False), (lambda x: x["input"]) | retriever, ),# 分支 2 : 若聊天记录中有 chat_history 则先让 llm 根据聊天记录完善问题再查询向量数据库condense_question_prompt | llm | StrOutputParser() | retriever,
)

支持聊天记录的检索问答链

# 重新定义 combine_docs
def combine_docs(docs):return "\n\n".join(doc.page_content for doc in docs["context"]) # 将 docs 改为 docs["context"]
# 定义问答链
qa_chain = (RunnablePassthrough.assign(context=combine_docs) # 使用 combine_docs 函数整合 qa_prompt 中的 context| qa_prompt # 问答模板| llm| StrOutputParser() # 规定输出的格式为 str
)
# 定义带有历史记录的问答链
qa_history_chain = RunnablePassthrough.assign(context = (lambda x: x) | retrieve_docs # 将查询结果存为 content).assign(answer=qa_chain) # 将最终结果存为 answer

部署知识库助手

Streamlit可以在python中通过web界面演示机器学习模型,使用python接口快速实现演示目标

Streamlit检索简介

Streamlit 无需深入了解web开发,web框架,只需要编写普通的python板块。Streamlit提供了一组简单而强大的基础模块,用于构建数据应用程序:

  • st.write():这是最基本的模块之一,用于在应用程序中呈现文本、图像、表格等内容。

  • st.title()、st.header()、st.subheader():这些模块用于添加标题、子标题和分组标题,以组织应用程序的布局。

  • st.text()、st.markdown():用于添加文本内容,支持 Markdown 语法。

  • st.image():用于添加图像到应用程序中。

  • st.dataframe():用于呈现 Pandas 数据框。

  • st.table():用于呈现简单的数据表格。

  • st.pyplot()、st.altair_chart()、st.plotly_chart():用于呈现 Matplotlib、Altair 或 Plotly 绘制的图表。

  • st.selectbox()、st.multiselect()、st.slider()、st.text_input():用于添加交互式小部件,允许用户在应用程序中进行选择、输入或滑动操作。

  • st.button()、st.checkbox()、st.radio():用于添加按钮、复选框和单选按钮,以触发特定的操作。

http://www.xdnf.cn/news/599941.html

相关文章:

  • 今日打卡,Leetcode第四题:寻找两个正序数组的中位数,博主表示就会sorted
  • 飞书知识问答产品测评:让企业玩转AI
  • 外卖跑腿小程序评价系统框架搭建
  • 《算法导论(第4版)》阅读笔记:p115-p126
  • 机器人强化学习入门学习笔记(四)
  • 对Android中binder的理解
  • 海拔案例分享-实践活动报名测评小程序
  • SQL进阶之旅 Day 1:高效表设计与规范
  • 图解深度学习 - 机器学习简史
  • 交叉编译DirectFB,以及报错解决方法
  • Vue3+Vite+TypeScript项目中跨页多选表格的实现与应用
  • MCP协议:AI时代的“万能插座”,如何重塑互联网技术生态?
  • Linux的启动流程
  • 华为仓颉语言生成的程序的分发部署
  • Basic concepts for seismic source - Coulomb failure stress change
  • C++内存复制
  • (01)华为GaussDB((基于PostgreSQL))高斯数据库使用记录,dbeaver客户端配置高斯驱动,连接高斯数据库
  • 订单越来越到导致接口列表查询数据缓慢解决思路
  • 【结构体宏定义】C语言结构体与宏定义:传感器配置的巧妙结合
  • 高等数学-求导
  • 计算机组成体系结构
  • 数据库-数据处理
  • B2160 病人排队
  • 算法题(153):哈夫曼编码
  • CAD打印没有标注解决方法
  • vue2实现元素拖拽
  • Git实战演练,模拟日常使用,快速掌握命令
  • “轩辕杯“云盾砺剑 CTF挑战赛web方向题解
  • 【AI论文】VisualQuality-R1:通过强化学习进行推理诱导的图像质量评估
  • 【Java】异常的初步认识