最近在学习Rag的过程中,发现大部分教程都是使用Chatgpt的API Key,对于国内用户来说也不够友好,于是我使用智谱AI免费的API Key实现了一个小demo(不追求效果,只是一个新手入门的简单示例)。

import bs4
from langchain import hub
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.vectorstores import Chroma
from openai import OpenAI 
from sentence_transformers import SentenceTransformer
from typing import List
from langchain_core.embeddings import Embeddings

class HuggingFaceEmbeddings(Embeddings):
    def __init__(self, model_path: str):
        self.model = SentenceTransformer(model_path)

    def embed_documents(self, texts: List[str]) -> List[List[float]]:
        return self.model.encode(texts).tolist()

    def embed_query(self, text: str) -> List[float]:
        return self.model.encode([text])[0].tolist()


# 加载pdf,这里随便换一个pdf就行,最好英文的
loader = PyPDFLoader(r"E:\LLM\RAG_langchain-main\data\baichuan.pdf")
docs = loader.load()

# 切割文档,我这里只把pdf第一页的内容切分了,用于后续的向量数据库构建(主要是想节省时间)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
splits = text_splitter.split_documents(docs[:1])

print(splits)

# 初始化自定义嵌入模型,直接去HuggingFace下载模型就行了
model_path = "E:\HuggingFace\sentence-transformers\sentence-t5-large"
embedding = HuggingFaceEmbeddings(model_path)

# Embed
vectorstore = Chroma.from_documents(
    documents=splits, 
    embedding=embedding,
)

retriever = vectorstore.as_retriever()


client = OpenAI(
    api_key="######################################",  # 替换为你自己的智谱API密钥
    base_url="https://open.bigmodel.cn/api/paas/v4/"   # 这里的url不用改
)

# 用户原始查询
user_query = "How many parameters does the Baichuan2 model have?​"

# 通过检索器获取相关上下文
retrieved_docs = retriever.get_relevant_documents(user_query)
context = "\n".join([splits.page_content for splits in retrieved_docs[:1]])  


# 构造增强后的prompt
enhanced_prompt = f"""
问题是:{user_query}\n
基于以下回答问题:{context}
"""

print(f"enhanced_prompt:\n{enhanced_prompt}")

# 生成请求
completion = client.chat.completions.create(
    model="GLM-4-Flash-250414",
    messages=[    
        {
            "role": "system", 
            "content": "你是一个大模型专家。请根据提供的内容回答问题。"
        },
        {
            "role": "user",
            "content": enhanced_prompt
        }
    ],
    top_p=0.7,
    temperature=0.9,
    max_tokens=1000
)

print("回答是:")
print(completion.choices[0].message.content)

对于不知道怎么得到API Key的可以看看这篇文章,非常简单,而且有免费的API Key(这里我强烈建议大家看一下智谱的官网,如何使用api,有哪些模型可以使用,怎么使用等等,技术文档里面写的非常清晰明了)。

智谱api接口调用(Java调用文本模型,文生图,文生视,代码助手等)-CSDN博客

对于文档切分,embdding等等不清楚的朋友可以看看下面的视频

https://www.bilibili.com/video/BV1da4y1r7Wz?vd_source=c5c396652c0c83be15efe54e0c348c90

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐