【RAG 项目实战 05】重构:封装代码

打印 上一主题 下一主题

主题 778|帖子 778|积分 2334

【RAG 项目实战 05】重构:封装代码


NLP Github 项目:


  • NLP 项目实践:fasterai/nlp-project-practice
    介绍:该堆栈围绕着 NLP 任务模型的计划、训练、优化、摆设和应用,分享大模型算法工程师的日常工作和实战履历
  • AI 藏经阁:https://gitee.com/fasterai/ai-e-book
    介绍:该堆栈主要分享了数百本 AI 领域电子书
  • AI 算法面经:fasterai/nlp-interview-handbook#面经
    介绍:该堆栈一网打尽互联网大厂NLP算法面经,算法求职必备神器
  • NLP 剑指Offer:https://gitee.com/fasterai/nlp-interview-handbook
    介绍:该堆栈汇总了 NLP 算法工程师高频面题



  • 新增 common.py
  • 改造 llm_util.py
  • 新增 chain_util.py
  • 新增 msg_util.py
  • 改造 app.py
新增 common.py
  1. # @Author:青松
  2. # 公众号:FasterAI
  3. # Python, version 3.10.14
  4. # Pytorch, version 2.3.0
  5. # Chainlit, version 1.1.301
  6. class Constants:
  7.     MODEL_NAME = {
  8.         'QianFan': 'QianFan'
  9.     }
复制代码
改造 llm_util.py
  1. # @Author:青松
  2. # 公众号:FasterAI
  3. # Python, version 3.10.14
  4. # Pytorch, version 2.3.0
  5. # Chainlit, version 1.1.301
  6. from common import Constants
  7. from langchain_community.chat_models import QianfanChatEndpoint
  8. # 加载环境变量
  9. from dotenv import load_dotenv
  10. load_dotenv()
  11. def get_llm(model_name):
  12.     llm = None
  13.     try:
  14.         if model_name == Constants.MODEL_NAME['QianFan']:
  15.             llm = QianfanChatEndpoint(
  16.                 streaming=True,
  17.                 model="ERNIE-Speed-8K",
  18.             )
  19.     except:
  20.         llm = get_default_llm()
  21.     finally:
  22.         if llm is None:
  23.             llm = get_default_llm()
  24.         return llm
  25. def get_default_llm():
  26.     default_llm = QianfanChatEndpoint(
  27.         streaming=True,
  28.         model="ERNIE-Speed-8K",
  29.     )
  30.     return default_llm
复制代码
新增 chain_util.py
  1. # @Author:青松
  2. # 公众号:FasterAI
  3. # Python, version 3.10.14
  4. # Pytorch, version 2.3.0
  5. # Chainlit, version 1.1.301
  6. from langchain.prompts import ChatPromptTemplate
  7. from langchain_core.output_parsers import StrOutputParser
  8. from langchain_core.prompts import MessagesPlaceholder
  9. from langchain_core.runnables import RunnablePassthrough
  10. from langchain_core.vectorstores import VectorStore
  11. def get_chat_chain(llm):
  12.     # 提示模板中添加 chat_history
  13.     prompt = ChatPromptTemplate.from_messages(
  14.         [
  15.             (
  16.                 "system",
  17.                 "你是一个中国古诗词专家,能准确的一字不差的背诵很多古诗词,请用你最大的能力来回答用户的问题。",
  18.             ),
  19.             MessagesPlaceholder("chat_history"),
  20.             ("human", "{question}"),
  21.         ]
  22.     )
  23.    
  24.     chat_chain = prompt | llm | StrOutputParser()
  25.    
  26.     return chat_chain
复制代码
新增 msg_util.py
  1. # @Author:青松
  2. # 公众号:FasterAI
  3. # Python, version 3.10.14
  4. # Pytorch, version 2.3.0
  5. # Chainlit, version 1.1.301
  6. import chainlit as cl
  7. from langchain_core.chat_history import BaseChatMessageHistory
  8. from langchain_core.runnables import RunnableConfig
  9. from langchain_core.runnables.history import RunnableWithMessageHistory
  10. from langchain_community.chat_message_histories import ChatMessageHistory
  11. # 存储对话历史
  12. store = {}
  13. def get_session_history(session_id: str) -> BaseChatMessageHistory:
  14.     if session_id not in store:
  15.         store[session_id] = ChatMessageHistory()
  16.     return store[session_id]
  17. async def send_welcome_msg():
  18.     # todo: 添加 FasterAI 知识星球图片以及 FastAI 知识库地址
  19.     image = cl.Image(url="https://qingsong-1257401904.cos.ap-nanjing.myqcloud.com/wecaht.png")
  20.     # 发送一个图片
  21.     await cl.Message(
  22.         content="**青松** 邀你关注 **FasterAI**, 让每个人的 AI 学习之路走的更容易些!立刻扫码开启 AI 学习、面试快车道 **(^_^)** ",
  23.         elements=[image],
  24.     ).send()
  25. async def response_with_history_by_astream(message: cl.Message, chain, session_id):
  26.     # 用 RunnableWithMessageHistory 包装 Chain 添加对话历史能力
  27.     runnable_with_history = RunnableWithMessageHistory(
  28.         chain,
  29.         get_session_history,
  30.         input_messages_key="question",
  31.         history_messages_key="chat_history",
  32.     )
  33.     msg = cl.Message(content="")
  34.     # 配置中使用 session_id 进行大模型交互
  35.     async for chunk in runnable_with_history.astream(
  36.             {"question": message.content},
  37.             config=RunnableConfig(configurable={"session_id": session_id},
  38.                                   callbacks=[cl.LangchainCallbackHandler()])
  39.     ):
  40.         await msg.stream_token(chunk)
  41.     await msg.send()
复制代码
改造 app.py
  1. # @Author:青松
  2. # 公众号:FasterAI
  3. # Python, version 3.10.14
  4. # Pytorch, version 2.3.0
  5. # Chainlit, version 1.1.301
  6. import chainlit as cl
  7. from common import Constants
  8. import chain_util
  9. import llm_util
  10. import msg_util
  11. # 获取大模型实例
  12. llm = llm_util.get_llm(Constants.MODEL_NAME['QianFan'])
  13. @cl.password_auth_callback
  14. def auth_callback(username: str, password: str):
  15.     """ 持久化客户端聊天历史代码,不需要请删除 """
  16.     if (username, password) == ("admin", "admin"):
  17.         return cl.User(
  18.             identifier="admin", metadata={"role": "admin", "provider": "credentials"}
  19.         )
  20.     else:
  21.         return None
  22. @cl.on_chat_start
  23. async def on_chat_start():
  24.     """ 监听会话开始事件 """
  25.     # 添加 session_id
  26.     cl.user_session.set('session_id', 'abc2')
  27.     # 发送欢迎信息
  28.     await msg_util.send_welcome_msg()
  29.     # 初始化链
  30.     init_chains()
  31. @cl.on_message
  32. async def on_message(message: cl.Message):
  33.     """ 监听用户消息事件 """
  34.     # 获得对话链
  35.     chat_chain = cl.user_session.get("chat_chain")
  36.     # 获取当前的 session_id
  37.     session_id = cl.user_session.get("session_id")
  38.     # 使用对话历史通过 astream 的方式响应用户消息
  39.     await msg_util.response_with_history_by_astream(message, chat_chain, session_id)
  40. def init_chains():
  41.     """ 初始化系统中的链 """
  42.     # 对话链
  43.     chat_chain = chain_util.get_chat_chain(llm)
  44.     cl.user_session.set("chat_chain", chat_chain)
复制代码

【动手学 RAG】系列文章:


  • 【RAG 项目实战 01】在 LangChain 中集成 Chainlit
  • 【RAG 项目实战 02】Chainlit 长期化对话汗青
  • 【RAG 项目实战 03】优雅的管理环境变量
  • 【RAG 项目实战 04】添加多轮对话能力
  • 【RAG 项目实战 05】重构:封装代码
  • 【RAG 项目实战 06】使用 LangChain 联合 Chainlit 实现文档问答
  • 【RAG 项目实战 07】更换 ConversationalRetrievalChain(单轮问答)
  • 【RAG 项目实战 08】为 RAG 添加汗青对话能力

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表